Ultralytics YOLO27:

SAM 2: Modelo Segment Anything 2#

Evolução do SAM

SAM 2 baseia-se no SAM original, com capacidades de segmentação de vídeo. Para a segmentação de conceitos solicitável com prompts exemplares de texto e imagem, consulta o SAM 3.

Inference with Segment Anything 2 In Colab

O SAM 2, sucessor do Segment Anything Model (SAM) da Meta, é uma ferramenta de ponta concebida para a segmentação abrangente de objetos em imagens e vídeos. Destaca-se no processamento de dados visuais complexos através de uma arquitetura de modelo unificada e solicitável, que suporta processamento em tempo real e generalização zero-shot.

SAM 2 na Ultralytics Platform

Os modelos SAM 2.1 alimentam a funcionalidade de anotação inteligente na Ultralytics Platform, permitindo a segmentação baseada em cliques para uma etiquetagem rápida de conjuntos de dados. Consulta o guia de anotação para obteres mais detalhes.

Resultados de exemplo do SAM 2

Principais funcionalidades#



Watch: How to Run Inference with Meta's SAM2 using Ultralytics | Step-by-Step Guide 🎉

Arquitetura de Modelo Unificada#

O SAM 2 combina as capacidades de segmentação de imagens e vídeos num único modelo. Esta unificação simplifica a implementação e permite um desempenho consistente em diferentes tipos de suporte. Utiliza uma interface flexível baseada em prompts, permitindo especificar objetos de interesse através de vários tipos de prompts, como pontos, caixas delimitadoras ou máscaras.

Desempenho em Tempo Real#

O modelo alcança velocidades de inferência em tempo real, processando aproximadamente 44 fotogramas por segundo. Isto torna o SAM 2 adequado para aplicações que exigem feedback imediato, como edição de vídeo e realidade aumentada.

Generalização Zero-Shot#

O SAM 2 consegue segmentar objetos que nunca encontrou antes, demonstrando uma forte generalização zero-shot. Isto é particularmente útil em domínios visuais diversificados ou em evolução, onde as categorias predefinidas podem não abranger todos os objetos possíveis.

Refinamento Interativo#

Podes refinar iterativamente os resultados da segmentação fornecendo prompts adicionais, permitindo um controlo preciso sobre o resultado. Esta interatividade é essencial para afinar os resultados em aplicações como anotação de vídeo ou imagiologia médica.

Gestão Avançada de Desafios Visuais#

O SAM 2 inclui mecanismos para gerir desafios comuns da segmentação de vídeo, como a oclusão e o reaparecimento de objetos. Utiliza um mecanismo de memória sofisticado para acompanhar os objetos entre fotogramas, garantindo a continuidade mesmo quando os objetos ficam temporariamente ocultos ou saem e voltam a entrar na cena.

Para compreenderes melhor a arquitetura e as capacidades do SAM 2, consulta o artigo de investigação sobre o SAM 2.

Desempenho e Detalhes Técnicos#

O SAM 2 estabelece um novo padrão no setor, superando modelos anteriores em várias métricas:

MétricaSAM 2SOTA anterior
Segmentação Interativa de VídeoMelhor-
Interações Humanas Necessárias3x menosReferência
Precisão da Segmentação de ImagensMelhoradaSAM
Velocidade de Inferência6x mais rápidoSAM

Arquitetura do modelo#

Componentes principais#

  • Codificador de Imagens e Vídeo: Utiliza uma arquitetura baseada em Transformer para extrair características de alto nível de imagens e fotogramas de vídeo. Este componente é responsável por compreender o conteúdo visual em cada instante.
  • Codificador de Prompts: Processa os prompts fornecidos pelo utilizador (pontos, caixas, máscaras) para orientar a tarefa de segmentação. Isto permite ao SAM 2 adaptar-se à entrada do utilizador e direcionar objetos específicos numa cena.
  • Mecanismo de Memória: Inclui um codificador de memória, um banco de memória e um módulo de atenção de memória. Em conjunto, estes componentes armazenam e utilizam informações de fotogramas anteriores, permitindo ao modelo manter um acompanhamento consistente de objetos ao longo do tempo.
  • Descodificador de Máscaras: Gera as máscaras de segmentação finais com base nas características da imagem codificadas e nos prompts. Em vídeo, também utiliza o contexto da memória para garantir um acompanhamento preciso entre fotogramas.

