Modello Segment Anything (SAM)#
Benvenuto all'avanguardia della segmentazione delle immagini con il Modello Segment Anything, 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: il Modello Segment Anything#
Il Modello Segment Anything, o SAM, è un modello di segmentazione delle immagini all'avanguardia che consente la segmentazione guidata da prompt, offrendo una versatilità senza pari nelle attività di analisi delle immagini. SAM è il cuore dell'iniziativa Segment Anything, un progetto innovativo che introduce un nuovo modello, un'attività e un dataset per la segmentazione delle immagini.
La progettazione avanzata di SAM gli consente di adattarsi a nuove distribuzioni di immagini e attività senza conoscenze pregresse, una caratteristica nota come trasferimento zero-shot. Addestrato sull'ampio dataset SA-1B, che contiene oltre 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 di SA-1B. Immagini del dataset con maschere sovrapposte del nuovo dataset SA-1B. SA-1B contiene 11 milioni di immagini diverse, ad alta risoluzione, con licenza e a tutela della privacy, oltre a 1,1 miliardi di maschere di segmentazione di alta qualità. Queste maschere sono state annotate completamente automaticamente da SAM e, come verificato dalle valutazioni umane e da numerosi esperimenti, sono di alta qualità e varietà. Le immagini sono raggruppate in base al numero di maschere per immagine per facilitarne la visualizzazione (in media sono presenti ∼100 maschere per immagine).
Caratteristiche principali del Modello Segment Anything (SAM)#
- Attività di segmentazione guidata da prompt: SAM è stato progettato pensando a un'attività di segmentazione guidata da prompt, consentendogli di generare maschere di segmentazione valide a partire da qualsiasi prompt, come indizi spaziali o testuali che identificano un oggetto.
- Architettura avanzata: il Modello Segment Anything utilizza un potente encoder delle immagini, un encoder dei prompt e un decoder leggero delle maschere. Questa architettura unica consente prompt flessibili, il calcolo delle maschere in tempo reale e la gestione delle ambiguità nelle attività di segmentazione.
- Il dataset SA-1B: introdotto dal progetto Segment Anything, il dataset SA-1B contiene oltre 1 miliardo di maschere su 11 milioni di immagini. In quanto più grande dataset di segmentazione disponibile finora, fornisce a SAM una fonte di dati di addestramento ampia e diversificata.
- Prestazioni zero-shot: SAM mostra prestazioni zero-shot eccellenti in diverse attività di segmentazione, rendendolo uno strumento pronto all'uso per applicazioni diverse con un'esigenza minima di prompt engineering.
Per un'analisi approfondita del Modello Segment Anything e del dataset SA-1B, visita Segment Anything su GitHub e consulta l'articolo di ricerca Segment Anything.
SAM alimenta la funzionalità di annotazione intelligente della piattaforma Ultralytics, consentendo la creazione intelligente di maschere tramite clic per etichettare rapidamente i dataset. Consulta la guida all'annotazione per maggiori dettagli.
Modelli disponibili, attività supportate e modalità operative#
Questa tabella presenta i modelli disponibili con i relativi pesi preaddestrati, le attività supportate e la compatibilità con diverse modalità operative, come Inferenza, Validazione, Addestramento ed Esportazione, indicate dalle emoji ✅ per le modalità supportate e dalle emoji ❌ per quelle non supportate.
| Tipo di modello | Pesi preaddestrati | Attività supportate | Addestramento | Convalida | Inferenza | 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 Modello Segment Anything può essere impiegato per numerose attività a valle che vanno oltre i dati di addestramento. Tra queste rientrano il rilevamento dei contorni, la generazione di proposte di oggetti, la segmentazione delle istanze e la previsione preliminare da testo a maschera. Grazie al prompt engineering, SAM può adattarsi rapidamente a nuove attività e distribuzioni di dati in modalità zero-shot, affermandosi come strumento versatile e potente per tutte le tue esigenze di segmentazione delle immagini.
Esempio di predizione con 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 consiste nel segmentare l'intera immagine se non passi alcun prompt (bboxes/punti/maschere).
In questo modo puoi impostare l'immagine una sola volta ed eseguire più volte l'inferenza con i prompt senza eseguire più volte l'encoder delle immagini.
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()Segmenta tutto con argomenti aggiuntivi.
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)Tutti gli results restituiti negli esempi precedenti sono oggetti Results, che consentono di accedere facilmente alle maschere predette e all'immagine di origine.
- Per ulteriori argomenti di
Segment everything, consulta il riferimento diPredictor/generate.
Confronto tra SAM e 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.5 volte più piccolo) | 2.9 (32,3x in meno) | 24.3 (1716 volte più veloce) |
| Ultralytics YOLO26n-seg | 6.7 (56,0x più piccolo) | 2.7 (34.7 volte in meno) | 25.2 (1655x più veloce) |
Questo confronto evidenzia le notevoli differenze nelle dimensioni e nelle velocità dei modelli tra le varianti di SAM e i modelli di segmentazione YOLO. Sebbene SAM offra capacità di segmentazione automatica uniche, i modelli YOLO, in particolare YOLOv8n-seg, YOLO11n-seg e YOLO26n-seg, sono significativamente più piccoli, veloci ed efficienti dal punto di vista computazionale.
Le velocità di SAM sono state misurate con PyTorch, mentre quelle di YOLO sono state misurate con ONNX Runtime. I test sono stati eseguiti su un Apple M4 Air del 2025 con 16 GB 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, nms=False) # YOLO26 NMS-free head; no-op for YOLOv8/YOLO11
model = YOLO(onnx_path)
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 preaddestrato. Questa funzionalità permette di annotare rapidamente e accuratamente un numero elevato di immagini, evitando la necessità di un'etichettatura manuale dispendiosa in termini di tempo.
Genera il tuo dataset di segmentazione utilizzando un modello di rilevamento#
Per annotare automaticamente il tuo dataset con il framework Ultralytics, utilizza 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 | obbligatorio | Percorso della directory contenente le immagini di destinazione da annotare o segmentare. |
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 i pesi di SAM, SAM 2, MobileSAM e SAM 3). |
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 soppressione dei non massimi, per filtrare i box 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 un uso efficiente della memoria. |
classes | list[int] | None | Elenco degli indici delle classi da rilevare (ad esempio, [0, 1] per persona e bicicletta). |
output_dir | str | None | Directory di salvataggio per le annotazioni (per impostazione predefinita: directory adiacente a <data>_auto_annotate_labels). |
La funzione auto_annotate accetta il percorso delle tue immagini, con argomenti opzionali per specificare i modelli di rilevamento preaddestrato e di segmentazione SAM, il dispositivo su cui eseguire i modelli e la directory di output in cui salvare i risultati annotati.
L'auto-annotazione con modelli preaddestrati può ridurre drasticamente il tempo e l'impegno necessari per creare dataset di segmentazione di alta qualità. Questa funzionalità è particolarmente vantaggiosa per ricercatori e sviluppatori che lavorano con grandi raccolte di immagini, perché consente loro di concentrarsi sullo sviluppo e sulla valutazione dei modelli anziché sull'annotazione manuale.
Citazioni e ringraziamenti#
Se trovi SAM utile nel tuo lavoro di ricerca o sviluppo, considera di citare il documento:
@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 ringraziare Meta AI per aver creato e mantenuto questa preziosa risorsa per la comunità della visione artificiale.
FAQ#
Il Segment Anything Model (SAM) di Meta è un modello di segmentazione di immagini rivoluzionario progettato per attività di segmentazione con prompt. Sfrutta un'architettura avanzata, inclusi codificatori di immagini e prompt combinati con un decodificatore di maschere leggero, per generare maschere di segmentazione di alta qualità da vari prompt come suggerimenti spaziali o testuali. Addestrato sull'estensivo set di dati SA-1B, SAM eccelle nelle prestazioni zero-shot, adattandosi a nuove distribuzioni di immagini e attività senza conoscenza preliminare.
Puoi utilizzare il Modello Segment Anything (SAM) per la segmentazione delle immagini eseguendo l'inferenza con diversi prompt, come riquadri di delimitazione 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 della riga di comando (CLI):
yolo predict model=sam_b.pt source=path/to/image.jpgPer istruzioni d'uso più dettagliate, visita la sezione Segmentazione.
Rispetto ai modelli YOLO, le varianti di SAM come SAM-b, MobileSAM e FastSAM-s sono generalmente più grandi e lente, ma offrono funzionalità uniche di segmentazione zero-shot. Ad esempio, YOLO26n-seg è 56 volte più piccolo e oltre 1650 volte 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 ed efficiente dal punto di vista computazionale, mentre i modelli SAM eccellono nelle attività di segmentazione flessibili, guidate da prompt e zero-shot.
SAM di Ultralytics offre una funzionalità di auto-annotazione che consente di generare dataset di segmentazione utilizzando un modello di rilevamento preaddestrato. 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 i modelli di rilevamento preaddestrato e di segmentazione SAM, insieme alle specifiche del dispositivo e della directory di output. Per una guida completa, consulta Auto-annotazione.
SAM viene addestrato sull'ampio dataset SA-1B, che comprende oltre 1 miliardo di maschere distribuite su 11 milioni di immagini. SA-1B è il più grande dataset di segmentazione disponibile finora e fornisce dati di addestramento diversificati e di alta qualità, garantendo prestazioni zero-shot impressionanti in diverse attività di segmentazione. Per maggiori dettagli, visita la sezione Dataset.