Overslaan naar inhoud

Segment Anything Model (SAM)

Welkom op de grens van beeldsegmentatie met het Segment Anything Model, of SAM. Dit revolutionaire model heeft het spel veranderd door onmiddellijke beeldsegmentatie met realtime prestaties te introduceren en zet daarmee nieuwe standaarden op dit gebied.

Inleiding tot SAM: Het Segment Anything Model

Het Segment Anything Model, of SAM, is een baanbrekend beeldsegmentatiemodel dat onmiddellijke segmentatie mogelijk maakt, wat ongeëvenaarde veelzijdigheid biedt in beeldanalysetaken. SAM vormt het hart van het Segment Anything initiatief, een baanbrekend project dat een nieuw model, taak en dataset voor beeldsegmentatie introduceert.

SAMHet geavanceerde ontwerp zorgt ervoor dat het zich kan aanpassen aan nieuwe beeldverdelingen en taken zonder voorkennis, een eigenschap die bekend staat als zero-shot overdracht. Getraind op de uitgebreide SA-1B dataset, die meer dan 1 miljard maskers bevat verspreid over 11 miljoen zorgvuldig gecureerde afbeeldingen, heeft SAM indrukwekkende zero-shot prestaties laten zien, die eerdere volledig supervised resultaten in veel gevallen overtreffen.

Voorbeeldafbeelding dataset SA-1B Voorbeeldafbeeldingen. Afbeeldingen van de dataset met overlappende maskers van de onlangs geïntroduceerde SA-1B dataset. SA-1B bevat 11 miljoen verschillende afbeeldingen met een hoge resolutie, licentie en privacybescherming en 1,1 miljard segmentatiemaskers van hoge kwaliteit. Deze maskers zijn volledig automatisch geannoteerd door SAM en zijn, zoals geverifieerd door menselijke beoordelingen en talrijke experimenten, van hoge kwaliteit en diversiteit. Afbeeldingen zijn gegroepeerd op het aantal maskers per afbeelding voor visualisatie (gemiddeld zijn er ∼100 maskers per afbeelding).

Belangrijkste kenmerken van het Segment Anything Model (SAM)

  • Segmentatietaak op verzoek: SAM is ontworpen met een segmentatietaak op verzoek in gedachten, waardoor het geldige segmentatiemaskers kan genereren vanaf elk gegeven verzoek, zoals ruimtelijke of tekstuele aanwijzingen die een object identificeren.
  • Geavanceerde architectuur: Het Segment Anything Model maakt gebruik van een krachtige afbeeldingsencoder, een prompt-encoder en een lichtgewicht maskerdecoder. Deze unieke architectuur maakt flexibele prompting, real-time maskerberekening en ambiguïteitsbewustzijn bij segmentatietaken mogelijk.
  • De SA-1B dataset: De SA-1B dataset, geïntroduceerd door het Segment Anything project, bevat meer dan 1 miljard maskers op 11 miljoen afbeeldingen. Het is de grootste segmentatiedataset tot nu toe en biedt SAM een diverse en grootschalige trainingsbron.
  • Nul-opname-prestaties: SAM laat uitstekende nul-opname-prestaties zien bij diverse segmentatietaken, waardoor het een gebruiksklaar hulpmiddel is voor diverse toepassingen met minimale behoefte aan snelle engineering.

Ga voor een diepgaande blik op het Segment Anything Model en de SA-1B dataset naar de Segment Anything website en bekijk het onderzoeksartikel Segment Anything.

Beschikbare modellen, ondersteunde taken en bedrijfsmodi

Deze tabel toont de beschikbare modellen met hun specifieke voorgetrainde gewichten, de taken die ze ondersteunen en hun compatibiliteit met verschillende bedrijfsmodi zoals Inferentie, Validatie, Training en Exporteren, aangegeven met ✅ emoji's voor ondersteunde modi en ❌ emoji's voor niet-ondersteunde modi.

Type model Voorgetrainde gewichten Ondersteunde taken Inferentie Validatie Training Exporteer
SAM basis sam_b.pt Instance segmentatie
SAM groot sam_l.pt Instance segmentatie

Hoe SAM te gebruiken: veelzijdigheid en kracht in beeldsegmentatie

Het Segment Anything Model kan worden gebruikt voor een groot aantal downstream taken die verder gaan dan de trainingsgegevens. Dit omvat randdetectie, het genereren van objectvoorstellen, segmentatie van instanties en het voorspellen van tekst naar masker. Met snelle engineering kan SAM zich snel aanpassen aan nieuwe taken en gegevensdistributies, waardoor het een veelzijdig en krachtig hulpmiddel wordt voor al je beeldsegmentatiebehoeften.

SAM voorspellingsvoorbeeld

Segment met aanwijzingen

Segmenteer de afbeelding met de gegeven aanwijzingen.

from ultralytics import SAM

# Load a model
model = SAM('sam_b.pt')

# Display model information (optional)
model.info()

# Run inference with bboxes prompt
model('ultralytics/assets/zidane.jpg', bboxes=[439, 437, 524, 709])

# Run inference with points prompt
model('ultralytics/assets/zidane.jpg', points=[900, 370], labels=[1])

Alles segmenteren

