Saltar para o conteúdo

Modelo de qualquer segmento (SAM)

Bem-vindo à fronteira da segmentação de imagens com o Segment Anything Model, ou SAM. Este modelo revolucionário mudou o jogo ao introduzir a segmentação de imagens com desempenho em tempo real, estabelecendo novos padrões no campo.

Introdução a SAM: O modelo Segment Anything

O Segment Anything Model, ou SAM, é um modelo de segmentação de imagem de vanguarda que permite uma segmentação imediata, proporcionando uma versatilidade sem paralelo nas tarefas de análise de imagem. SAM constitui o coração da iniciativa Segment Anything, um projeto inovador que introduz um novo modelo, tarefa e conjunto de dados para a segmentação de imagens.

SAMO design avançado do permite-lhe adaptar-se a novas distribuições de imagens e tarefas sem conhecimento prévio, uma caraterística conhecida como transferência zero-shot. Treinado no vasto conjunto de dados SA-1B, que contém mais de mil milhões de máscaras espalhadas por 11 milhões de imagens cuidadosamente selecionadas, o SAM demonstrou um desempenho impressionante em zero-shot, ultrapassando em muitos casos os resultados anteriores totalmente supervisionados.

Imagem de amostra do conjunto de dados SA-1B Exemplo de imagens. Imagens do conjunto de dados sobrepostas a máscaras do recém-introduzido conjunto de dados SA-1B. O SA-1B contém 11 milhões de imagens diversas, de alta resolução, licenciadas e com proteção da privacidade e 1,1 mil máscaras de segmentação de alta qualidade. Estas máscaras foram anotadas de forma totalmente automática por SAM e, conforme verificado por avaliações humanas e numerosas experiências, são de elevada qualidade e diversidade. As imagens são agrupadas pelo número de máscaras por imagem para visualização (existem, em média, ∼100 máscaras por imagem).

Principais caraterísticas do modelo de qualquer segmento (SAM)

  • Tarefa de Segmentação de Promptable: SAM foi concebido com uma tarefa de segmentação de promptable em mente, permitindo-lhe gerar máscaras de segmentação válidas a partir de qualquer prompt dado, como pistas espaciais ou de texto que identifiquem um objeto.
  • Arquitetura avançada: O Segment Anything Model emprega um potente codificador de imagem, um codificador de solicitação e um descodificador de máscara leve. Esta arquitetura única permite uma solicitação flexível, o cálculo da máscara em tempo real e a consciência da ambiguidade nas tarefas de segmentação.
  • O conjunto de dados SA-1B: Introduzido pelo projeto Segment Anything, o conjunto de dados SA-1B apresenta mais de mil milhões de máscaras em 11 milhões de imagens. Sendo o maior conjunto de dados de segmentação até à data, fornece ao SAM uma fonte de dados de formação diversificada e em grande escala.
  • Desempenho Zero-Shot: SAM apresenta um excelente desempenho zero-shot em várias tarefas de segmentação, tornando-o numa ferramenta pronta a utilizar para diversas aplicações com uma necessidade mínima de engenharia imediata.

Para uma análise aprofundada do modelo Segment Anything e do conjunto de dados SA-1B, visite o sítio Web do Segment Anything e consulte o documento de investigação Segment Anything.

Modelos disponíveis, tarefas suportadas e modos de funcionamento

Esta tabela apresenta os modelos disponíveis com os seus pesos pré-treinados específicos, as tarefas que suportam e a sua compatibilidade com diferentes modos de funcionamento como Inferência, Validação, Treino e Exportação, indicados por emojis ✅ para modos suportados e emojis ❌ para modos não suportados.

Tipo de modelo Pesos pré-treinados Tarefas suportadas Inferência Validação Formação Exportação
SAM base sam_b.pt Segmentação de instâncias
SAM grande sam_l.pt Segmentação de instâncias

Como utilizar SAM: Versatilidade e potência na segmentação de imagens

