Ir para o conteúdo

Segment Anything Model (SAM)

Como usar o Segment Anything no Colab

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 promptable com desempenho em tempo real, estabelecendo novos padrões no campo.

Introdução ao SAM: O Segment Anything Model

O Segment Anything Model, ou SAM, é um modelo de segmentação de imagens de ponta que permite a segmentação promptable, proporcionando versatilidade incomparável em tarefas de análise de imagens. O SAM forma o coração da iniciativa Segment Anything, um projeto inovador que introduz um novo modelo, tarefa e conjunto de dados para segmentação de imagens.

O design avançado do SAM permite que ele se adapte a novas distribuições de imagens e tarefas sem conhecimento prévio, um recurso conhecido como transferência zero-shot. Treinado no expansivo conjunto de dados SA-1B, que contém mais de 1 bilhão de máscaras espalhadas por 11 milhões de imagens cuidadosamente selecionadas, o SAM exibiu um desempenho zero-shot impressionante, superando os resultados totalmente supervisionados anteriores em muitos casos.

Imagem de amostra do conjunto de dados Imagens de exemplo do SA-1B. Máscaras sobrepostas às imagens do conjunto de dados 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 que protegem a privacidade, e 1,1 bilhão de máscaras de segmentação de alta qualidade. Essas máscaras foram anotadas de forma totalmente automática pelo SAM e, conforme verificado por avaliações humanas e inúmeros experimentos, são de alta qualidade e diversidade. As imagens são agrupadas por número de máscaras por imagem para visualização (há ∼100 máscaras por imagem em média).

Principais Características do Segment Anything Model (SAM)

  • Tarefa de Segmentação Promptable: O SAM foi projetado com uma tarefa de segmentação promptable em mente, permitindo que ele gere máscaras de segmentação válidas a partir de qualquer prompt fornecido, como pistas espaciais ou de texto que identificam um objeto.
  • Arquitetura Avançada: O Segment Anything Model emprega um poderoso codificador de imagem, um codificador de prompt e um decodificador de máscara leve. Esta arquitetura única permite prompting flexível, computação de máscara em tempo real e reconhecimento de ambiguidade em tarefas de segmentação.
  • O Conjunto de Dados SA-1B: Apresentado pelo projeto Segment Anything, o conjunto de dados SA-1B apresenta mais de 1 bilhão de máscaras em 11 milhões de imagens. Sendo o maior conjunto de dados de segmentação até o momento, ele fornece ao SAM uma fonte de dados de treinamento diversificada e em grande escala.
  • Desempenho Zero-Shot: O SAM demonstra um desempenho zero-shot notável em várias tarefas de segmentação, tornando-o uma ferramenta pronta para uso em diversas aplicações com necessidade mínima de engenharia de prompts.

Para uma análise aprofundada do Segment Anything Model e do conjunto de dados SA-1B, visite o site do Segment Anything e confira o artigo de pesquisa Segment Anything.

Modelos Disponíveis, Tarefas Suportadas e Modos de Operação

Esta tabela apresenta os modelos disponíveis com seus pesos pré-treinados específicos, as tarefas que eles suportam e sua compatibilidade com diferentes modos de operação, como Inferência, Validação, Treinamento 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 Treinamento Exportar
SAM base sam_b.pt Segmentação de Instância
SAM grande sam_l.pt Segmentação de Instância

Como Usar o SAM: Versatilidade e Poder na Segmentação de Imagens

O Segment Anything Model pode ser empregado para uma variedade de tarefas downstream que vão além de seus dados de treinamento. Isso inclui detecção de bordas, geração de propostas de objetos, segmentação de instâncias e previsão preliminar de texto para máscara. Com a engenharia de prompts, o SAM pode se adaptar rapidamente a novas tarefas e distribuições de dados de maneira zero-shot, estabelecendo-o como uma ferramenta versátil e potente para todas as suas necessidades de segmentação de imagem.

Exemplo de previsão SAM

Segmentar com prompts

Segmentar imagem com prompts fornecidos.

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 você não passar nenhum prompt (bboxes/pontos/máscaras).

Exemplo de SAMPredictor

Desta forma, você 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 results retornados nos exemplos Resultados acima são objetos que permitem acessar as máscaras previstas e a imagem de origem facilmente.

Comparação de SAM vs YOLO

Aqui comparamos o modelo SAM-b da Meta com o menor modelo de segmentação da Ultralytics, YOLO11n-seg:

Modelo Tamanho
(MB)
Parâmetros
(M)
Velocidade (CPU)
(ms/im)
Meta SAM-b 375 93.7 49401
MobileSAM 40.7 10.1 25381
FastSAM-s com backbone YOLOv8 23.7 11.8 55.9
YOLOv8n-seg da Ultralytics 6,7 (11,7x menor) 3,4 (11,4x menos) 24.5 (1061x mais rápido)
Ultralytics YOLO11n-seg 5.9 (13,2x menor) 2.9 (13,4x menos) 30.1 (864x mais rápido)

Esta comparação demonstra as diferenças substanciais nos tamanhos e velocidades dos modelos entre as variantes SAM e os modelos de segmentação YOLO. Embora o SAM forneça recursos exclusivos de segmentação automática, os modelos YOLO, particularmente YOLOv8n-seg e YOLO11n-seg, são significativamente menores, mais rápidos e computacionalmente mais eficientes.

Testes executados em um Apple M4 Pro 2025 com 24 GB de RAM usando torch==2.6.0 e ultralytics==8.3.90. Para reproduzir este teste:

