Segment Anything Model (SAM)#
Bienvenue à la pointe de la segmentation d'images avec le Segment Anything Model, ou SAM. Ce modèle révolutionnaire a changé la donne en introduisant la segmentation d'images guidée par des invites avec des performances en temps réel, établissant de nouvelles normes dans le domaine.
Introduction à SAM : Le Segment Anything Model#
Le Segment Anything Model, ou SAM, est un modèle de segmentation d'image de pointe qui permet une segmentation sollicitable, offrant une polyvalence inégalée dans les tâches d'analyse d'image. SAM constitue le cœur de l'initiative Segment Anything, un projet révolutionnaire qui introduit un nouveau modèle, une nouvelle tâche et un nouveau jeu de données pour la segmentation d'image.
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é connue sous le nom de 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, surpassant les précédents résultats entièrement supervisés dans de nombreux cas.
Images d'exemple SA-1B. Images du jeu de données superposées avec des masques du jeu de données SA-1B nouvellement introduit. SA-1B contient 11 millions d'images diverses, haute résolution, sous licence et protégeant la vie privée, ainsi que 1,1 milliard de masques de segmentation de haute qualité. Ces masques ont été annotés de manière entièrement automatique par SAM et, comme l'ont vérifié des évaluations humaines et de nombreuses expériences, sont d'une haute qualité et diversité. Les images sont regroupées par nombre de masques par image pour la visualisation (il y a environ 100 masques par image en moyenne).
Fonctionnalités clés du Segment Anything Model (SAM)#
- Tâche de segmentation sollicitable : SAM a été conçu avec une tâche de segmentation sollicitable à l'esprit, lui permettant de générer des masques de segmentation valides à partir de n'importe quelle invite donnée, telle que des indices spatiaux ou textuels identifiant un objet.
- Architecture avancée : Le Segment Anything Model utilise un encodeur d'image puissant, un encodeur d'invite et un décodeur de masque léger. Cette architecture unique permet une sollicitation flexible, un calcul de masque en temps réel et une sensibilisation à l'ambiguïté 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 présente 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 diversifiée et à grande échelle.
- Performances zero-shot : SAM présente des performances zero-shot exceptionnelles sur diverses tâches de segmentation, ce qui en fait un outil prêt à l'emploi pour diverses applications avec un besoin minimal de prompt engineering.
Pour un aperçu approfondi du Segment Anything Model et du jeu de données SA-1B, visite le Segment Anything GitHub et consulte l'article de recherche Segment Anything.
SAM alimente la fonctionnalité d'annotation intelligente sur Ultralytics Platform, permettant un masquage intelligent basé sur des clics pour un étiquetage rapide des 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'Inference, la Validation, l'Training et l'Export, indiqués par des emojis ✅ pour les modes pris en charge et des emojis ❌ pour les modes non pris en charge.
| Type de modèle | Poids pré-entraînés | Tâches prises en charge | Entraînement | Validation | Inférence | Exporter (Export) |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | Segmentation d'instances | ❌ | ❌ | ✅ | ❌ |
| SAM large | sam_l.pt | Segmentation d'instances | ❌ | ❌ | ✅ | ❌ |
Comment utiliser SAM : Polyvalence et puissance dans la segmentation d'image#
Le Segment Anything Model 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 texte-masque. Grâce au prompt engineering, SAM peut s'adapter rapidement à de nouvelles tâches et à de nouvelles distributions de données de manière zero-shot, s'imposant comme un outil polyvalent et puissant pour tous tes besoins de segmentation d'images.
Exemple de prédiction SAM#
Segmenter l'image avec des invites données.
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 toute l'image.
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 est de segmenter toute l'image si tu ne passes aucune invite (bbox/points/masques).
De cette façon, tu peux définir l'image une fois et exécuter l'inférence des invites plusieurs fois sans exécuter l'encodeur d'image plusieurs fois.
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()Segmenter tout 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)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 plus d'arguments supplémentaires pour
Segment everything, consulte la RéférencePredictor/generate.
Comparaison de SAM vs YOLO#
Nous comparons ici le modèle SAM-b de Meta avec les modèles de segmentation Ultralytics, y compris 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 YOLOv8 | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (52.8x plus petit) | 3.4 (27.6x moins) | 24.8 (1682x plus rapide) |
| Ultralytics YOLO11n-seg | 6.2 (60.5x plus petit) | 2.9 (32.3x 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 démontre les différences substantielles de tailles et de vitesses de modèle entre les variantes de SAM et les modèles de segmentation YOLO. Bien que SAM offre des capacités de segmentation automatique uniques, les modèles YOLO, en particulier YOLOv8n-seg, YOLO11n-seg et YOLO26n-seg, sont nettement plus petits, plus rapides et plus efficaces sur le plan informatique.
Vitesses SAM mesurées avec PyTorch, vitesses YOLO mesurées avec ONNX Runtime. Tests exécutés sur un Apple M4 Air de 2025 avec 16 Go de RAM en utilisant 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)
model = YOLO(onnx_path)
model(ASSETS)Auto-Annotation : Un chemin rapide vers les jeux de données de segmentation#
L'annotation automatique est une fonctionnalité clé de SAM, permettant 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 une annotation rapide et précise d'un grand nombre d'images, évitant ainsi un étiquetage manuel fastidieux.
Génère ton jeu de données de segmentation en utilisant 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 | Défaut | Description |
|---|---|---|---|
data | str | requis | Chemin vers le répertoire contenant les images cibles pour l'annotation ou la segmentation. |
det_model | str | 'yolo26x.pt' | Chemin du modèle de détection YOLO pour la détection d'objet initiale. |
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 | '' | Appareil de calcul (par ex., 'cuda:0', 'cpu', ou '' pour la détection automatique de l'appareil). |
conf | float | 0.25 | Seuil de confiance de détection YOLO pour filtrer les détections faibles. |
iou | float | 0.45 | Seuil IoU pour le Non-Maximum Suppression 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 l'efficacité de la mémoire. |
classes | list[int] | None | Liste des indices de classe à détecter (par ex., [0, 1] pour personne et bicyclette). |
output_dir | str | None | Répertoire de sauvegarde pour les annotations (par défaut : dossier parent <data>_auto_annotate_labels). |
La fonction auto_annotate prend le chemin de tes images, avec des arguments optionnels pour spécifier les modèles de détection pré-entraîné et de segmentation SAM, le dispositif sur lequel exécuter les modèles et le répertoire de sortie pour enregistrer les résultats annotés.
L'auto-annotation avec des modèles pré-entraînés peut réduire considérablement le temps et les efforts nécessaires pour créer des jeux de données de segmentation de haute qualité. Cette fonctionnalité est particulièrement avantageuse pour les chercheurs et développeurs traitant de grandes collections d'images, car elle leur permet de se concentrer sur le développement et l'évaluation du modèle plutôt que sur l'annotation manuelle.
Citations et remerciements#
Si SAM t'est utile dans tes travaux de recherche ou de développement, pense à citer notre 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 tenons à exprimer notre gratitude à Meta AI pour la création et la maintenance de cette ressource précieuse pour la communauté de la computer vision.
FAQ#
Le Segment Anything Model (SAM) par Ultralytics est un modèle de segmentation d'images révolutionnaire conçu pour les tâches de segmentation guidée par des invites. Il tire parti d'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 jeu de données SA-1B, SAM excelle dans les performances zero-shot, s'adaptant aux nouvelles distributions d'images et tâches sans connaissances préalables.
Comparés aux modèles YOLO, les variantes SAM telles que SAM-b, MobileSAM et FastSAM-s sont généralement plus grandes et plus lentes, mais offrent des capacités de segmentation zero-shot uniques. Par exemple, YOLO26n-seg est 56 fois plus petit et plus de 1650 fois plus rapide que le modèle SAM-b d'origine de Meta sur processeur. Cela rend les modèles YOLO idéaux pour les applications nécessitant une segmentation rapide, légère et efficace sur le plan informatique, tandis que les modèles SAM excellement dans les tâches de segmentation flexibles, pilotées par des invites et zero-shot.
Le SAM d'Ultralytics propose une fonctionnalité d'auto-annotation qui permet de générer des jeux de données de segmentation en utilisant 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 de tes images et des arguments optionnels pour les modèles de détection pré-entraîné et de segmentation SAM, ainsi que des spécifications de dispositif et de répertoire de sortie. Pour un guide complet, consulte Auto-Annotation.
SAM est entraîné sur le vaste jeu de données SA-1B qui comprend plus d'1 milliard de masques répartis sur 11 millions d'images. SA-1B est le plus grand jeu de données de segmentation à ce jour, fournissant des données d'entraînement de haute qualité et diversifiées, garantissant des performances zero-shot impressionnantes dans des tâches de segmentation variées. Pour plus de détails, visite la section Jeu de données.
Tu peux utiliser le Segment Anything Model (SAM) pour la segmentation d'image en exécutant l'inférence avec divers prompts tels que des boîtes englobantes ou des points. Voici un exemple en Python :
Alternativement, tu peux exécuter l'inférence avec SAM via l'interface en ligne de commande (CLI) :
Pour des instructions d'utilisation plus détaillées, visite la section Segmentation.