Diagrama da Arquitetura do SAM 2

Mecanismo de Memória e Gestão de Oclusões#

O mecanismo de memória permite ao SAM 2 lidar com dependências temporais e oclusões em dados de vídeo. À medida que os objetos se movem e interagem, o SAM 2 regista as suas características num banco de memória. Quando um objeto fica ocluído, o modelo pode utilizar esta memória para prever a sua posição e aparência quando reaparece. A cabeça de oclusão trata especificamente de cenários em que os objetos não estão visíveis, prevendo a probabilidade de um objeto estar ocluído.

Resolução de Ambiguidades de Múltiplas Máscaras#

Em situações ambíguas (por exemplo, objetos sobrepostos), o SAM 2 pode gerar várias previsões de máscaras. Esta funcionalidade é crucial para representar com precisão cenas complexas nas quais uma única máscara pode não descrever suficientemente as suas nuances.

Conjunto de Dados SA-V#

O conjunto de dados SA-V, desenvolvido para o treino do SAM 2, é um dos maiores e mais diversificados conjuntos de dados de segmentação de vídeo disponíveis. Inclui:

  • Mais de 51 000 vídeos: Captados em 47 países, fornecendo uma ampla variedade de cenários do mundo real.
  • Mais de 600 000 anotações de máscaras: Anotações detalhadas de máscaras espaço-temporais, designadas por "masklets", que abrangem objetos inteiros e partes de objetos.
  • Escala do conjunto de dados: Apresenta 4,5 vezes mais vídeos e 53 vezes mais anotações do que os maiores conjuntos de dados anteriores, oferecendo uma diversidade e complexidade sem precedentes.

Benchmarks#

Segmentação de Objetos em Vídeo#

O SAM 2 demonstrou um desempenho superior nos principais benchmarks de segmentação de vídeo:

Conjunto de dadosJ&FJF
DAVIS 201782.579.885.2
YouTube-VOS81.278.983.5

Segmentação Interativa#

Nas tarefas de segmentação interativa, o SAM 2 demonstra uma eficiência e precisão significativas:

Conjunto de dadosNoC@90AUC
DAVIS Interativo1.540.872

Instalação#

Para instalares o SAM 2, utiliza o comando seguinte. Todos os modelos SAM 2 serão transferidos automaticamente na primeira utilização.

pip install ultralytics

Como Utilizar o SAM 2: Versatilidade na Segmentação de Imagens e Vídeos#

A tabela seguinte detalha os modelos SAM 2 disponíveis, os respetivos pesos pré-treinados, as tarefas suportadas e a compatibilidade com diferentes modos de operação, como Inferência, Validação, Treino e Exportação.

Tipo de modeloPesos pré-treinadosTarefas suportadasTreinoValidaçãoInferênciaExportação
SAM 2 pequenosam2_t.ptSegmentação de instâncias
SAM 2 compactosam2_s.ptSegmentação de instâncias
SAM 2 basesam2_b.ptSegmentação de instâncias
SAM 2 grandesam2_l.ptSegmentação de instâncias
SAM 2.1 pequenosam2.1_t.ptSegmentação de instâncias
SAM 2.1 compactosam2.1_s.ptSegmentação de instâncias
SAM 2.1 basesam2.1_b.ptSegmentação de instâncias
SAM 2.1 grandesam2.1_l.ptSegmentação de instâncias

Exemplos de Predições do SAM 2#

O SAM 2 pode ser utilizado numa ampla variedade de tarefas, incluindo edição de vídeo em tempo real, imagiologia médica e sistemas autónomos. A sua capacidade de segmentar dados visuais estáticos e dinâmicos torna-o uma ferramenta versátil para investigadores e programadores.

Segmentar com Prompts#

