Modèle Segment Anything (SAM)#
Bienvenue à la pointe de la segmentation d’images avec le modèle Segment Anything, ou SAM. Ce modèle révolutionnaire a changé la donne en introduisant la segmentation d’images guidée par invite avec des performances en temps réel, établissant ainsi de nouvelles normes dans ce domaine.
Introduction à SAM : le modèle Segment Anything#
Le modèle Segment Anything, ou SAM, est un modèle de segmentation d’images de pointe qui permet une segmentation guidée par invite, offrant une polyvalence inégalée pour les tâches d’analyse d’images. SAM est au cœur de l’initiative Segment Anything, un projet novateur qui introduit un nouveau modèle, une nouvelle tâche et un nouveau jeu de données pour la segmentation d’images.
La conception avancée de SAM lui permet de s’adapter à de nouvelles distributions d’images et à de nouvelles tâches sans connaissances préalables, une fonctionnalité appelée transfert zero-shot. Entraîné sur le vaste jeu de données SA-1B, qui contient plus d’un milliard de masques répartis sur 11 millions d’images soigneusement sélectionnées, SAM a affiché des performances zero-shot impressionnantes, dépassant souvent les résultats antérieurs obtenus avec une supervision complète.
Images d’exemple de SA-1B. Images du jeu de données avec des masques superposés provenant du nouveau jeu de données SA-1B. SA-1B contient 11 M d’images diversifiées, haute résolution, sous licence et respectueuses de la vie privée, ainsi que 1,1 Md de masques de segmentation de haute qualité. Ces masques ont été entièrement annotés automatiquement par SAM et, comme l’ont confirmé les évaluations humaines et de nombreuses expériences, ils sont de grande qualité et très diversifiés. Les images sont regroupées selon le nombre de masques par image à des fins de visualisation (il y a en moyenne ∼100 masques par image).
Fonctionnalités clés du modèle Segment Anything (SAM)#
- Tâche de segmentation guidée par invite : SAM a été conçu pour une tâche de segmentation guidée par invite, ce qui lui permet de générer des masques de segmentation valides à partir de n’importe quelle invite, comme des indices spatiaux ou textuels identifiant un objet.
- Architecture avancée : le modèle Segment Anything utilise un puissant encodeur d’images, un encodeur d’invites et un décodeur de masques léger. Cette architecture unique permet des invites flexibles, le calcul de masques en temps réel et la prise en compte des ambiguïtés dans les tâches de segmentation.
- Le jeu de données SA-1B : introduit par le projet Segment Anything, le jeu de données SA-1B contient plus d’un milliard de masques sur 11 millions d’images. En tant que plus grand jeu de données de segmentation à ce jour, il fournit à SAM une source de données d’entraînement vaste et diversifiée.
- Performances zero-shot : SAM affiche d’excellentes performances zero-shot sur diverses tâches de segmentation, ce qui en fait un outil prêt à l’emploi pour de nombreuses applications nécessitant très peu de prompt engineering.
Pour découvrir en détail le modèle Segment Anything et le jeu de données SA-1B, consulte le GitHub de Segment Anything et lis l’article de recherche Segment Anything.
SAM alimente la fonctionnalité d’annotation intelligente d’Ultralytics Platform, permettant de créer intelligemment des masques par clic pour annoter rapidement les jeux de données. Consulte le guide d’annotation pour plus de détails.
Modèles disponibles, tâches prises en charge et modes de fonctionnement#
Ce tableau présente les modèles disponibles avec leurs poids préentraînés spécifiques, les tâches qu’ils prennent en charge et leur compatibilité avec différents modes de fonctionnement tels que l’inférence, la validation, l’entraînement et l’exportation, indiquée par des emojis ✅ pour les modes pris en charge et des emojis ❌ pour ceux qui ne le sont pas.
| Type de modèle | Poids préentraînés | Tâches prises en charge | Entraînement | Validation | Inférence | Exportation |
|---|---|---|---|---|---|---|
| SAM de base | sam_b.pt | Segmentation d'instances | ❌ | ❌ | ✅ | ❌ |
| SAM large | sam_l.pt | Segmentation d'instances | ❌ | ❌ | ✅ | ❌ |
Comment utiliser SAM : polyvalence et puissance pour la segmentation d’images#
Le modèle Segment Anything peut être utilisé pour une multitude de tâches en aval qui vont au-delà de ses données d’entraînement. Cela inclut la détection des contours, la génération de propositions d’objets, la segmentation d’instances et la prédiction préliminaire de texte vers masque. Grâce au prompt engineering, SAM peut rapidement s’adapter à de nouvelles tâches et distributions de données en mode zero-shot, ce qui en fait un outil polyvalent et puissant pour tous tes besoins en segmentation d’images.
Exemple de prédiction avec SAM#
Segmenter l’image avec les invites fournies.
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Display model information (optional)
model.info()
# Run inference with bboxes prompt
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# Run inference with single point
results = model(points=[900, 370], labels=[1])
# Run inference with multiple points
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])
# Run inference with multiple points prompt per object
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Run inference with negative points prompt
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])Segmenter l’image entière.
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Display model information (optional)
model.info()
# Run inference
model("path/to/image.jpg")- La logique ici consiste à segmenter l’image entière si tu ne fournis aucune invite (bboxes/points/masques).
De cette manière, tu peux définir l’image une seule fois et exécuter plusieurs inférences avec des invites sans exécuter plusieurs fois l’encodeur d’images.
import cv2
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# Set image
predictor.set_image("ultralytics/assets/zidane.jpg") # set with image file
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg")) # set with np.ndarray
results = predictor(bboxes=[439, 437, 524, 709])
# Run inference with single point prompt
results = predictor(points=[900, 370], labels=[1])
# Run inference with multiple points prompt
results = predictor(points=[[400, 370], [900, 370]], labels=[1, 1])
# Run inference with negative points prompt
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
# Reset image
predictor.reset_image()Tout segmenter avec des arguments supplémentaires.
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# Segment with additional args
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64, min_mask_region_area=100)Tous les objets results renvoyés dans les exemples ci-dessus sont des objets Results qui permettent d’accéder facilement aux masques prédits et à l’image source.
- Pour connaître les autres arguments de
Segment everything, consulte la référencePredictor/generate.
Comparaison de SAM avec YOLO#
Nous comparons ici le modèle SAM-b de Meta avec les modèles de segmentation Ultralytics, notamment YOLO26n-seg :
| Modèle | Taille (Mo) | Paramètres (M) | Vitesse (CPU) (ms/im) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| MobileSAM | 40.7 | 10.1 | 23802 |
| FastSAM-s avec le backbone de YOLOv8 | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7,1 (52,8x plus petit) | 3,4 (27,6x en moins) | 24,8 (1682x plus rapide) |
| Ultralytics YOLO11n-seg | 6.2 (60.5x plus petit) | 2,9 (32,3x en moins) | 24.3 (1716x plus rapide) |
| Ultralytics YOLO26n-seg | 6,7 (56,0x plus petit) | 2.7 (34.7x moins) | 25,2 (1655x plus rapide) |
Cette comparaison met en évidence les différences considérables de taille et de vitesse entre les variantes de SAM et les modèles de segmentation YOLO. Bien que SAM offre des capacités uniques de segmentation automatique, les modèles YOLO, notamment YOLOv8n-seg, YOLO11n-seg et YOLO26n-seg, sont nettement plus petits, plus rapides et plus efficaces sur le plan des calculs.
Les vitesses de SAM sont mesurées avec PyTorch, celles de YOLO avec ONNX Runtime. Les tests ont été effectués sur un Apple M4 Air de 2025 doté de 16 Go de RAM, à l'aide de torch==2.10.0, ultralytics==8.4.31 et onnxruntime==1.24.4. Pour reproduire ce test :
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# Profile SAM-b, MobileSAM
for file in ["sam_b.pt", "mobile_sam.pt"]:
model = SAM(file)
model.info()
model(ASSETS)
# Profile FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# Profile YOLO models (ONNX)
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt", "yolo26n-seg.pt"]:
model = YOLO(file_name)
model.info()
onnx_path = model.export(format="onnx", dynamic=True, nms=False) # YOLO26 NMS-free head; no-op for YOLOv8/YOLO11
model = YOLO(onnx_path)
model(ASSETS)Annotation automatique : un moyen rapide de créer des jeux de données de segmentation#
L’annotation automatique est une fonctionnalité clé de SAM qui permet aux utilisateurs de générer un jeu de données de segmentation à l’aide d’un modèle de détection préentraîné. Cette fonctionnalité permet d’annoter rapidement et précisément un grand nombre d’images, sans devoir effectuer un étiquetage manuel chronophage.
Générer ton jeu de données de segmentation avec un modèle de détection#
Pour annoter automatiquement ton jeu de données avec le framework Ultralytics, utilise la fonction auto_annotate comme indiqué ci-dessous :
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")| Argument | Type | Valeur par défaut | Description |
|---|---|---|---|
data | str | requis | Chemin vers le répertoire contenant les images cibles à annoter ou à segmenter. |
det_model | str | 'yolo26x.pt' | Chemin du modèle de détection YOLO pour la détection initiale des objets. |
sam_model | str | 'sam_b.pt' | Chemin du modèle SAM pour la segmentation (prend en charge les poids SAM, SAM 2, MobileSAM et SAM 3). |
device | str | '' | Périphérique de calcul (par ex. « cuda:0 », « cpu » ou « » pour la détection automatique du périphérique). |
conf | float | 0.25 | Seuil de confiance de la détection YOLO pour filtrer les détections peu fiables. |
iou | float | 0.45 | Seuil IoU pour la suppression non maximale afin de filtrer les boîtes qui se chevauchent. |
imgsz | int | 640 | Taille d'entrée pour redimensionner les images (doit être un multiple de 32). |
max_det | int | 300 | Nombre maximal de détections par image pour optimiser l'utilisation de la mémoire. |
classes | list[int] | None | Liste des indices de classes à détecter (par ex. [0, 1] pour personne et vélo). |
output_dir | str | None | Répertoire d'enregistrement des annotations (par défaut : répertoire parent de <data>_auto_annotate_labels). |
La fonction auto_annotate prend le chemin vers tes images, ainsi que des arguments facultatifs permettant de spécifier les modèles de détection préentraîné et de segmentation SAM, le périphérique sur lequel exécuter les modèles et le répertoire de sortie où enregistrer les résultats annotés.
L’annotation automatique avec des modèles préentraînés peut réduire considérablement le temps et les efforts nécessaires à la création de jeux de données de segmentation de haute qualité. Cette fonctionnalité est particulièrement utile aux chercheurs et aux développeurs qui travaillent avec de grandes collections d’images, car elle leur permet de se concentrer sur le développement et l’évaluation des modèles plutôt que sur l’annotation manuelle.
Citations et remerciements#
Si tu trouves SAM utile dans tes travaux de recherche ou de développement, pense à citer l'article :
@misc{kirillov2023segment,
title={Segment Anything},
author={Alexander Kirillov and Eric Mintun and Nikhila Ravi and Hanzi Mao and Chloe Rolland and Laura Gustafson and Tete Xiao and Spencer Whitehead and Alexander C. Berg and Wan-Yen Lo and Piotr Dollár and Ross Girshick},
year={2023},
eprint={2304.02643},
archivePrefix={arXiv},
primaryClass={cs.CV}
}Nous remercions Meta AI d’avoir créé et de maintenir cette ressource précieuse pour la communauté de la vision par ordinateur.
FAQ#
Le Segment Anything Model (SAM) de Meta est un modèle de segmentation d'images révolutionnaire conçu pour des tâches de segmentation guidée par des invites. Il s'appuie sur une architecture avancée, comprenant des encodeurs d'images et d'invites combinés à un décodeur de masques léger, pour générer des masques de segmentation de haute qualité à partir de diverses invites telles que des indices spatiaux ou textuels. Entraîné sur le vaste SA-1B dataset, SAM excelle dans les performances en zero-shot, s'adaptant à de nouvelles distributions d'images et à de nouvelles tâches sans connaissances préalables.
Comparées aux modèles YOLO, les variantes de SAM telles que SAM-b, MobileSAM et FastSAM-s sont généralement plus grandes et plus lentes, mais offrent des capacités uniques de segmentation zero-shot. Par exemple, YOLO26n-seg est 56x plus petit et plus de 1650x plus rapide que le modèle SAM-b original de Meta sur CPU. Les modèles YOLO sont donc idéaux pour les applications nécessitant une segmentation rapide, légère et efficace sur le plan des calculs, tandis que les modèles SAM excellent dans les tâches de segmentation flexibles, guidées par invite et zero-shot.
Le SAM d’Ultralytics offre une fonctionnalité d’annotation automatique qui permet de générer des jeux de données de segmentation à l’aide d’un modèle de détection préentraîné. Voici un exemple en Python :
from ultralytics.data.annotator import auto_annotate auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")Cette fonction prend le chemin vers tes images et des arguments facultatifs pour les modèles de détection préentraîné et de segmentation SAM, ainsi que les paramètres du périphérique et du répertoire de sortie. Pour consulter le guide complet, voir Annotation automatique.
SAM est entraîné sur le vaste jeu de données SA-1B, qui comprend plus d’un milliard de masques répartis sur 11 millions d’images. SA-1B est le plus grand jeu de données de segmentation à ce jour. Il fournit des données d’entraînement diversifiées et de haute qualité, garantissant des performances zero-shot impressionnantes dans diverses tâches de segmentation. Pour plus de détails, consulte la section Jeux de données.
Tu peux utiliser le modèle Segment Anything (SAM) pour la segmentation d’images en exécutant une inférence avec diverses invites, telles que des boîtes englobantes ou des points. Voici un exemple avec Python :
Tu peux également exécuter une inférence avec SAM dans l’interface de ligne de commande (CLI) :
Pour obtenir des instructions d’utilisation plus détaillées, consulte la section Segmentation.