Segmentation d’images avec SAM 2.1 - Tout-en-un 🖼️

Introduction

La segmentation d’images est une tâche cruciale en vision par ordinateur, utilisĂ©e pour identifier et localiser des objets dans les images. Dans ce tutoriel, nous allons explorer comment utiliser le modèle Segment Anything Model (SAM) version 2.1 pour la segmentation d’images tout-en-un - une fonctionnalitĂ© puissante qui permet au modèle de segmenter n’importe quel objet sans nĂ©cessiter de donnĂ©es d’apprentissage supplĂ©mentaires ou de rĂ©glage fin. Cette capacitĂ© est particulièrement utile dans des applications diverses telles que l’imagerie mĂ©dicale, les vĂ©hicules autonomes et la rĂ©alitĂ© augmentĂ©e.

Prérequis

Pour commencer avec ce tutoriel, assurez-vous d’avoir installĂ© :

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

Vidéo par 3Blue1Brown

  • Python 3.10+
  • SAM version 2.1
  • torch
  • numpy >= 1.24.3
  • matplotlib

Commandes d’installation :

pip install sam-api torch numpy matplotlib

Étape 1 : Configuration du projet

Tout d’abord, clonez le rĂ©fĂ©rentiel contenant le modèle Segment Anything Model (SAM) et ses dĂ©pendances. Cela Setup les Ă©tapes :

  1. Clonez le référentiel SAM à partir de GitHub.
  2. Accédez au répertoire cloné.
  3. Installez les packages Python requis listés dans requirements.txt.
git clone https://github.com/facebookresearch/segment-anything.git
cd segment-anything
pip install -r requirements.txt

Étape 2 : Mise en œuvre centrale

Dans cette Ă©tape, nous allons charger un modèle prĂ©entraĂ®nĂ© Ă  partir de SAM et l’utiliser pour gĂ©nĂ©rer des masques pour les objets dans une image. Cela implique d’initialiser le modèle, de charger l’image d’entrĂ©e et d’appeler la fonction de segmentation.

import torch
from segment_anything import sam_model_registry, SamPredictor

# Initialisez le modèle SAM avec le chemin de point de contrôle approprié.
def initialiser_sam(chemin_point_de_contrĂ´le: str):
    """Initialisez le modèle SAM."""
    device = "cuda" if torch.cuda.is_available() else "cpu"
    sam = sam_model_registry["vit_h"](point_de_contrĂ´le=chemin_point_de_contrĂ´le)
    return SamPredictor(sam.to(device))

# Chargez une image et passez-la à travers le prédicteur SAM.
def générer_mask(chemin_image: str, prédicteur):
    """Générez un masque de segmentation en utilisant l'image chargée."""
    prédicteur.set_image(chemin_image)
    point_d'entrée = torch.tensor([256., 384.]) # Exemple d'emplacement du point
    étiquette_point = torch.tensor([1])
    masques, _, _ = prédicteur.prédire(coords_point=point_d'entrée, étiquettes_point=étiquette_point, sortie_multimask=False)

    return masques

def principale():
    chemin_point_de_contrôle = "./sam_vit_h_4b8939.pth"  # Chemin vers les poids du modèle SAM
    prédicteur = initialiser_sam(chemin_point_de_contrôle)
    chemin_image = "chemin/vers/votre/image.jpg"
    masque = générer_mask(chemin_image, prédicteur)

if __name__ == "__main__":
    principale()

Étape 3 : Configuration

La configuration de votre Setup SAM implique de dĂ©finir les chemins vers le point de contrĂ´le du modèle et de spĂ©cifier comment les images d’entrĂ©e sont traitĂ©es. Dans cet exemple, nous avons durci certains paramètres pour simplifier mais dans la pratique, ceux-ci seraient configurable via un fichier de configuration ou des arguments en ligne de commande.

# Exemple de configuration du chemin vers le point de contrĂ´le SAM.
CHEMIN_POINT_DE_CONTRÔLE_SAM = "./sam_vit_h_4b8939.pth"

def configurer_sam(chemin_point_de_contrĂ´le: str):
    prédicteur = initialiser_sam(CHEMIN_POINT_DE_CONTRÔLE_SAM)
    return prédicteur

def configurer_image_d'entrée(chemin_image: str):
    chemin_image = "chemin/vers/votre/image.jpg"
    prédicteur.set_image(chemin_image)

prédicteur = configurer_sam(CHEMIN_POINT_DE_CONTRÔLE_SAM)
configurer_image_d'entrée("chemin/vers/votre/image.jpg")

Étape 4 : Exécution du code

Pour exĂ©cuter le script, assurez-vous d’avoir un fichier de point de contrĂ´le SAM appropriĂ© dans votre rĂ©pertoire de travail et une image Ă  segmenter. ExĂ©cutez la fonction principale qui traitera l’image d’entrĂ©e et gĂ©nĂ©rera des masques de segmentation.

python main.py
# Sortie attendue :
# Un ensemble de masques binaires représentant différents segments dans l'image.

Étape 5 : Conseils avancés

Pour optimiser les performances,considerer utiliser une GPU si disponible pour des temps d’infĂ©rence plus rapides. De plus,expĂ©rimentez avec diffĂ©rents points et Ă©tiquettes d’entrĂ©e pour obtenir des rĂ©sultats de segmentation plus prĂ©cis.

  • Optimisation : Utilisez sortie_multimask=True lors de l’appel Ă  prĂ©dire() pour plusieurs segmentations d’un objet.
  • Meilleures pratiques : Utilisez la dernière version de SAM (2.1) et mettez rĂ©gulièrement Ă  jour vos dĂ©pendances.

Résultats

Ă€ l’issue, vous devriez voir un ensemble de masques binaires correspondant Ă  diffĂ©rents objets ou rĂ©gions dans votre image d’entrĂ©e. Ceux-ci peuvent ĂŞtre utilisĂ©s directement pour une analyse ultĂ©rieure telle que la dĂ©tection d’objets, le suivi ou la comprĂ©hension sĂ©mantique.

Aller plus loin

Conclusion

En utilisant le modèle Segment Anything Model (SAM) 2.1, vous pouvez effectuer une segmentation d’images tout-en-un sur une variĂ©tĂ© d’objets sans nĂ©cessiter de donnĂ©es d’apprentissage spĂ©cialisĂ©es ou de rĂ©glage fin. Ce tutoriel a fourni une vue d’ensemble de la façon de configurer votre environnement, de configurer le modèle et d’effectuer des tâches de segmentation de base.

Bonne codification !