Segmentar com Prompts

Utiliza prompts para segmentar objetos específicos em imagens ou vídeos.

from ultralytics import SAM

# Load a model
model = SAM("sam2.1_b.pt")

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

# Run inference with bboxes prompt
results = model("path/to/image.jpg", bboxes=[100, 100, 200, 200])

# 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 Tudo

Segmenta todo o conteúdo da imagem ou do vídeo sem prompts específicos.

from ultralytics import SAM

# Load a model
model = SAM("sam2.1_b.pt")

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

# Run inference
model("path/to/video.mp4")

Segmentar Vídeo e Acompanhar Objetos#

Segmentar Vídeo

Segmenta todo o conteúdo do vídeo com prompts específicos e acompanha os objetos.

from ultralytics.models.sam import SAM2VideoPredictor

# Create SAM2VideoPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "sam2_b.pt"}
predictor = SAM2VideoPredictor(overrides=overrides)

# Run inference with single point
results = predictor(source="test.mp4", points=[920, 470], labels=[1])

# Run inference with multiple points
results = predictor(source="test.mp4", points=[[920, 470], [909, 138]], labels=[1, 1])

# Run inference with multiple points prompt per object
results = predictor(source="test.mp4", points=[[[920, 470], [909, 138]]], labels=[[1, 1]])

# Run inference with negative points prompt
results = predictor(source="test.mp4", points=[[[920, 470], [909, 138]]], labels=[[1, 0]])
  • Este exemplo demonstra como o SAM 2 pode ser utilizado para segmentar todo o conteúdo de uma imagem ou vídeo quando não são fornecidos prompts (bboxes/pontos/máscaras).

Segmentação e Acompanhamento Interativos Dinâmicos#

SAM2DynamicInteractivePredictor é uma extensão avançada sem necessidade de treino do SAM 2 que permite a interação dinâmica com múltiplos quadros e capacidades de aprendizagem contínua. Este preditor suporta atualizações de prompt em tempo real e gestão de memória para um melhor desempenho de rastreio ao longo de uma sequência de imagens. Em comparação com o SAM 2 original, SAM2DynamicInteractivePredictor reconstrói o fluxo de inferência para tirar o máximo partido dos modelos SAM 2 pré-treinados sem exigir treino adicional.

Resultados de exemplo do SAM 2

Principais funcionalidades#

Oferece três melhorias significativas:

  1. Interação Dinâmica: Adiciona novos prompts para fundir instâncias ou acompanhar novas instâncias não acompanhadas nos fotogramas seguintes, a qualquer momento durante o processamento do vídeo
  2. Aprendizagem Contínua: Adiciona novos prompts para instâncias existentes, de modo a melhorar o desempenho do modelo ao longo do tempo
  3. Suporte Independente a Várias Imagens: Processa várias imagens independentes (não necessariamente provenientes de uma sequência de vídeo) com partilha de memória e acompanhamento de objetos entre imagens

Capacidades Principais#

  • Flexibilidade dos Prompts: Aceita caixas delimitadoras, pontos e máscaras como prompts
  • Gestão do Banco de Memória: Mantém um banco de memória dinâmico para armazenar os estados dos objetos entre fotogramas
  • Acompanhamento de Vários Objetos: Suporta o acompanhamento simultâneo de vários objetos com IDs de objeto individuais
  • Atualizações em tempo real: Permite adicionar novos prompts durante a inferência sem reprocessar os frames anteriores
  • Processamento independente de imagens: Processa imagens independentes com contexto de memória compartilhada para manter a consistência dos objetos entre imagens
Adição dinâmica de objetos
from ultralytics.models.sam import SAM2DynamicInteractivePredictor

# Create SAM2DynamicInteractivePredictor
overrides = {"conf": 0.01, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "sam2_t.pt", "save": False}
predictor = SAM2DynamicInteractivePredictor(overrides=overrides, max_obj_num=10)

# Define a category by box prompt
predictor(source="image1.jpg", bboxes=[[100, 100, 200, 200]], obj_ids=[0], update_memory=True)

