Segment Anything Model (SAM)
Benvenuti nella frontiera della segmentazione delle immagini con il Segment Anything Model, o SAM. Questo modello rivoluzionario ha cambiato le regole del gioco introducendo la segmentazione delle immagini guidata da prompt con prestazioni in tempo reale, stabilendo nuovi standard nel settore.
Introduzione a SAM: The Segment Anything Model
Il Segment Anything Model, o SAM, è un modello di segmentazione delle immagini all'avanguardia che consente la segmentazione guidata da prompt, fornendo una versatilità senza pari nelle attività di analisi delle immagini. SAM costituisce il cuore dell'iniziativa Segment Anything, un progetto rivoluzionario che introduce un nuovo modello, attività e dataset per la segmentazione delle immagini.
Il design avanzato di SAM gli consente di adattarsi a nuove distribuzioni di immagini e attività senza conoscenze preliminari, una caratteristica nota come trasferimento zero-shot. Addestrato sull'ampio dataset SA-1B, che contiene più di 1 miliardo di maschere distribuite su 11 milioni di immagini accuratamente selezionate, SAM ha mostrato prestazioni zero-shot impressionanti, superando in molti casi i precedenti risultati completamente supervisionati.
Immagini di esempio SA-1B. Immagini del dataset con maschere sovrapposte provenienti dal nuovo dataset SA-1B. SA-1B contiene 11 milioni di immagini diversificate, ad alta risoluzione, con licenza e protezione della privacy e 1,1 miliardi di maschere di segmentazione di alta qualità. Queste maschere sono state annotate in modo completamente automatico da SAM e, come verificato da valutazioni umane e numerosi esperimenti, sono di alta qualità e diversità. Le immagini sono raggruppate per numero di maschere per immagine per la visualizzazione (ci sono ∼100 maschere per immagine in media).
Caratteristiche principali del Segment Anything Model (SAM)
- Attività di segmentazione richiedibile: SAM è stato progettato pensando a un'attività di segmentazione richiedibile, consentendogli di generare maschere di segmentazione valide da qualsiasi prompt fornito, come indizi spaziali o testuali che identificano un oggetto.
- Architettura avanzata: Il Segment Anything Model impiega un potente codificatore di immagini, un codificatore di prompt e un decodificatore di maschere leggero. Questa architettura unica consente un prompting flessibile, un calcolo della maschera in tempo reale e la consapevolezza dell'ambiguità nelle attività di segmentazione.
- Il dataset SA-1B: Introdotto dal progetto Segment Anything, il dataset SA-1B presenta oltre 1 miliardo di maschere su 11 milioni di immagini. Essendo il più grande dataset di segmentazione fino ad oggi, fornisce a SAM una fonte di dati di addestramento diversificata e su larga scala.
- Prestazioni Zero-Shot: SAM mostra eccezionali prestazioni zero-shot in varie attività di segmentazione, rendendolo uno strumento pronto all'uso per diverse applicazioni con una necessità minima di prompt engineering.
Per un approfondimento sul modello Segment Anything e sul dataset SA-1B, visitare il sito web di Segment Anything e consultare il documento di ricerca Segment Anything.
Modelli disponibili, attività supportate e modalità operative
Questa tabella presenta i modelli disponibili con i loro pesi pre-addestrati specifici, le attività che supportano e la loro compatibilità con diverse modalità operative come Inferenza, Validazione, Addestramento ed Esportazione, indicate da emoji ✅ per le modalità supportate ed emoji ❌ per le modalità non supportate.
Tipo di modello | Pesi pre-addestrati | Task supportati | Inferenza | Validazione | Training | Esportazione |
---|---|---|---|---|---|---|
SAM base | sam_b.pt | Segmentazione delle istanze | ✅ | ❌ | ❌ | ❌ |
SAM large | sam_l.pt | Segmentazione delle istanze | ✅ | ❌ | ❌ | ❌ |
Come utilizzare SAM: Versatilità e potenza nella segmentazione delle immagini
Il Segment Anything Model può essere impiegato per una moltitudine di attività a valle che vanno oltre i suoi dati di addestramento. Ciò include il rilevamento dei bordi, la generazione di proposte di oggetti, la segmentazione delle istanze e la predizione preliminare da testo a maschera. Con l'ingegneria dei prompt, SAM può adattarsi rapidamente a nuove attività e distribuzioni di dati in modo zero-shot, affermandosi come uno strumento versatile e potente per tutte le tue esigenze di segmentazione delle immagini.
Esempio di previsione SAM
Segmenta con prompt
Segmenta l'immagine con prompt specifici.
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]])
Segmenta qualsiasi cosa
Segmenta l'intera immagine.
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")
# Run inference with a SAM model
yolo predict model=sam_b.pt source=path/to/image.jpg
- La logica qui è segmentare l'intera immagine se non si passano prompt (bboxes/punti/maschere).
Esempio di SAMPredictor
In questo modo puoi impostare l'immagine una volta ed eseguire l'inferenza dei prompt più volte senza eseguire l'encoder dell'immagine più volte.
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()
Segmenta qualsiasi cosa con argomenti aggiuntivi.
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)
Nota
Tutti i risultati restituiti results
negli esempi sopra sono Risultati oggetto che consente di accedere facilmente alle maschere predette e all'immagine sorgente.
- Argomenti aggiuntivi per
Segment everything
vediPredictor/generate
Riferimenti.
Confronto tra SAM e YOLO
Qui confrontiamo il modello SAM-b di Meta con il modello di segmentazione più piccolo di Ultralytics, YOLO11n-seg:
Modello | Dimensione (MB) |
Parametri (M) |
Velocità (CPU) (ms/im) |
---|---|---|---|
Meta SAM-b | 375 | 93.7 | 49401 |
MobileSAM | 40.7 | 10.1 | 25381 |
FastSAM-s con backbone YOLOv8 | 23.7 | 11.8 | 55.9 |
Ultralytics YOLOv8n-seg | 6.7 (11.7 volte più piccolo) | 3.4 (11.4 volte inferiore) | 24.5 (1061 volte più veloce) |
Ultralytics YOLO11n-seg | 5.9 (13,2 volte più piccolo) | 2.9 (13,4 volte inferiore) | 30.1 (864 volte più veloce) |
Questo confronto dimostra le sostanziali differenze nelle dimensioni e nelle velocità dei modelli tra le varianti SAM e i modelli di segmentazione YOLO. Mentre SAM offre capacità uniche di segmentazione automatica, i modelli YOLO, in particolare YOLOv8n-seg e YOLO11n-seg, sono significativamente più piccoli, più veloci e più efficienti dal punto di vista computazionale.
Test eseguiti su un Apple M4 Pro 2025 con 24 GB di RAM utilizzando torch==2.6.0
e ultralytics==8.3.90
. Per riprodurre questo test:
Esempio
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# Profile SAM2-t, SAM2-b, SAM-b, MobileSAM
for file in ["sam_b.pt", "sam2_b.pt", "sam2_t.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
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt"]:
model = YOLO(file_name)
model.info()
model(ASSETS)
Auto-Annotazione: un percorso rapido verso i dataset di segmentazione
L'auto-annotazione è una funzionalità chiave di SAM, che consente agli utenti di generare un dataset di segmentazione utilizzando un modello di rilevamento pre-addestrato. Questa funzionalità consente un'annotazione rapida e accurata di un gran numero di immagini, evitando la necessità di un'etichettatura manuale che richiede molto tempo.
Genera il tuo set di dati di segmentazione utilizzando un modello di rilevamento
Per annotare automaticamente il tuo set di dati con il framework Ultralytics, usa il auto_annotate
funzione come mostrato di seguito:
Esempio
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo11x.pt", sam_model="sam_b.pt")
Argomento | Tipo | Predefinito | Descrizione |
---|---|---|---|
data |
str |
richiesto | Percorso della directory contenente le immagini di destinazione per l'annotazione o la segmentazione. |
det_model |
str |
'yolo11x.pt' |
Percorso del modello di rilevamento YOLO per il rilevamento iniziale degli oggetti. |
sam_model |
str |
'sam_b.pt' |
Percorso del modello SAM per la segmentazione (supporta le varianti SAM, SAM2 e i modelli mobile_sam). |
device |
str |
'' |
Dispositivo di calcolo (ad esempio, 'cuda:0', 'cpu' o '' per il rilevamento automatico del dispositivo). |
conf |
float |
0.25 |
Soglia di confidenza del rilevamento YOLO per filtrare i rilevamenti deboli. |
iou |
float |
0.45 |
Soglia IoU per la Non-Maximum Suppression per filtrare i riquadri sovrapposti. |
imgsz |
int |
640 |
Dimensione di input per il ridimensionamento delle immagini (deve essere un multiplo di 32). |
max_det |
int |
300 |
Numero massimo di rilevamenti per immagine per efficienza della memoria. |
classes |
list[int] |
None |
Elenco degli indici di classe da rilevare (ad esempio, [0, 1] per persone e biciclette). |
output_dir |
str |
None |
Salva la directory per le annotazioni (il valore predefinito è './labels' relativo al percorso dei dati). |
Il auto_annotate
La funzione accetta il percorso delle tue immagini, con argomenti opzionali per specificare i modelli di rilevamento pre-addestrati e di segmentazione SAM, il dispositivo su cui eseguire i modelli e la directory di output per salvare i risultati annotati.
L'auto-annotazione con modelli pre-addestrati può ridurre drasticamente il tempo e lo sforzo necessari per creare dataset di segmentazione di alta qualità. Questa funzionalità è particolarmente vantaggiosa per ricercatori e sviluppatori che si occupano di grandi raccolte di immagini, in quanto consente loro di concentrarsi sullo sviluppo e sulla valutazione del modello piuttosto che sull'annotazione manuale.
Citazioni e riconoscimenti
Se trovi SAM utile nel tuo lavoro di ricerca o sviluppo, considera di citare il nostro articolo:
@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}
}
Desideriamo esprimere la nostra gratitudine a Meta AI per aver creato e mantenuto questa preziosa risorsa per la comunità della computer vision.
FAQ
Cos'è il Segment Anything Model (SAM) di Ultralytics?
Il Segment Anything Model (SAM) di Ultralytics è un modello rivoluzionario di segmentazione delle immagini progettato per attività di segmentazione guidata da prompt. Sfrutta un'architettura avanzata, inclusi codificatori di immagini e prompt combinati con un decoder di maschere leggero, per generare maschere di segmentazione di alta qualità da vari prompt come indizi spaziali o di testo. Addestrato sull'ampio set di dati SA-1B, SAM eccelle nelle prestazioni zero-shot, adattandosi a nuove distribuzioni di immagini e attività senza conoscenze preliminari.
Come posso usare il Segment Anything Model (SAM) per la segmentazione di immagini?
Puoi utilizzare il Segment Anything Model (SAM) per la segmentazione delle immagini eseguendo l'inferenza con vari prompt come bounding box o punti. Ecco un esempio usando 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]])
In alternativa, puoi eseguire l'inferenza con SAM nell'interfaccia della riga di comando (CLI):
yolo predict model=sam_b.pt source=path/to/image.jpg
Per istruzioni d'uso più dettagliate, visitare la sezione Segmentazione.
Come si confrontano i modelli SAM e YOLO in termini di prestazioni?
Rispetto ai modelli YOLO, le varianti SAM come SAM-b, SAM2-t, MobileSAM e FastSAM-s sono in genere più grandi e più lente, ma offrono capacità uniche di segmentazione zero-shot. Ad esempio, Ultralytics YOLOv8n-seg è 11.7 volte più piccolo e 1069 volte più veloce del modello SAM-b originale di Meta, evidenziando il significativo vantaggio di YOLO in termini di velocità ed efficienza. Allo stesso modo, il più recente YOLO11n-seg offre dimensioni ancora più ridotte e mantiene un'impressionante velocità di inferenza. Ciò rende i modelli YOLO ideali per applicazioni che richiedono una segmentazione rapida, leggera ed efficiente dal punto di vista computazionale, mentre i modelli SAM eccellono in attività di segmentazione flessibili, promptable e zero-shot.
Come posso annotare automaticamente il mio dataset usando SAM?
SAM di Ultralytics offre una funzione di auto-annotazione che consente di generare dataset di segmentazione utilizzando un modello di rilevamento pre-addestrato. Ecco un esempio in python:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")
Questa funzione accetta il percorso delle immagini e argomenti opzionali per i modelli di rilevamento pre-addestrati e di segmentazione SAM, insieme alle specifiche del dispositivo e della directory di output. Per una guida completa, consultare Auto-Annotation.
Quali set di dati vengono utilizzati per addestrare il Segment Anything Model (SAM)?
SAM è addestrato sull'ampio dataset SA-1B che comprende oltre 1 miliardo di maschere su 11 milioni di immagini. SA-1B è il più grande dataset di segmentazione fino ad oggi, che fornisce dati di addestramento diversificati e di alta qualità, garantendo prestazioni zero-shot impressionanti in varie attività di segmentazione. Per maggiori dettagli, visitare la sezione Dataset.