Segmenteer de hele afbeelding.

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
  • De logica hier is om de hele afbeelding te segmenteren als je geen aanwijzingen (bboxen/punten/maskers) doorgeeft.

SAMPredictor voorbeeld

Op deze manier kun je de afbeelding één keer instellen en de inferentie van prompts meerdere keren uitvoeren zonder dat je de afbeeldingsencoder meerdere keren hoeft te draaien.

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])
results = predictor(points=[900, 370], labels=[1])

# Reset image
predictor.reset_image()

Segmenteer alles met extra argumenten.

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)

SAM vergelijking vs YOLOv8

Hier vergelijken we Meta's kleinste SAM model, SAM-b, met Ultralytics kleinste segmentatiemodel, YOLOv8n-seg:

Model Maat Parameters Snelheid (CPU)
Meta's SAM-b 358 MB 94.7 M 51096 ms/im
MobileSAM 40,7 MB 10.1 M 46122 ms/im
FastSAM-s met YOLOv8 ruggengraat 23,7 MB 11.8 M 115 ms/im
Ultralytics YOLOv8n-seg 6,7 MB (53,4x kleiner) 3,4 M (27,9x minder) 59 ms/im (866x sneller)

Deze vergelijking toont de orde van grootte verschillen in modelgrootte en snelheid tussen de modellen. Hoewel SAM unieke mogelijkheden biedt voor automatisch segmenteren, is het geen directe concurrent voor YOLOv8 segmentmodellen, die kleiner, sneller en efficiënter zijn.

De tests zijn uitgevoerd op een 2023 Apple M2 Macbook met 16 GB RAM. Om deze test te reproduceren:

Voorbeeld

from ultralytics import FastSAM, SAM, YOLO

# Profile SAM-b
model = SAM('sam_b.pt')
model.info()
model('ultralytics/assets')

# Profile MobileSAM
model = SAM('mobile_sam.pt')
model.info()
model('ultralytics/assets')

# Profile FastSAM-s
model = FastSAM('FastSAM-s.pt')
model.info()
model('ultralytics/assets')

# Profile YOLOv8n-seg
model = YOLO('yolov8n-seg.pt')
model.info()
model('ultralytics/assets')

Auto-Annotatie: Een snel pad naar segmentatiedatasets

Auto-annotatie is een belangrijke functie van SAM, waarmee gebruikers een segmentatiedataset kunnen genereren met behulp van een vooraf getraind detectiemodel. Deze functie maakt snelle en nauwkeurige annotatie van een groot aantal afbeeldingen mogelijk, waardoor tijdrovende handmatige labeling overbodig wordt.

Je segmentatiedataset genereren met behulp van een detectiemodel

Om je dataset automatisch te annoteren met het Ultralytics framework, gebruik je het auto_annotate functie zoals hieronder getoond:

Voorbeeld

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model='sam_b.pt')
Argument Type Beschrijving Standaard
gegevens str Pad naar een map met afbeeldingen die geannoteerd moeten worden.
det_model str, optioneel Voorgetraind YOLO detectiemodel. Standaard ingesteld op 'yolov8x.pt'. 'yolov8x.pt'
sam_model str, optioneel Voorgetraind SAM segmentatiemodel. Standaard ingesteld op 'sam_b.pt'. sam_b.pt
apparaat str, optioneel Apparaat om de modellen op uit te voeren. Standaard een lege string (CPU of GPU, indien beschikbaar).
uitvoer_dir str, Geen, optioneel Directory om de geannoteerde resultaten op te slaan. Standaard een map 'labels' in dezelfde map als 'gegevens'. Geen

De auto_annotate De functie neemt het pad naar je afbeeldingen, met optionele argumenten voor het specificeren van de voorgetrainde detectie- en SAM segmentatiemodellen, het apparaat om de modellen op uit te voeren en de uitvoermap voor het opslaan van de geannoteerde resultaten.

Auto-annotatie met voorgetrainde modellen kan de tijd en moeite die nodig zijn voor het maken van segmentatiedatasets van hoge kwaliteit drastisch verminderen. Deze functie is vooral gunstig voor onderzoekers en ontwikkelaars die te maken hebben met grote beeldcollecties, omdat ze zich kunnen richten op modelontwikkeling en evaluatie in plaats van handmatige annotatie.

Citaten en Erkenningen

Als je SAM nuttig vindt in je onderzoek of ontwikkelingswerk, overweeg dan om ons artikel te citeren:

@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}
}

We willen graag onze dank uitspreken aan Meta AI voor het maken en onderhouden van deze waardevolle bron voor de computer vision gemeenschap.

trefwoorden: Segment Anything, Segment Anything Model, SAM, Meta SAM, beeldsegmentatie, promptable segmentatie, zero-shot prestaties, SA-1B dataset, geavanceerde architectuur, auto-annotatie, Ultralytics, voorgetrainde modellen, SAM basis, SAM groot, instantie segmentatie, computer vision, AI, kunstmatige intelligentie, machine learning, data annotatie, segmentatiemaskers, detectiemodel, YOLO detectiemodel, bibtex, Meta AI.



Aangemaakt 2023-11-12, Bijgewerkt 2024-04-17
Auteurs: glenn-jocher (10), ChaoningZhang (1), Laughing-q (1)

Reacties