# Detect this particular object in a new image
results = predictor(source="image2.jpg")

# Add new category with a new object ID
results = predictor(
    source="image4.jpg",
    bboxes=[[300, 300, 400, 400]],  # New object
    obj_ids=[1],  # New object ID
    update_memory=True,  # Add to memory
)
# Perform inference
results = predictor(source="image5.jpg")

# Add refinement prompts to the same category to boost performance
# This helps when object appearance changes significantly
results = predictor(
    source="image6.jpg",
    points=[[150, 150]],  # Refinement point
    labels=[1],  # Positive point
    obj_ids=[1],  # Same object ID
    update_memory=True,  # Update memory with new information
)
# Perform inference on new image
results = predictor(source="image7.jpg")
Nota

O SAM2DynamicInteractivePredictor foi concebido para funcionar com modelos SAM 2 e suporta a adição e refinamento de categorias com todos os box, point, and mask prompts que o SAM 2 suporta de forma nativa. É particularmente útil para cenários onde os objetos aparecem ou mudam ao longo do tempo, como em tarefas de anotação de vídeo ou edição interativa.

Argumentos#

NomeValor predefinidoTipo de dadosDescrição
max_obj_num3intNúmero máximo predefinido de categorias
update_memoryFalseboolIndica se a memória deve ser atualizada com novos prompts
obj_idsNoneList[int]Lista de IDs de objetos correspondentes aos prompts

Casos de uso#

SAM2DynamicInteractivePredictor é ideal para:

  • Fluxos de trabalho de anotação de vídeos nos quais novos objetos aparecem durante a sequência
  • Edição interativa de vídeos que exige a adição e o refinamento de objetos em tempo real
  • Aplicações de vigilância que precisam de rastreamento dinâmico de objetos
  • Imagiologia médica para rastrear estruturas anatómicas ao longo de séries temporais
  • Sistemas autónomos que exigem deteção e rastreamento adaptativos de objetos
  • Datasets com várias imagens para segmentação consistente de objetos em imagens independentes
  • Análise de coleções de imagens na qual os objetos precisam de ser rastreados em diferentes cenas
  • Segmentação entre domínios que aproveita a memória de diversos contextos de imagem
  • Anotação semiautomática para criar datasets de forma eficiente, com intervenção manual mínima

Comparação entre SAM e YOLO#

Aqui comparamos os modelos SAM 2 da Meta, incluindo a menor variante SAM2-t, com os modelos de segmentação da Ultralytics, incluindo YOLO26n-seg:

ModeloTamanho
(MB)
Parâmetros
(M)
Velocidade (CPU)
(ms/im)
Meta SAM-b37593.741703
Meta SAM2-b16280.828867
Meta SAM2-t78.138.923430
MobileSAM40.710.123802
FastSAM-s com backbone YOLOv823.911.858.0
Ultralytics YOLOv8n-seg7,1 (11,0x menor)3,4 (11,4x menos)24,8 (945x mais rápido)
Ultralytics YOLO11n-seg6.2 (12.6x menor)2,9 (13,4x menos)24.3 (964x mais rápido)
Ultralytics YOLO26n-seg6,7 (11,7x menor)2.7 (14.4x menos)25,2 (930x mais rápido)

Esta comparação demonstra as diferenças substanciais entre as variantes do SAM e os modelos de segmentação YOLO em termos de tamanho e velocidade. Embora o SAM ofereça capacidades únicas de segmentação automática, os modelos YOLO, particularmente YOLOv8n-seg, YOLO11n-seg e YOLO26n-seg, são significativamente menores, mais rápidos e mais eficientes em termos computacionais.

As velocidades do SAM foram medidas com PyTorch, e as velocidades do YOLO foram medidas com ONNX Runtime. Os testes foram executados num Apple M4 Air de 2025 com 16 GB de RAM, usando torch==2.10.0, ultralytics==8.4.31 e onnxruntime==1.24.4. 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 (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)  # YOLO26 NMS-free head; no-op for YOLOv8/YOLO11
    model = YOLO(onnx_path)
    model(ASSETS)

