Segment Anything Model (SAM)
Bienvenue à la frontière 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 sollicitable 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'images de pointe qui permet une segmentation sollicitable, offrant une polyvalence inégalée dans les tâches d'analyse d'images. SAM forme 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'images.
La conception avancée de SAM lui permet de s'adapter à de nouvelles distributions d'images et de 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, surpassant souvent les résultats précédents entièrement supervisés.
Exemples d'images SA-1B. Images du jeu de données avec masques superposés provenant du nouveau jeu de données SA-1B. SA-1B contient 11 millions d'images diverses, haute résolution, sous licence et respectueuses de 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 vérifié par des évaluations humaines et de nombreuses expériences, sont de haute qualité et diversifiés. 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 puissant encodeur d'image, 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 gestion de 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 affiche 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 GitHub de Segment Anything et consulte l'article de recherche Segment Anything.
SAM alimente la fonctionnalité d'annotation intelligente sur Ultralytics Platform, permettant un masquage intelligent basé sur le clic 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 Inférence, Validation, Entraînement, et Exportation, indiqués par des émojis ✅ pour les modes pris en charge et ❌ pour les modes non pris en charge.
| Type de modèle | Poids pré-entraînés | Tâches prises en charge | Inférence | Validation | Entraînement | Exportation |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | Segmentation d'instance | ✅ | ❌ | ❌ | ❌ |
| SAM large | sam_l.pt | Segmentation d'instance | ✅ | ❌ | ❌ | ❌ |
Comment utiliser SAM : Polyvalence et puissance dans la segmentation d'images
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 de contours, la génération de propositions d'objets, la segmentation d'instances et la prédiction préliminaire de texte vers masque. Avec le prompt engineering, SAM peut rapidement s'adapter à de nouvelles tâches et distributions de données de manière zero-shot, s'imposant comme un outil polyvalent et puissant pour tous tes besoins en segmentation d'images.
Exemple de prédiction SAM
Segmenter une 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 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 est de segmenter l'image entière si tu ne transmets aucune invite (bboxes/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.
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = dict(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 = dict(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 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 SAM vs YOLO
Ici, nous comparons 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 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èles 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 significativement plus petits, plus rapides et plus efficaces sur le plan computationnel.
Vitesses SAM mesurées avec PyTorch, vitesses YOLO mesurées avec ONNX Runtime. Tests effectués sur un Apple M4 Air 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'auto-annotation est une fonctionnalité clé de SAM, permettant aux utilisateurs de générer un jeu de données de segmentation en utilisant 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 le besoin d'un étiquetage manuel fastidieux.
Génère ton jeu de données de segmentation en utilisant un modèle de détection
Pour auto-annoter 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 initiale d'objets. |
sam_model | str | 'sam_b.pt' | Chemin du modèle SAM pour la segmentation (prend en charge les variantes SAM, SAM2 et les modèles MobileSAM). |
device | str | '' | Dispositif de calcul (par exemple, 'cuda:0', 'cpu' ou '' pour la détection automatique du dispositif). |
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 NMS afin de filtrer les boîtes qui se chevauchent. |
imgsz | int | 640 | Taille d'entrée pour le redimensionnement des 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 exemple, [0, 1] pour personne et vélo). |
output_dir | str | None | Répertoire de sauvegarde pour les annotations (par défaut './labels' par rapport au chemin des données). |
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és 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 considérablement réduire 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 bénéfique pour les chercheurs et les 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 tu trouves SAM utile dans tes travaux de recherche ou de développement, envisage de 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 avoir créé et maintenu cette ressource précieuse pour la communauté de la vision par ordinateur.
FAQ
Qu'est-ce que le Segment Anything Model (SAM) par Ultralytics ?
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 sollicitable. Il s'appuie sur une architecture avancée, incluant des encodeurs d'image et d'invite combinés à un décodeur de masque 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 à de nouvelles distributions d'images et de tâches sans connaissances préalables.
Comment puis-je utiliser le Segment Anything Model (SAM) pour la segmentation d'images ?
Tu peux utiliser le Segment Anything Model (SAM) pour la segmentation d'images en exécutant l'inférence avec diverses invites telles que des boîtes englobantes ou des points. Voici un exemple utilisant Python :
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Segment with bounding box prompt
model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# Segment with points prompt
model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
# Segment with multiple points prompt
model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[[1, 1]])
# Segment with multiple points prompt per object
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Segment with negative points prompt.
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])Alternativement, tu peux exécuter l'inférence avec SAM dans l'interface de ligne de commande (CLI) :
yolo predict model=sam_b.pt source=path/to/image.jpgPour des instructions d'utilisation plus détaillées, visite la section Segmentation.
Comment les modèles SAM et YOLO se comparent-ils en termes de performances ?
Comparés aux modèles YOLO, les variantes de SAM comme 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 56x plus petit et plus de 1650x plus rapide que le modèle SAM-b original de Meta sur CPU. Cela rend les modèles YOLO idéaux pour les applications nécessitant une segmentation rapide, légère et efficace sur le plan computationnel, tandis que les modèles SAM excellent dans les tâches de segmentation flexibles, sollicitables et zero-shot.
Comment puis-je auto-annoter mon jeu de données en utilisant SAM ?
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 vers tes images et des arguments optionnels pour les modèles de détection pré-entraînés et de segmentation SAM, ainsi que des spécifications pour le périphérique et le répertoire de sortie. Pour un guide complet, consulte Auto-Annotation.
Quels jeux de données sont utilisés pour entraîner le Segment Anything Model (SAM) ?
SAM est entraîné sur le vaste SA-1B dataset qui comprend plus d'un milliard de masques sur 11 millions d'images. SA-1B est le plus grand jeu de données de segmentation à ce jour, fournissant des training data de haute qualité et diversifiées, assurant des performances zero-shot impressionnantes dans des tâches de segmentation variées. Pour plus de détails, visite la section Dataset.