Exemplo

from ultralytics import ASSETS, SAM, YOLO, FastSAM

# Profile SAM2-t, SAM2-b, SAM-b, MobileSAM
for file in ["sam_b.pt", "sam2_b.pt", "sam2_t.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
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt"]:
    model = YOLO(file_name)
    model.info()
    model(ASSETS)

Auto-Anotação: Um Caminho Rápido para Conjuntos de Dados de Segmentação

A auto-anotação é um recurso chave do SAM, permitindo que os usuários gerem um conjunto de dados de segmentação usando um modelo de detecção pré-treinado. Este recurso permite a anotação rápida e precisa de um grande número de imagens, evitando a necessidade de rotulagem manual demorada.

Gere Seu Conjunto de Dados de Segmentação Usando um Modelo de Detecção

Para auto-anotar seu conjunto de dados com o framework Ultralytics, use a auto_annotate função conforme 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 Padrão Descrição
data str obrigatório Caminho para o diretório contendo as imagens alvo para anotação ou segmentação.
det_model str 'yolo11x.pt' Caminho do modelo de detecção de objetos YOLO para detecção de objetos inicial.
sam_model str 'sam_b.pt' Caminho do modelo SAM para segmentação (suporta variantes SAM, SAM2 e modelos mobile_sam).
device str '' Dispositivo de computação (por exemplo, 'cuda:0', 'cpu' ou '' para detecção automática de dispositivo).
conf float 0.25 Limite de confiança da detecção YOLO para filtrar detecções fracas.
iou float 0.45 Limite de IoU para Supressão Não Máxima para filtrar caixas sobrepostas.
imgsz int 640 Tamanho de entrada para redimensionar imagens (deve ser múltiplo de 32).
max_det int 300 Número máximo de detecções por imagem para eficiência de memória.
classes list[int] None Lista de índices de classe para detectar (por exemplo, [0, 1] para pessoa e bicicleta).
output_dir str None Diretório para salvar as anotações (o padrão é './labels' relativo ao caminho dos dados).

O auto_annotate A função recebe o caminho para suas imagens, com argumentos opcionais para especificar os modelos de detecção pré-treinados e de segmentação SAM, o dispositivo para executar os modelos e o diretório de saída para salvar os resultados anotados.

A auto-anotação 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. Este recurso é especialmente benéfico para pesquisadores e desenvolvedores que lidam com grandes coleções de imagens, pois permite que eles se concentrem no desenvolvimento e avaliação de modelos, em vez de na anotação manual.

Citações e Agradecimentos

Se você achar o SAM útil em seu trabalho de pesquisa ou desenvolvimento, por favor, considere citar nosso artigo:

@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 nossa gratidão à Meta AI por criar e manter este valioso recurso para a comunidade de visão computacional.

FAQ

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

O Segment Anything Model (SAM) da Ultralytics é um modelo revolucionário de segmentação de imagens projetado para tarefas de segmentação com prompts. Ele aproveita a arquitetura avançada, incluindo codificadores de imagem e prompt combinados com um decodificador de máscara leve, para gerar máscaras de segmentação de alta qualidade a partir de vários prompts, como pistas espaciais ou de texto. Treinado no extenso conjunto de dados SA-1B, o SAM se destaca no desempenho zero-shot, adaptando-se a novas distribuições de imagens e tarefas sem conhecimento prévio.

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

Você pode usar o Segment Anything Model (SAM) para segmentação de imagem executando a inferência com vários prompts, como caixas delimitadoras ou pontos. Aqui está um exemplo usando 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]])

Alternativamente, você pode executar a inferência com o SAM na interface de linha de comando (CLI):

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

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

Como os modelos SAM e YOLO se comparam em termos de desempenho?

Comparado com os modelos YOLO, as variantes SAM como SAM-b, SAM2-t, MobileSAM e FastSAM-s são normalmente maiores e mais lentas, mas oferecem capacidades únicas de segmentação zero-shot. Por exemplo, o Ultralytics YOLOv8n-seg é 11.7x menor e 1069x mais rápido do que o modelo SAM-b original da Meta, destacando a vantagem significativa do YOLO em velocidade e eficiência. Da mesma forma, o mais recente YOLO11n-seg oferece um tamanho ainda menor e mantém uma velocidade de inferência impressionante. Isso torna os modelos YOLO ideais para aplicações que exigem segmentação rápida, leve e computacionalmente eficiente, enquanto os modelos SAM se destacam em tarefas de segmentação flexíveis, com prompts e zero-shot.

Como posso auto-anotar meu conjunto de dados usando SAM?

O SAM da Ultralytics oferece um recurso de auto-anotação que permite gerar conjuntos de dados de segmentação usando um modelo de detecçã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 recebe o caminho para suas imagens e argumentos opcionais para modelos de detecção pré-treinados e segmentação SAM, juntamente com especificações de dispositivo e diretório de saída. Para um guia completo, consulte Auto-Annotation.

Quais conjuntos de dados são usados para treinar o Segment Anything Model (SAM)?

O SAM é treinado no extenso conjunto de dados SA-1B, que compreende mais de 1 bilhão de máscaras em 11 milhões de imagens. SA-1B é o maior conjunto de dados de segmentação até o momento, fornecendo dados de treinamento diversos e de alta qualidade, garantindo um desempenho impressionante de zero-shot em diversas tarefas de segmentação. Para mais detalhes, visite a seção de Dataset.



📅 Criado há 1 ano ✏️ Atualizado há 3 meses

Comentários