Anotação automática: criação eficiente de datasets#

A anotação automática é uma funcionalidade poderosa do SAM 2 que permite gerar datasets de segmentação de forma rápida e precisa, aproveitando modelos pré-treinados. Esta capacidade é particularmente útil para criar datasets grandes e de alta qualidade sem um esforço manual significativo.

Como fazer anotações automáticas com SAM 2#



Watch: Auto Annotation with Meta's Segment Anything 2 Model using Ultralytics | Data Labeling

Para fazer anotações automáticas no teu dataset usando SAM 2, segue este exemplo:

Exemplo de anotação automática
from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam2_b.pt")
ArgumentoTipoPredefiniçãoDescrição
datastrobrigatórioCaminho para o diretório que contém as imagens-alvo para anotação ou segmentação.
det_modelstr'yolo26x.pt'Caminho para o modelo de deteção YOLO usado na deteção inicial de objetos.
sam_modelstr'sam_b.pt'Caminho para o modelo SAM usado na segmentação (suporta pesos de SAM, SAM 2, MobileSAM e SAM 3).
devicestr''Dispositivo de computação (por exemplo, 'cuda:0', 'cpu' ou '' para deteção automática do dispositivo).
conffloat0.25Limiar de confiança da deteção YOLO para filtrar deteções fracas.
ioufloat0.45Limiar de IoU para a supressão não máxima, usado para filtrar caixas sobrepostas.
imgszint640Tamanho de entrada para redimensionar as imagens (tem de ser múltiplo de 32).
max_detint300Número máximo de deteções por imagem para garantir eficiência de memória.
classeslist[int]NoneLista de índices de classes a detetar (por exemplo, [0, 1] para pessoa e bicicleta).
output_dirstrNoneDiretório onde guardar as anotações (por predefinição: diretório irmão de <data>_auto_annotate_labels).

Esta função facilita a criação rápida de datasets de segmentação de alta qualidade, ideal para investigadores e programadores que pretendem acelerar os seus projetos.

Limitações#

Apesar dos seus pontos fortes, o SAM 2 tem algumas limitações:

  • Estabilidade do rastreamento: O SAM 2 pode perder o rastreamento dos objetos durante sequências longas ou mudanças significativas do ponto de vista.
  • Confusão entre objetos: Por vezes, o modelo pode confundir objetos de aparência semelhante, sobretudo em cenas com muita aglomeração.
  • Eficiência com vários objetos: A eficiência da segmentação diminui ao processar vários objetos simultaneamente devido à ausência de comunicação entre objetos.
  • Precisão dos detalhes: Pode não detetar detalhes finos, especialmente em objetos que se movem rapidamente. Prompts adicionais podem resolver parcialmente este problema, mas a suavidade temporal não é garantida.

Citações e agradecimentos#

Se o SAM 2 for uma parte essencial do teu trabalho de investigação ou desenvolvimento, cita-o usando a seguinte referência:

