Modello Segment Anything (SAM)#
Ti diamo il 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 basata su 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 basata su prompt e offre 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.
Il design avanzato 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 dimostrato prestazioni zero-shot notevoli, superando in molti casi i risultati precedenti ottenuti con supervisione completa.
Immagini di esempio SA-1B. Maschere sovrapposte alle immagini del dataset SA-1B, appena introdotto. SA-1B contiene 11M di immagini diversificate, ad alta risoluzione, con licenza e rispettose della privacy, e 1,1B di maschere di segmentazione di alta qualità. SAM ha annotato queste maschere in modo completamente automatico e, come dimostrato dalle valutazioni umane e da numerosi esperimenti, sono di alta qualità e varietà. Per la visualizzazione, le immagini sono raggruppate in base al numero di maschere per immagine (in media, ∼100 maschere per immagine).
Caratteristiche principali del Modello Segment Anything (SAM)#
- Attività di segmentazione basata su prompt: SAM è stato progettato per un'attività di segmentazione basata su prompt e può generare maschere di segmentazione valide a partire da qualsiasi prompt, ad esempio indizi spaziali o testuali che identificano un oggetto.
- Architettura avanzata: Il Modello Segment Anything utilizza un potente encoder di immagini, un encoder di prompt e un decoder di maschere leggero. Questa architettura esclusiva consente di fornire prompt in modo flessibile, calcolare maschere in tempo reale e gestire le ambiguità nelle attività di segmentazione.
- Il dataset SA-1B: Introdotto dal progetto Segment Anything, il dataset SA-1B comprende oltre 1 miliardo di maschere su 11 milioni di immagini. È il più grande dataset di segmentazione disponibile finora e fornisce a SAM una fonte di dati di addestramento ampia e diversificata.
- Prestazioni zero-shot: SAM mostra prestazioni zero-shot eccezionali in varie attività di segmentazione ed è quindi pronto all'uso per applicazioni diverse, con un'esigenza minima di prompt engineering.
Per un approfondimento sul Modello Segment Anything e sul dataset SA-1B, visita Segment Anything su GitHub e leggi l'articolo di ricerca Segment Anything.
SAM alimenta la funzionalità di annotazione intelligente sulla piattaforma Ultralytics, che consente di creare maschere intelligenti con un clic per etichettare rapidamente i dataset. Per i dettagli, consulta la guida all'annotazione.
Modelli disponibili, attività supportate e modalità operative#
Questa tabella presenta i modelli disponibili con i rispettivi pesi preaddestrati, le attività supportate e la compatibilità con le diverse modalità operative, come Inferenza, Validazione, Addestramento ed Esportazione. Le emoji ✅ indicano le modalità supportate e le emoji ❌ quelle non supportate.
| Tipo di modello | Pesi preaddestrati | Attività supportate | Addestramento | Validazione | Inferenza | Esporta |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | Segmentazione di istanze | ❌ | ❌ | ✅ | ❌ |
| SAM large | sam_l.pt | Segmentazione di istanze | ❌ | ❌ | ✅ | ❌ |
Come usare SAM: versatilità e potenza nella segmentazione delle immagini#
Il Modello Segment Anything può essere utilizzato per numerose attività a valle che vanno oltre i dati di addestramento. Tra queste rientrano il rilevamento dei bordi, la generazione di proposte di oggetti, la segmentazione di istanze e la previsione preliminare di maschere a partire da testo. Grazie al prompt engineering, SAM può adattarsi rapidamente a nuove attività e distribuzioni di dati in modalità zero-shot, diventando così uno strumento versatile e potente per tutte le tue esigenze di segmentazione delle immagini.
Esempio di predizione con SAM#
Segmenta l'immagine usando i prompt forniti.
from ultralytics import SAM
# Carica un modello
model = SAM("sam_b.pt")
# Visualizza le informazioni sul modello (facoltativo)
model.info()
# Esegui l'inferenza con il prompt dei riquadri di delimitazione
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# Esegui l'inferenza con un singolo punto
results = model(points=[900, 370], labels=[1])
# Esegui l'inferenza con più punti
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])
# Esegui l'inferenza con il prompt a più punti per oggetto
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Esegui l'inferenza con il prompt dei punti negativi
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])Segmenta l'intera immagine.
from ultralytics import SAM
# Carica un modello
model = SAM("sam_b.pt")
# Visualizza le informazioni sul modello (facoltativo)
model.info()
# Esegui l'inferenza
model("path/to/image.jpg")- La logica è segmentare l'intera immagine se non passi alcun prompt (bboxes/points/masks).
In questo modo puoi impostare l'immagine una sola volta ed eseguire l'inferenza con più prompt senza eseguire più volte l'encoder di immagini.
import cv2
from ultralytics.models.sam import Predictor as SAMPredictor
# Crea SAMPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# Imposta l'immagine
predictor.set_image("ultralytics/assets/zidane.jpg") # imposta con un file immagine
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg")) # imposta con np.ndarray
results = predictor(bboxes=[439, 437, 524, 709])
# Esegui l'inferenza con un prompt a punto singolo
results = predictor(points=[900, 370], labels=[1])
# Esegui l'inferenza con un prompt a più punti
results = predictor(points=[[400, 370], [900, 370]], labels=[1, 1])
# Esegui l'inferenza con il prompt dei punti negativi
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
# Reimposta l'immagine
predictor.reset_image()Segmenta tutto con argomenti aggiuntivi.
from ultralytics.models.sam import Predictor as SAMPredictor
# Crea SAMPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# Segmenta con argomenti aggiuntivi
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64, min_mask_region_area=100)Tutti gli oggetti results restituiti negli esempi precedenti sono oggetti Results, che consentono di accedere facilmente alle maschere predette e all'immagine sorgente.
- Per altri argomenti
Segment everything, consulta il riferimentoPredictor/generate.
Confronto tra SAM e YOLO#
Qui confrontiamo il modello SAM-b di Meta con i modelli di segmentazione Ultralytics, incluso YOLO26n-seg:
| Modello | Dimensione (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 evidenzia le notevoli differenze nelle dimensioni e nella velocità dei modelli tra le varianti SAM e i modelli di segmentazione YOLO. Sebbene SAM offra capacità uniche di segmentazione automatica, i modelli YOLO, in particolare YOLOv8n-seg, YOLO11n-seg e YOLO26n-seg, sono significativamente più piccoli, più veloci e più efficienti dal punto di vista computazionale.
Le velocità di SAM sono state misurate con PyTorch, quelle di YOLO con ONNX Runtime. I test sono stati eseguiti su un Apple M4 Air del 2025 con 16 GB di RAM usando torch==2.10.0, ultralytics==8.4.31 e onnxruntime==1.24.4. Per riprodurre questo test:
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# Confronta le prestazioni di SAM-b e MobileSAM
for file in ["sam_b.pt", "mobile_sam.pt"]:
model = SAM(file)
model.info()
model(ASSETS)
# Profilo FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# Profila i modelli YOLO (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) # Head senza NMS di YOLO26; non fa nulla per YOLOv8/YOLO11
model = YOLO(onnx_path)
model(ASSETS)Annotazione automatica: un percorso rapido verso i dataset di segmentazione#
L'annotazione automatica è una funzionalità chiave di SAM, che consente agli utenti di generare un dataset di segmentazione usando un modello di rilevamento preaddestrato. Questa funzionalità permette di annotare rapidamente e con precisione un gran numero di immagini, evitando la necessità di un'etichettatura manuale dispendiosa in termini di tempo.
Genera il tuo dataset di segmentazione usando un modello di rilevamento#
Per annotare automaticamente 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 | 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 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 soppressione non massima, usata per filtrare i riquadri sovrapposti. |
imgsz | int | 640 | Dimensione di input per ridimensionare le immagini (arrotondata al multiplo di 32 più vicino per eccesso, se necessario). |
max_det | int | 300 | Numero massimo di rilevamenti per immagine per ottimizzare l'uso della memoria. |
classes | list[int] | None | Elenco degli indici delle classi da rilevare (ad es. [0, 1] per persona e bicicletta). |
output_dir | str | None | Directory in cui salvare le annotazioni (per impostazione predefinita: directory sorella di <data>_auto_annotate_labels). |
La funzione auto_annotate accetta il percorso delle immagini e argomenti facoltativi per specificare i modelli di rilevamento preaddestrato e di segmentazione SAM, il dispositivo su cui eseguirli e la directory di output in cui salvare i risultati annotati.
L'annotazione automatica con modelli preaddestrati può ridurre drasticamente il tempo e il lavoro necessari per creare dataset di segmentazione di alta qualità. Questa funzionalità è particolarmente utile per ricercatori e sviluppatori che gestiscono grandi raccolte di immagini, perché consente loro di concentrarsi sullo sviluppo e sulla valutazione dei modelli anziché sull'annotazione manuale.
Citazioni e ringraziamenti#
Se SAM ti è utile nel tuo lavoro di ricerca o sviluppo, valuta la possibilità di citare l'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 ringraziare Meta AI per aver creato e mantenuto questa preziosa risorsa per la comunità della visione artificiale.
Domande frequenti#
Il Modello Segment Anything (SAM) di Meta è un modello rivoluzionario di segmentazione delle immagini progettato per attività di segmentazione basate su prompt. Sfrutta un'architettura avanzata, che combina encoder di immagini e di prompt con un decoder di maschere leggero, per generare maschere di segmentazione di alta qualità a partire da vari prompt, come indicazioni spaziali o testuali. Addestrato sull'ampio dataset SA-1B, SAM eccelle nelle prestazioni zero-shot e si adatta a nuove distribuzioni di immagini e attività senza conoscenze pregresse.
Puoi usare il Modello Segment Anything (SAM) per segmentare le immagini eseguendo l'inferenza con vari prompt, come riquadri di delimitazione o punti. Ecco un esempio con Python:
from ultralytics import SAM # Carica un modello model = SAM("sam_b.pt") # Segmenta con un prompt di riquadro di delimitazione model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709]) # Segmenta con un prompt a punti model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1]) # Segmenta con un prompt a più punti model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1]) # Segmenta con un prompt a più punti per oggetto model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]]) # Segmenta con un prompt a punti negativi. model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])In alternativa, puoi eseguire l'inferenza con SAM tramite l'interfaccia a riga di comando (CLI):
yolo predict model=sam_b.pt source=path/to/image.jpgPer istruzioni d'uso più dettagliate, visita la sezione sulla 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à esclusive di segmentazione zero-shot. Ad esempio, YOLO26n-seg è 56x più piccolo e oltre 1650x più veloce del modello SAM-b originale di Meta su CPU. Per questo i modelli YOLO sono ideali per applicazioni che richiedono una segmentazione rapida, leggera ed efficiente dal punto di vista computazionale, mentre i modelli SAM eccellono nelle attività di segmentazione flessibili, basate su prompt e zero-shot.
SAM di Ultralytics offre una funzionalità di annotazione automatica che consente di generare dataset di segmentazione usando 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 immagini e argomenti facoltativi per i modelli di rilevamento preaddestrato e di segmentazione SAM, oltre alle specifiche del dispositivo e della directory di output. Per una guida completa, consulta Annotazione automatica.
SAM è 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 notevoli in varie attività di segmentazione. Per maggiori dettagli, visita la sezione Dataset.