Segment Anything Model (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 segmentação de imagens baseada em prompts com desempenho em tempo real, estabelecendo novos padrões na área.
Introdução ao SAM: Segment Anything Model#
O Segment Anything Model, ou SAM, é um modelo de segmentação de imagem de ponta que permite a segmentação baseada em prompts, proporcionando uma versatilidade inigualável em tarefas de análise de imagem. 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 imagem.
O design avançado do SAM permite-lhe adaptar-se a novas distribuições de imagens e tarefas sem conhecimento prévio, uma funcionalidade conhecida como transferência zero-shot. Treinado no expansivo conjunto de dados SA-1B, que contém mais de 1 milhão de máscaras distribuídas por 11 milhões de imagens cuidadosamente selecionadas, o SAM demonstrou um desempenho zero-shot impressionante, superando resultados anteriores totalmente supervisionados em muitos casos.
Imagens de Exemplo do SA-1B. Imagens do conjunto de dados sobrepostas com máscaras do recém-introduzido conjunto de dados SA-1B. O SA-1B contém 11M de imagens diversas, de alta resolução, licenciadas e protegidas pela privacidade, e 1.1B de máscaras de segmentação de alta qualidade. Estas 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 estão agrupadas pelo número de máscaras por imagem para visualização (existem ∼100 máscaras por imagem em média).
Principais Funcionalidades do Segment Anything Model (SAM)#
- Tarefa de Segmentação com Prompts: O SAM foi projetado com uma tarefa de segmentação baseada em prompts em mente, permitindo que gere máscaras de segmentação válidas a partir de qualquer prompt fornecido, como pistas espaciais ou de texto que identifiquem um objeto.
- Arquitetura Avançada: O Segment Anything Model emprega um codificador de imagem potente, um codificador de prompts e um decodificador de máscara leve. Esta arquitetura única permite a criação flexível de prompts, cálculo de máscara em tempo real e consciência de ambiguidade em tarefas de segmentação.
- O Dataset SA-1B: Introduzido pelo projeto Segment Anything, o dataset 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é à data, fornece ao SAM uma fonte de dados de treino diversificada e em grande escala.
- Desempenho Zero-Shot: O SAM exibe um desempenho zero-shot notável em várias tarefas de segmentação, tornando-se uma ferramenta pronta a usar para 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, visita o GitHub do Segment Anything e consulta o artigo de investigação Segment Anything.
O SAM alimenta a funcionalidade de anotação inteligente na Ultralytics Platform, permitindo a criação inteligente de máscaras com base em cliques para rotulagem rápida de conjuntos de dados. Consulta o guia de anotação para obter detalhes.
Modelos Disponíveis, Tarefas Suportadas e Modos de Operação#
Esta tabela apresenta os modelos disponíveis com os seus respectivos pesos pré-treinados, as tarefas que suportam e a sua compatibilidade com diferentes modos de funcionamento, como Inference, Validation, Training e Export, indicados por emojis ✅ para os modos suportados e emojis ❌ para os modos não suportados.
| Tipo de Modelo | Pesos Pré-treinados | Tarefas Suportadas | Treinamento | Validação | Inferência | 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 Imagem#
O Segment Anything Model pode ser empregue numa multiplicidade de tarefas a jusante que vão para além dos seus dados de treino. Isto inclui deteção de contornos, geração de propostas de objetos, segmentação de instâncias e previsão preliminar de texto para máscara. Com engenharia de prompts, o SAM pode adaptar-se rapidamente a novas tarefas e distribuições de dados de forma zero-shot, estabelecendo-se como uma ferramenta versátil e potente para todas as tuas necessidades de segmentação de imagens.
Exemplo de predição SAM#
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 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")- A lógica aqui é segmentar a imagem toda caso não passes nenhuns prompts (bboxes/pontos/máscaras).
Desta forma podes configurar a imagem uma vez e executar a inferência de prompts múltiplas vezes sem executar o codificador de imagem várias vezes.
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()Segmentar tudo com argumentos adicionais.
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)Todos os results devolvidos nos exemplos acima são objetos Results que permitem aceder facilmente às máscaras previstas e à imagem de origem.
- Para mais argumentos adicionais para
Segment everything, consulta a Referência dePredictor/generate.
Comparação SAM vs YOLO#
Aqui comparamos o modelo SAM-b da Meta com os modelos de segmentação Ultralytics, incluindo YOLO26n-seg:
| Modelo | Tamanho (MB) | Parâmetros (M) | Velocidade (CPU) (ms/im) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| MobileSAM | 40.7 | 10.1 | 23802 |
| FastSAM-s com backbone YOLOv8 | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (52.8x menor) | 3.4 (27.6x menos) | 24.8 (1682x mais rápido) |
| Ultralytics YOLO11n-seg | 6.2 (60.5x menor) | 2.9 (32.3x menos) | 24.3 (1716x mais rápido) |
| Ultralytics YOLO26n-seg | 6.7 (56.0x menor) | 2.7 (34.7x menos) | 25.2 (1655x mais rápido) |
Esta comparação demonstra as diferenças substanciais nos tamanhos e velocidades dos modelos entre as variantes do SAM e os modelos de segmentação YOLO. Enquanto o SAM fornece capacidades de segmentação automática únicas, os modelos YOLO, particularmente YOLOv8n-seg, YOLO11n-seg e YOLO26n-seg, são significativamente menores, mais rápidos e computacionalmente mais eficientes.
Velocidades do SAM medidas com PyTorch, velocidades do YOLO medidas com ONNX Runtime. Testes executados num Apple M4 Air de 2025 com 16 GB de RAM utilizando torch==2.10.0, ultralytics==8.4.31 e onnxruntime==1.24.4. Para reproduzir este teste:
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)
model = YOLO(onnx_path)
model(ASSETS)Auto-Anotação: Um Caminho Rápido para Datasets de Segmentação#
A anotação automática é uma funcionalidade-chave 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 precisa de um grande número de imagens, evitando a necessidade de rotulagem manual morosa.
Gera o teu Dataset de Segmentação Usando um Modelo de Deteção#
Para anotar automaticamente o teu conjunto de dados com o framework Ultralytics, usa a função auto_annotate conforme mostrado abaixo:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")| Argumento | Tipo | Predefiniçã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 | 'yolo26x.pt' | Caminho do modelo de deteção YOLO para a deteção inicial de objetos. |
sam_model | str | 'sam_b.pt' | Caminho do modelo SAM para segmentação (suporta pesos SAM, SAM 2, MobileSAM e SAM 3). |
device | str | '' | Dispositivo de computação (ex: 'cuda:0', 'cpu', ou '' para deteção automática de dispositivo). |
conf | float | 0.25 | Limiar de confiança de deteção YOLO para filtrar deteções fracas. |
iou | float | 0.45 | Limiar de IoU para Non-Maximum Suppression 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 deteções por imagem para eficiência de memória. |
classes | list[int] | None | Lista de índices de classes a detetar (por exemplo, [0, 1] para pessoa e bicicleta). |
output_dir | str | None | Diretório de destino para as anotações (predefinição: elemento irmão <data>_auto_annotate_labels). |
A função auto_annotate aceita o caminho para as tuas imagens, com argumentos opcionais para especificar os modelos de deteção pré-treinados e de segmentação SAM, o dispositivo onde executar os modelos e o diretório de saída para guardar os resultados anotados.
A autoanotaçã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 foquem no desenvolvimento e avaliação de modelos em vez da anotação manual.
Citações e Agradecimentos#
Se você achar o SAM útil em sua pesquisa ou trabalho de desenvolvimento, 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 a nossa gratidão à Meta AI por criar e manter este recurso valioso para a comunidade de visão computacional.
FAQ#
O Segment Anything Model (SAM) da Ultralytics é um modelo de segmentação de imagens revolucionário concebido para tarefas de segmentação baseadas em prompts. Tira partido de uma arquitetura avançada, incluindo codificadores de imagem e de prompt combinados com um descodificador de máscara leve, para gerar máscaras de segmentação de alta qualidade a partir de vários prompts, tais como indicações espaciais ou de texto. Treinado no expansivo conjunto de dados SA-1B, o SAM destaca-se no desempenho zero-shot, adaptando-se a novas distribuições de imagens e tarefas sem conhecimento prévio.
Você pode usar o Segment Anything Model (SAM) para segmentação de imagem executando a inferência com vários prompts, como caixas delimitadoras (bounding boxes) 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.jpgPara instruções de utilização mais detalhadas, visita a secção de Segmentação.
Em comparação com os modelos YOLO, as variantes SAM como SAM-b, MobileSAM e FastSAM-s são tipicamente maiores e mais lentas, mas oferecem capacidades de segmentação zero-shot únicas. Por exemplo, o YOLO26n-seg é 56 vezes menor e mais de 1650 vezes mais rápido do que o modelo SAM-b original da Meta num CPU. Isto torna os modelos YOLO ideais para aplicações que requerem uma segmentação rápida, leve e computacionalmente eficiente, enquanto os modelos SAM se destacam em tarefas de segmentação flexíveis, baseadas em prompts e zero-shot.
O SAM da Ultralytics oferece um recurso de autoanotaçã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="yolo26x.pt", sam_model="sam_b.pt")Esta função aceita o caminho para as tuas imagens e argumentos opcionais para modelos de deteção pré-treinados e de segmentação SAM, juntamente com especificações de dispositivo e diretório de saída. Para um guia completo, consulta Anotação Automática.
O SAM é treinado no extensivo conjunto de dados SA-1B, que compreende mais de 1 milhão 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 treino de alta qualidade e diversificados, garantindo um desempenho zero-shot impressionante em várias tarefas de segmentação. Para mais detalhes, visita a secção de Conjuntos de Dados.