O modelo Segment Anything pode ser utilizado para uma série de tarefas a jusante que vão para além dos seus dados de treino. Isto inclui a deteção de arestas, a geração de propostas de objectos, a segmentação de instâncias e a previsão preliminar de texto para máscara. Com uma engenharia rápida, o SAM pode adaptar-se rapidamente a novas tarefas e distribuições de dados de uma forma rápida, estabelecendo-o como uma ferramenta versátil e potente para todas as suas necessidades de segmentação de imagens.

SAM exemplo de previsão

Segmento com prompts

Segmentar a imagem com as instruções dadas.

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]])

Segmentar tudo

Segmentar a imagem inteira.

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
  • A lógica aqui é segmentar a imagem inteira se não passar nenhum prompts (bboxes/pontos/máscaras).

Exemplo de SAMPredictor

Desta forma, pode definir a imagem uma vez e executar a inferência de prompts várias vezes sem executar o codificador de imagem várias vezes.

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()

Segmentar tudo com argumentos adicionais.

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

Todos os devolvidos results nos exemplos anteriores são Resultados que permite aceder facilmente às máscaras previstas e à imagem de origem.

SAM comparação vs YOLOv8

Aqui comparamos o modelo SAM mais pequeno do Meta, SAM-b, com o modelo de segmentação mais pequeno do Ultralytics , YOLOv8n-seg:

Modelo Tamanho
(MB)
Parâmetros
(M)
Velocidade (CPU)
(ms/im)
Meta SAM-b 358 94.7 51096
MobileSAM 40.7 10.1 46122
FastSAM-s com YOLOv8 backbone 23.7 11.8 115
Ultralytics YOLOv8n-seg 6,7 (53,4x mais pequeno) 3,4 (27,9x menos) 59 (866x mais rápido)

Esta comparação mostra as diferenças de ordem de grandeza nas dimensões e velocidades dos modelos. Embora o SAM apresente capacidades únicas para segmentação automática, não é um concorrente direto dos modelos de segmento do YOLOv8 , que são mais pequenos, mais rápidos e mais eficientes.

Os testes foram efectuados num Macbook Apple M2 2023 com 16 GB de RAM. Para reproduzir este teste:

Exemplo

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 YOLOv8n-seg
model = YOLO("yolov8n-seg.pt")
model.info()
model(ASSETS)

Anotação automática: Um caminho rápido para conjuntos de dados de segmentação

A anotação automática é uma caraterística essencial do SAM, permitindo aos utilizadores gerar um conjunto de dados de segmentação utilizando um modelo de deteção pré-treinado. Esta funcionalidade permite a anotação rápida e exacta de um grande número de imagens, evitando a necessidade de uma marcação manual demorada.

Gerar o conjunto de dados de segmentação utilizando um modelo de deteção

Para anotar automaticamente o seu conjunto de dados com a estrutura Ultralytics , utilize o auto_annotate como mostrado abaixo:

Exemplo

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo11x.pt", sam_model="sam_b.pt")
Argumento Tipo Descrição Predefinição
data str Caminho para uma pasta que contém imagens a serem anotadas.
det_model str, facultativo Modelo de deteção YOLO pré-treinado. A predefinição é 'yolo11x.pt'. 'yolo11x.pt'
sam_model str, facultativo Modelo de segmentação SAM pré-treinado. A predefinição é 'sam_b.pt'. 'sam_b.pt'
device str, facultativo Dispositivo no qual os modelos devem ser executados. A predefinição é uma cadeia de caracteres vazia (CPU ou GPU, se disponível).
conf float, facultativo Limiar de confiança para o modelo de deteção; a predefinição é 0,25. 0.25
iou float, facultativo Limiar IoU para filtrar caixas sobrepostas nos resultados da deteção; a predefinição é 0,45. 0.45
imgsz int, facultativo Dimensão de redimensionamento da imagem de entrada; a predefinição é 640. 640
max_det int, facultativo Limita as detecções por imagem para controlar as saídas em cenas densas. 300
classes list, facultativo Filtra as previsões para os IDs de classe especificados, devolvendo apenas as detecções relevantes. None
output_dir str, Nenhum, facultativo Diretório para guardar os resultados anotados. A predefinição é uma pasta 'labels' no mesmo diretório que 'data'. None

