segment anything model

Comment faire de la segmentation d’images avec Python ?

La segmentation d’images est un enjeu crucial dans le domaine de la vision par ordinateur, permettant une compréhension plus fine des éléments qui constituent une image.

Dans cet article, je vous propose de découvrir comment faire de la segmentation d’images avec Python en utilisant Segment Anything Model (SAM), un modèle de développé par Meta.

Alors que l’actualité technologique est dominée par les modèles d’intelligence artificielle générative tels que ChatGPT, il est important de ne pas négliger le domaine de la vision par ordinateur, qui reste un sujet très actif et riche en innovations.

Et je ne dis pas ça uniquement en tant que computer vision engineer !

La vision par ordinateur englobe un large éventail d’applications et de techniques permettant de traiter et d’analyser des images pour en extraire des informations pertinentes.

Ces avancées trouvent des applications dans divers domaines, tels que la santé, la sécurité, l’automatisation industrielle, la robotique et bien d’autres.

La segmentation d’images, en particulier, est une technique essentielle pour améliorer la compréhension de notre environnement visuel, en détectant et en classifiant les différents objets et éléments présents dans une image.

Ainsi, même à l’ère des modèles génératifs, la vision par ordinateur continue d’occuper une place de choix dans le paysage de l’IA et du traitement de l’information visuelle.

Comment fonctionne la segmentation d’images ?

La segmentation d’images est un processus qui consiste à diviser une image en plusieurs régions ou segments, qui partagent des caractéristiques similaires, dans le but d’extraire des informations pertinentes et de simplifier l’analyse de l’image.

En pratique, faire de la segmentation d’image revient mathématiquement à faire de la classification ou du clustering sur les pixels de l’image.

Il existe différents types de segmentations :

  • Segmentation basée sur la couleur : Cette méthode utilise les informations de couleur pour séparer les différents objets ou régions d’une image. Les pixels ayant des couleurs similaires sont regroupés ensemble.
  • Segmentation basée sur la texture : Cette méthode utilise les informations de texture pour identifier les régions dans une image. Les textures sont analysées à l’aide de diverses techniques, comme les matrices de co-occurrence, les filtres de Gabor, ou les descripteurs de texture locaux.
  • Segmentation basée sur l’intensité : Cette méthode segmente une image en fonction des variations d’intensité ou de niveaux de gris. Les contours des objets sont souvent identifiés par la détection des gradients d’intensité ou par la détection des points de rupture dans l’histogramme de l’image.
  • Segmentation basée sur la forme : Cette approche utilise les informations de forme pour séparer les objets ou les régions d’une image. Des méthodes de reconnaissance de formes, telles que les descripteurs de Fourier ou les moments invariants, sont souvent utilisées.
  • Segmentation sémantique : Cette méthode vise à attribuer une étiquette sémantique à chaque pixel de l’image, pour classer les objets ou les régions en fonction de leur signification dans le monde réel.
  • Segmentation par régions : Cette approche consiste à regrouper les pixels voisins ayant des caractéristiques similaires, pour former des régions homogènes. Les algorithmes courants incluent la croissance de région, la fusion de région, ou la segmentation par eau-forte.
  • Segmentation par contours : Cette méthode se concentre sur la détection des contours des objets ou des régions dans une image. Les techniques courantes incluent la détection de Canny, la transformée de Hough ou la détection de contours actifs (snakes).
  • Segmentation par deep learning : Ces dernières années, les réseaux de neurones profonds, tels que les réseaux de neurones convolutifs (CNN) et les réseaux de neurones récurrents (RNN), ont été largement utilisés pour la segmentation d’images. Les approches courantes incluent la segmentation sémantique avec les réseaux entièrement convolutifs (FCN), la segmentation par instance avec les réseaux Mask R-CNN et la segmentation d’objets avec les réseaux U-Net.

Comment fonctionne le modèle SAM : Segment Anything Model ?

Le modèle de référence pour la segmentation d’images est Segment Anything Model. Proposé par Meta en Avril 2023, il permet, comme son nom l’indique, de faire la segmentation de tous les objets présents dans une image.

La puissance de cet outil, est qu’il a compris de façon générale la notion d’objet, il peut donc faire de la généralisation zero-shot, en d’autres termes il est capable de détecter un objet même lorsqu’il ne l’a jamais vu dans son dataset d’entraînement.

Segmentation d'images en utilisant SAM et Python

Le modèle utilise un réseau de neurones convolutifs (CNN) pré-entraîné pour la classification d’images et une approche appelée « zero-shot segmentation ». L’architecture du modèle est basée sur dees travaux antérieurs de Meta AI, tels que MaskFormer et ViT-Mixer.

La segmentation est effectuée en deux étapes : d’abord, le modèle génère un masque initial pour chaque objet, puis il affine ce masque en utilisant des informations de contexte et de forme.

L’objectif principal de ce modèle est de réduire la dépendance à des jeux de données de segmentation annotées spécifiques à chaque domaine, qui sont coûteux et chronophages.

SAM a été entraîné sur une base de données open source de 11 million d’images et évalué en utilisant plusieurs jeux de données de segmentation d’images standard, tels que COCO, ADE20K et PASCAL VOC et d’après Meta il surpasse les modèles concurrents en termes de précision et de polyvalence.

Faire de la segmentation d’images avec Python

Les codes qui ont été produits par Meta pour SAM sont complètements open-source, ce qui permet d’utiliser le modèle facilement depuis Python.

Je propose d’utiliser Google colab pour ça, pour avoir un GPU et accélérer le traitement de l’image.

On commence par cloner le projet SAM sur le répertoire de travail :

!git clone 'https://github.com/facebookresearch/segment-anything.git'

Si vous n’êtes pas dans un notebook vous pouvez retirer le « ! » et lancer les lignes sur votre terminal.

On va ensuite entrer à l’intérieur du dossier cloné :

%cd segment-anything

On doit encore installer les poids du modèle qui ne sont pas dans le repo github :

!wget -q https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth

On charge le modèle et on l’initialise :

import torch

DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
MODEL_TYPE = "vit_h"


from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor

CHECKPOINT_PATH = "./sam_vit_h_4b8939.pth"
sam = sam_model_registry[MODEL_TYPE](checkpoint=CHECKPOINT_PATH).to(device=DEVICE)

On peut maintenant lancer la segmentation sur une image de test. Celle que j’ai choisi s’appelle « sample.jpg »:

mask_generator = SamAutomaticMaskGenerator(sam)
IMAGE_PATH = "./sample.jpg"

Pour la visualisation du résultat on va utiliser la librairie Supervision développée par Roboflow. On commence par l’installer :

!pip install supervision

On lit l’image avec OpenCV et on la converti en RGB, puis on génère les masques grâce à SAM :

import cv2
import supervision as sv

image_bgr = cv2.imread(IMAGE_PATH)
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)

sam_result = mask_generator.generate(image_rgb)

Enfin, la visualisation du résultat :

mask_annotator = sv.MaskAnnotator()

detections = sv.Detections.from_sam(sam_result=sam_result)

annotated_image = mask_annotator.annotate(scene=image_bgr.copy(), detections=detections)

sv.plot_images_grid(
    images=[image_bgr, annotated_image],
    grid_size=(1, 2),
    titles=['source image', 'segmented image']
)

Et voilà le travail :

Exemple de segmentation d'images en utilisant SAM et Python