Citação
@article{ravi2024sam2,
  title={SAM 2: Segment Anything in Images and Videos},
  author={Ravi, Nikhila and Gabeur, Valentin and Hu, Yuan-Ting and Hu, Ronghang and Ryali, Chaitanya and Ma, Tengyu and Khedr, Haitham and R{\"a}dle, Roman and Rolland, Chloe and Gustafson, Laura and Mintun, Eric and Pan, Junting and Alwala, Kalyan Vasudev and Carion, Nicolas and Wu, Chao-Yuan and Girshick, Ross and Doll{\'a}r, Piotr and Feichtenhofer, Christoph},
  journal={arXiv preprint},
  year={2024}
}

Agradecemos à Meta AI pelas suas contribuições para a comunidade de IA com este modelo e dataset inovadores.

Perguntas frequentes#

  • O SAM 2, sucessor do Modelo Segment Anything (SAM) da Meta, é uma ferramenta avançada concebida para a segmentação abrangente de objetos em imagens e vídeos. Destaca-se no processamento de dados visuais complexos através de uma arquitetura de modelo unificada e orientável por prompts, que suporta processamento em tempo real e generalização zero-shot. O SAM 2 oferece várias melhorias em relação ao SAM original, incluindo:

    • Arquitetura de modelo unificada: Combina capacidades de segmentação de imagens e vídeos num único modelo.
    • Desempenho em tempo real: Processa aproximadamente 44 frames por segundo, sendo adequado para aplicações que exigem feedback imediato.
    • Generalização zero-shot: Segmenta objetos que nunca encontrou antes, sendo útil em diversos domínios visuais.
    • Refinamento interativo: Permite refinar iterativamente os resultados da segmentação fornecendo prompts adicionais.
    • Gestão avançada de desafios visuais: Lida com desafios comuns da segmentação de vídeos, como oclusão e reaparecimento de objetos.

    Para obter mais detalhes sobre a arquitetura e as capacidades do SAM 2, consulta o artigo de investigação sobre o SAM 2.

  • O SAM 2 pode ser utilizado para segmentação de vídeos em tempo real aproveitando a sua interface orientável por prompts e as suas capacidades de inferência em tempo real. Aqui tens um exemplo básico:

    Segmentar com Prompts

    Utiliza prompts para segmentar objetos específicos em imagens ou vídeos.

    from ultralytics import SAM
    
    # Load a model
    model = SAM("sam2_b.pt")
    
    # Display model information (optional)
    model.info()
    
    # Segment with bounding box prompt
    results = model("path/to/image.jpg", bboxes=[100, 100, 200, 200])
    
    # Segment with point prompt
    results = model("path/to/image.jpg", points=[150, 150], labels=[1])

    Para uma utilização mais abrangente, consulta a secção Como usar o SAM 2.

  • O SAM 2 é treinado no dataset SA-V, um dos maiores e mais diversificados datasets de segmentação de vídeos disponíveis. O dataset SA-V inclui:

    • Mais de 51 000 vídeos: Captados em 47 países, fornecendo uma ampla variedade de cenários do mundo real.
    • Mais de 600 000 anotações de máscaras: Anotações detalhadas de máscaras espaço-temporais, designadas por "masklets", que abrangem objetos inteiros e partes de objetos.
    • Escala do dataset: Contém 4,5 vezes mais vídeos e 53 vezes mais anotações do que os maiores datasets anteriores, oferecendo uma diversidade e complexidade sem precedentes.

    Este dataset abrangente permite ao SAM 2 alcançar um desempenho superior nos principais benchmarks de segmentação de vídeos e melhora as suas capacidades de generalização zero-shot. Para obter mais informações, consulta a secção Dataset SA-V.

  • O SAM 2 inclui um mecanismo de memória sofisticado para gerir dependências temporais e oclusões em dados de vídeo. O mecanismo de memória é composto por:

    • Codificador de memória e banco de memória: Armazena características de frames anteriores.
    • Módulo de atenção da memória: Utiliza as informações armazenadas para manter um rastreamento consistente dos objetos ao longo do tempo.
    • Cabeça de oclusão: Lida especificamente com cenários nos quais os objetos não estão visíveis, prevendo a probabilidade de um objeto estar oculto.

    Este mecanismo garante a continuidade mesmo quando os objetos ficam temporariamente ocultos ou saem e voltam a entrar na cena. Para obter mais detalhes, consulta a secção Mecanismo de memória e gestão de oclusões.

  • Os modelos SAM 2, como o SAM2-t e o SAM2-b da Meta, oferecem capacidades avançadas de segmentação zero-shot, mas são significativamente maiores e mais lentos em comparação com os modelos YOLO. Por exemplo, o YOLO26n-seg é aproximadamente 24 vezes menor e mais de 1145 vezes mais rápido do que o SAM2-b em CPU. Embora o SAM 2 se destaque em cenários versáteis de segmentação baseada em prompts e zero-shot, o YOLO26 é otimizado para velocidade, eficiência e aplicações em tempo real com inferência de ponta a ponta sem NMS, sendo mais adequado para implementação em ambientes com recursos limitados.

Comentários