Segment Anything Model (SAM)
Benvenuto alla 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 basata su prompt con prestazioni in tempo reale, stabilendo nuovi standard nel settore.
Introduzione a SAM: il Segment Anything Model
Il Segment Anything Model, o SAM, è un modello di segmentazione delle immagini all'avanguardia che consente la segmentazione basata su prompt, offrendo una versatilità senza precedenti nelle attività di analisi delle immagini. SAM costituisce il fulcro dell'iniziativa Segment Anything, un progetto innovativo che introduce un nuovo modello, un nuovo task e un nuovo 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 zero-shot transfer. Addestrato sull'ampio dataset SA-1B, che contiene oltre 1 miliardo di maschere distribuite su 11 milioni di immagini accuratamente curate, SAM ha mostrato prestazioni zero-shot impressionanti, superando in molti casi i precedenti risultati completamente supervisionati.
Immagini di esempio SA-1B. Maschere sovrapposte alle immagini del dataset SA-1B appena introdotto. SA-1B contiene 11 milioni di immagini diverse, ad alta risoluzione, con licenza e che tutelano la privacy, insieme a 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 in base al numero di maschere per immagine per la visualizzazione (ci sono circa 100 maschere per immagine in media).
Caratteristiche principali del Segment Anything Model (SAM)
- Task di segmentazione basato su prompt: SAM è stato progettato pensando a un task di segmentazione basato su prompt, 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, il calcolo delle maschere 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 ad oggi, fornisce a SAM una fonte di dati di addestramento diversificata e su larga scala.
- Prestazioni Zero-Shot: SAM mostra prestazioni zero-shot eccezionali in varie attività di segmentazione, rendendolo uno strumento pronto all'uso per diverse applicazioni con una minima necessità di prompt engineering.
Per uno sguardo approfondito al Segment Anything Model e al dataset SA-1B, visita il GitHub di Segment Anything e consulta il paper di ricerca Segment Anything.
SAM alimenta la funzionalità di annotazione intelligente sulla piattaforma Ultralytics, consentendo la mascheratura intelligente basata su clic per un'etichettatura rapida del dataset. Vedi la guida all'annotazione per i dettagli.
Modelli disponibili, task supportati e modalità operative
Questa tabella presenta i modelli disponibili con i relativi pesi pre-addestrati, i task che supportano e la loro compatibilità con diverse modalità operative come Inferenza, Validazione, Addestramento ed Esportazione, indicate da emoji ✅ per le modalità supportate e ❌ per le modalità non supportate.
| Tipo di modello | Pesi preaddestrati | Attività supportate | Inferenza (Inference) | Validazione | Addestramento | Export |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | Segmentazione delle istanze | ✅ | ❌ | ❌ | ❌ |
| SAM large | sam_l.pt | Segmentazione delle istanze | ✅ | ❌ | ❌ | ❌ |
Come usare SAM: versatilità e potenza nella segmentazione delle immagini
Il Segment Anything Model può essere utilizzato per una moltitudine di task 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 il prompt engineering, 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 predizione SAM
Segmenta l'immagine con i prompt forniti.
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 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")- La logica qui è segmentare l'intera immagine se non passi alcun prompt (bbox/punti/maschere).
In questo modo puoi impostare l'immagine una volta ed eseguire l'inferenza dei prompt più volte senza dover eseguire più volte il codificatore di immagini.
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 tutto 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)Tutti i results restituiti negli esempi sopra sono oggetti Results che consentono di accedere facilmente alle maschere predette e all'immagine sorgente.
- Per ulteriori argomenti aggiuntivi per
Segment everything, vedi il riferimentoPredictor/generate.
Confronto SAM vs YOLO
Qui confrontiamo il modello SAM-b di Meta con i modelli di segmentazione Ultralytics, incluso YOLO26n-seg:
| Modello | Dimensioni (MB) | Parametri (M) | Velocità (CPU) (ms/im) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| MobileSAM | 40.7 | 10.1 | 23802 |
| FastSAM-s con backbone YOLOv8 | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (52.8x più piccolo) | 3.4 (27.6x in meno) | 24.8 (1682x più veloce) |
| Ultralytics YOLO11n-seg | 6.2 (60.5x più piccolo) | 2.9 (32.3x in meno) | 24.3 (1716x più veloce) |
| Ultralytics YOLO26n-seg | 6.7 (56.0x più piccolo) | 2.7 (34.7x in meno) | 25.2 (1655x 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 funzionalità di segmentazione automatica uniche, i modelli YOLO, in particolare YOLOv8n-seg, YOLO11n-seg e YOLO26n-seg, sono significativamente più piccoli, veloci e computazionalmente più efficienti.
Velocità SAM misurate con PyTorch, velocità YOLO misurate con ONNX Runtime. Test eseguiti su un Apple M4 Air 2025 con 16GB di RAM utilizzando torch==2.10.0, ultralytics==8.4.31 e onnxruntime==1.24.4. Per riprodurre questo 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-Annotazione: un percorso rapido verso i dataset di segmentazione
L'auto-annotazione è una caratteristica 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 dataset di segmentazione utilizzando un modello di rilevamento
Per auto-annotare il tuo dataset con il framework Ultralytics, usa la funzione auto_annotate come mostrato di seguito:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")| Argomento | Tipo | Predefinito | Descrizione |
|---|---|---|---|
data | str | richiesto | Percorso della directory contenente le immagini target per l'annotazione o la segmentazione. |
det_model | str | 'yolo26x.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 varianti SAM, SAM2 e modelli MobileSAM). |
device | str | '' | Dispositivo di calcolo (es. '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 | Dimensioni di input per il ridimensionamento delle immagini (deve essere un multiplo di 32). |
max_det | int | 300 | Numero massimo di rilevamenti per immagine per l'efficienza della memoria. |
classes | list[int] | None | Elenco degli indici di classe da rilevare (es. [0, 1] per persona e bicicletta). |
output_dir | str | None | Salva la directory per le annotazioni (predefinito './labels' relativo al percorso dei dati). |
La funzione auto_annotate prende 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 richiesti per creare dataset di segmentazione di alta qualità. Questa funzionalità è particolarmente utile per ricercatori e sviluppatori che gestiscono grandi collezioni di immagini, poiché consente loro di concentrarsi sullo sviluppo e sulla valutazione del modello piuttosto che sull'annotazione manuale.
Citazioni e ringraziamenti
Se trovi SAM utile nel tuo lavoro di ricerca o sviluppo, considera di citare il nostro paper:
@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 di segmentazione delle immagini rivoluzionario progettato per task di segmentazione basati su prompt. Sfrutta un'architettura avanzata, inclusi codificatori di immagini e di prompt combinati con un decodificatore di maschere leggero, per generare maschere di segmentazione di alta qualità da vari prompt come indizi spaziali o testuali. Addestrato sull'ampio dataset 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 delle immagini?
Puoi usare il Segment Anything Model (SAM) per la segmentazione delle immagini eseguendo l'inferenza con vari prompt come bounding box o punti. Ecco un esempio utilizzando 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 a riga di comando (CLI):
yolo predict model=sam_b.pt source=path/to/image.jpgPer istruzioni sull'uso più dettagliate, visita 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, MobileSAM e FastSAM-s sono in genere più grandi e più lente, ma offrono capacità di segmentazione zero-shot uniche. Ad esempio, YOLO26n-seg è 56x più piccolo e oltre 1650x più veloce del modello SAM-b originale di Meta su CPU. Questo rende i modelli YOLO ideali per le applicazioni che richiedono una segmentazione rapida, leggera e computazionalmente efficiente, mentre i modelli SAM eccellono nelle attività di segmentazione flessibili, basate su prompt e zero-shot.
Come posso auto-annotare il mio dataset utilizzando SAM?
Il 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="yolo26x.pt", sam_model="sam_b.pt")Questa funzione accetta il percorso delle tue immagini e argomenti opzionali per modelli di rilevamento pre-addestrati e di segmentazione SAM, insieme alle specifiche del dispositivo e della directory di output. Per una guida completa, consulta Auto-Annotation.
Quali dataset 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 ad oggi, fornendo dati di addestramento di alta qualità e diversificati, garantendo prestazioni zero-shot impressionanti in svariate attività di segmentazione. Per maggiori dettagli, visita la sezione Dataset.