Segmentation d’images avec SAM 2 - Guide ultime đź“·

Graphique

Introduction

Dans ce guide complet, nous allons explorer comment mettre en Ĺ“uvre la segmentation d’images Ă  l’aide du modèle Segment Anything Model (SAM) version 2. Cette technologie de pointe nous permet de segmenter n’importe quel objet dans une image sans avoir besoin de donnĂ©es d’apprentissage extensives ou de configurations compliquĂ©es. Ă€ la fin de ce tutoriel, vous disposerez d’un pipeline robuste pour effectuer des tâches de segmentation d’images prĂ©cises et efficaces.

Conditions préalables

  • Python 3.10+
  • torch version >=2.0.1
  • transformers version >=4.26.0
  • matplotlib
  • opencv-python

📺 Regarder : Les réseaux de neurones expliqués

Vidéo par 3Blue1Brown

Installez les packages requis avec :

pip install torch==2.0.1 transformers==4.26.0 matplotlib opencv-python

Étape 1 : Configuration du projet

CrĂ©ez d’abord un nouveau rĂ©pertoire pour votre projet et initialisez-le en tant que package Python si nĂ©cessaire.

Dans ce rĂ©pertoire, configurez l’environnement en crĂ©ant les fichiers suivants :

  • requirements.txt : Liste des packages requis.
  • setup.py (si vous prĂ©voyez de distribuer votre code).

Ajoutez le contenu suivant Ă  votre requirements.txt :

torch>=2.0.1
transformers>=4.26.0
matplotlib
opencv-python

Puis, dans votre terminal ou invite de commandes, accédez au répertoire de votre projet et exécutez :

pip install -r requirements.txt

Étape 2 : Mise en œuvre centrale

La partie centrale de notre mise en Ĺ“uvre consiste Ă  intĂ©grer SAM dans un pipeline de segmentation d’images de base. Voici un exemple complet :

import torch
from transformers import SamPredictor, sam_model_registry
from PIL import Image
import matplotlib.pyplot as plt
import cv2

def fonction_principale():
    # Définir le type de modèle et le chemin vers le point de contrôle
    model_type = "vit_h"
    checkpoint_path = "chemin/vers/sam_vit_h_4b8939.pth"

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    # Initialiser le prédicteur SAM
    predictor = SamPredictor(sam_model_registry[model_type].to(device))

    # Charger une image Ă  partir d'un fichier et la convertir en format RGB
    image_path = 'chemin/vers/image.jpg'
    img_pil = Image.open(image_path).convert("RGB")
    img_cv2 = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)

    # Définir l'image dans le prédicteur SAM pour la segmentation
    predictor.set_image(img_cv2)

    # Facultativement, fournir des points de prompt et des masques d'entrée ici.
    # Pour simplifier, supposons que nous avons quelques prompts prĂŞts.

    # Générer un masque à l'aide de prompts (le cas échéant)
    # Voici un exemple où vous pourriez spécifier les coordonnées d'un point sur l'image
    point_coords = [500, 375]  # Exemple de coordonnée pour la segmentation

    masks, _, _ = predictor.predict(point_coords=point_coords)

    # Visualiser le masque sur l'image d'origine
    plt.figure(figsize=(10, 10))
    plt.imshow(img_cv2)
    show_mask(masks[0], plt.gca(), random_color=True)  # Fonction pour visualiser le masque

def show_mask(mask, ax=None, random_color=False):
    """Visualise un masque binaire en le plaçant sur l'image d'origine."""
    if not ax:
        fig, ax = plt.subplots(1, figsize=(20, 20))

    if random_color:
        color = np.concatenate([np.random.random(3), np.array([.3, .3, .3])], axis=0)
    else:
        color = np.array([251/255, 49/255, 47/255, 0.6])

    h, w = mask.shape[-2:]
    mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
    ax.imshow(mask_image)

fonction_principale()

Étape 3 : Configuration

Personnalisez les variables model_type et checkpoint_path en fonction de la version de votre modèle SAM. Ajoutez Ă©galement le chemin vers votre image d’entrĂ©e et les coordonnĂ©es du point pour la segmentation.

# Exemple de personnalisation
model_type = "vit_b" # Passer à 'vit_h' ou à d'autres variantes SAM si vous utilisez un point de contrôle différent.
checkpoint_path = "chemin/vers/sam_vit_b_01ec64.pth"
image_path = 'votre/chemin/vers/image.jpg'
point_coords = [750, 325]  # Ajuster les coordonnées du point en fonction de votre image et de l'objet cible

Étape 4 : Exécution du code

Pour exécuter votre script de segmentation :

python main.py
# Sortie attendue :
# Une fenêtre matplotlib avec l'image d'entrée et le masque superposé.

Assurez-vous de remplacer main.py par le nom réel de votre fichier Python.

Étape 5 : Astuces avancées

Pour une performance optimale, envisagez de prĂ©-traiter les images pour qu’elles soient de tailles standard avant de les envoyer Ă  SAM. ExpĂ©rimentez Ă©galement avec diffĂ©rents points de prompt et des masques pour obtenir des rĂ©sultats de segmentation plus prĂ©cis. Enfin, integre