O auto_annotate utiliza o caminho para as suas imagens, com argumentos opcionais para especificar os modelos de deteção pré-treinados e de segmentação SAM , o dispositivo para executar os modelos e o diretório de saída para guardar os resultados anotados.

A anotação automática com modelos pré-treinados pode reduzir drasticamente o tempo e o esforço necessários para criar conjuntos de dados de segmentação de alta qualidade. Esta funcionalidade é especialmente vantajosa para investigadores e programadores que lidam com grandes colecções de imagens, uma vez que lhes permite concentrarem-se no desenvolvimento e avaliação de modelos, em vez de na anotação manual.

Citações e agradecimentos

Se o site SAM for útil no seu trabalho de investigação ou desenvolvimento, considere a possibilidade de citar o nosso 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}
}

Gostaríamos de expressar a nossa gratidão à Meta AI pela criação e manutenção deste valioso recurso para a comunidade da visão computacional.

FAQ

O que é o modelo Segment Anything (SAM) da Ultralytics?

O Segment Anything Model (SAM) da Ultralytics é um modelo revolucionário de segmentação de imagens concebido para tarefas de segmentação que podem ser solicitadas. Aproveita uma arquitetura avançada, que inclui codificadores de imagem e de estímulo, combinados com um descodificador de máscara leve, para gerar máscaras de segmentação de alta qualidade a partir de vários estímulos, como pistas espaciais ou de texto. Treinado no extenso conjunto de dados SA-1B, o SAM é excelente no desempenho de zero-shot, adaptando-se a novas distribuições de imagens e tarefas sem conhecimento prévio. Saiba mais aqui.

Como é que posso utilizar o Segment Anything Model (SAM) para segmentação de imagens?

Pode utilizar o Segment Anything Model (SAM) para a segmentação de imagens, executando a inferência com vários avisos, como caixas delimitadoras ou pontos. Aqui está um exemplo utilizando 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]])

Em alternativa, pode executar a inferência com SAM na interface de linha de comandos (CLI):

yolo predict model=sam_b.pt source=path/to/image.jpg

Para obter instruções de utilização mais detalhadas, visite a secção Segmentação.

Como é que SAM e YOLOv8 se comparam em termos de desempenho?

Em comparação com YOLOv8, os modelos SAM como SAM-b e FastSAM-s são maiores e mais lentos, mas oferecem capacidades únicas de segmentação automática. Por exemplo, o Ultralytics YOLOv8n -seg é 53,4 vezes mais pequeno e 866 vezes mais rápido do que o SAM-b. No entanto, o desempenho de zero-shot do SAM torna-o altamente flexível e eficiente em tarefas diversas e não treinadas. Saiba mais sobre as comparações de desempenho entre SAM e YOLOv8 aqui.

Como é que posso anotar automaticamente o meu conjunto de dados utilizando SAM?

Ultralytics' SAM oferece uma funcionalidade de anotação automática que permite gerar conjuntos de dados de segmentação utilizando um modelo de deteção pré-treinado. Aqui está um exemplo em Python:

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")

Esta função utiliza o caminho para as suas imagens e argumentos opcionais para modelos de deteção pré-treinados e de segmentação SAM , juntamente com especificações do dispositivo e do diretório de saída. Para obter um guia completo, consulte Anotação automática.

Que conjuntos de dados são utilizados para treinar o Segment Anything Model (SAM)?

SAM é treinado no extenso conjunto de dados SA-1B, que inclui mais de mil milhões de máscaras em 11 milhões de imagens. O SA-1B é o maior conjunto de dados de segmentação até à data, fornecendo dados de formação de alta qualidade e diversificados, garantindo um desempenho impressionante de zero disparos em tarefas de segmentação variadas. Para mais informações, visite a secção Conjunto de dados.

📅C riado há 1 ano ✏️ Atualizado há 19 dias

Comentários