DINOv2
O DINOv2 é um vision transformer auto-supervisionado treinado pela Meta AI para produzir features de imagem de uso geral sem rótulos. O LibreYOLO empacota seu backbone DINOv2-with-Registers para três tarefas: segmentação semântica, classificação e embedding de imagem inteira.
- Tarefas
- semantic, classify, embed
- Tamanhos
- n, s, m, l at 518 px
- Instalação
pip install libreyolo- Nível de suporte
- Compatível, desde a v. Modelos treináveis complementares: mantidos verdes na CI, com recursos incorporados quando há oportunidade.
- Origem
- DINOv2 por Meta AI (FAIR), Apache-2.0. Artigo, código-fonte
- Licenças
- Código MIT, pesos Apache-2.0. Uso comercial
Instalação
O LibreDINOv2 só é registrado quando transformers está instalado, a mesma
dependência opcional que o RF-DETR precisa para seu backbone DINOv2, então ele
precisa do mesmo extra.
pip install "libreyolo[rfdetr]"Predição
O LibreYOLO não publica um checkpoint LibreDINOv2. Construa o wrapper
diretamente em vez de carregar um arquivo: model_path=None (o padrão) baixa
o backbone Apache-2.0 facebook/dinov2-with-registers-small da Meta no
Hugging Face no primeiro uso. task= seleciona o que roda em cima dele.
from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Não existe checkpoint hospedado pelo LibreYOLO para esta família:# isto baixa o backbone Apache-2.0 DINOv2-with-Registers-small da org# da Meta no Hugging Face. A cabeça densa começa com inicialização# aleatória até você treiná-la (veja Treinamento abaixo).model = LibreDINOv2(size="s", task="semantic", nb_classes=19)result = model(SAMPLE_IMAGE) mask = result.semantic_maskprint(mask.data.shape, mask.classes)from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # nb_classes= é a contagem de classes do seu dataset; a cabeça linear# começa com inicialização aleatória até você treiná-la.model = LibreDINOv2(size="s", task="classify", nb_classes=10)result = model(SAMPLE_IMAGE) print(result.probs.top1, result.probs.top1conf)from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Ignora todas as cabeças de tarefa: o backbone sozinho já basta,# então isso não precisa de fine-tuning para ser útil.model = LibreDINOv2(size="s", task="embed")result = model(SAMPLE_IMAGE) print(result.embeddings.data.shape) # (1, D), normalizado por L2from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed") # Wrapper de conveniência: roda predict() e empilha cada linha em um# único tensor (N, D).features = model.embed(["a.jpg", "b.jpg", "c.jpg"])print(features.shape)task="semantic" e task="classify" adicionam uma cabeça densa ou linear em
cima do backbone; essa cabeça é inicializada aleatoriamente e só é útil depois
que você a treina (veja Treinamento). task="embed" pula todas as
cabeças e devolve o token CLS final normalizado do backbone como uma única
linha por imagem inteira em result.embeddings, então não precisa de
treinamento nenhum. result.boxes é sempre None: nenhuma das três tarefas
produz detecções por instância. Veja predição para fontes,
streaming e tratamento de resultados.
Variantes
size seleciona a largura do projetor no estilo RF-DETR sobreposto ao
backbone, não o backbone em si: todos os tamanhos compartilham o mesmo encoder
DINOv2-S (small). A segmentação semântica roda na grade quadrada nativa de
patches do DINOv2; a classificação e o embedding rodam na resolução de
classificação menor usada para treinar o linear probe.
Treinamento
task="semantic" e task="classify" treinam; task="embed" não tem cabeça
dependente de classes para ajustar e levanta NotImplementedError se você
chamar train() nele.
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.train(data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4)from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.train(data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4)from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.train( data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4, device="0,1",)Os argumentos nomeados principais aqui são batch_size e lr, não batch e
lr0 usados pela maioria das outras famílias; batch e lr0 continuam sendo
aceitos e mapeados para eles, mas passar os dois levanta um erro de conflito.
output_dir= (padrão "runs/train") substitui project=/name= como forma
principal de posicionar uma execução, embora passar project=/name=
diretamente ainda funcione. Veja treinamento para datasets, data
augmentation, multi-GPU e loggers.
Validação
val() devolve um dicionário de chaves metrics/: mIoU e acurácia por pixel
para task="semantic", acurácia top-1 e top-5 para task="classify".
task="embed" não tem ground truth contra o qual pontuar e levanta
NotImplementedError se você chamar val() nele.
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mIoU"])print(metrics["metrics/pixel_accuracy"])from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])Exportação
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: compatível | semantic to TorchScript: compatível | semantic to ExecuTorch: compatível | semantic to TensorRT: compatível | semantic to OpenVINO: compatível | semantic to Paddle: incompatível | semantic to MNN: incompatível | semantic to RKNN: incompatível | semantic to ncnn: incompatível | semantic to TFLite: incompatível | semantic to CoreML: incompatível | semantic to Core AI: incompatível |
| classify | classify to ONNX: compatível | classify to TorchScript: compatível | classify to ExecuTorch: compatível | classify to TensorRT: compatível | classify to OpenVINO: compatível | classify to Paddle: incompatível | classify to MNN: incompatível | classify to RKNN: incompatível | classify to ncnn: incompatível | classify to TFLite: incompatível | classify to CoreML: incompatível | classify to Core AI: compatível |
| embed | embed to ONNX: compatível | embed to TorchScript: compatível | embed to ExecuTorch: compatível | embed to TensorRT: compatível | embed to OpenVINO: compatível | embed to Paddle: incompatível | embed to MNN: incompatível | embed to RKNN: incompatível | embed to ncnn: incompatível | embed to TFLite: compatível | embed to CoreML: incompatível | embed to Core AI: incompatível |
Cada tarefa suporta um subconjunto diferente de formatos, mostrado acima. Um
artefato exportado é recarregado por LibreYOLO() pelo sufixo do arquivo, então
um arquivo .onnx ou .engine se comporta como um checkpoint e devolve o
mesmo Results. Exportação lista os argumentos que cada
formato aceita.
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.export(format="onnx")from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.export(format="onnx")from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed")model.export(format="tflite")from libreyolo import LibreYOLO, SAMPLE_IMAGE # A factory roteia pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e devolve o mesmo objeto Results. A# exportação nomeia o arquivo pela tarefa, aqui LibreDINOv2s-sem.onnx.model = LibreYOLO("LibreDINOv2s-sem.onnx")result = model(SAMPLE_IMAGE)Licenciamento
Confira a licença no repositório do Hugging Face correspondente aos pesos que você baixar. Cada checkpoint na organização LibreYOLO tem uma licença, e ela nem sempre é a mesma em toda a família. Esse repositório é a fonte oficial. O resumo abaixo descreve o que se aplicava na última verificação desta página.
Esta é uma descrição das licenças envolvidas, não uma orientação jurídica. Se a resposta tiver importância comercial, leia as licenças e procure sua própria assessoria.
- Trabalho original
- DINOv2, Meta AI (FAIR)
- Licença original
- Apache-2.0
- Código-fonte original
- github.com/facebookresearch/dinov2
- Código do LibreYOLO
- MIT
- Pesos
- Apache-2.0, distribuído pelos autores. O LibreYOLO não hospeda nem espelha esses pesos.
- Interpretação
- Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. LibreYOLO does not host or republish a DINOv2 checkpoint of its own: LibreDINOv2 downloads the pretrained backbone directly from Meta's facebook/dinov2-with-registers-small repository on Hugging Face the first time it runs, unmodified. The semantic and classification heads start at random initialization until you train them, since LibreYOLO does not publish a trained head for this family.
A linha "Weights" acima nomeia a licença que se aplica, Apache-2.0, mas nada é
de fato republicado sob a org do LibreYOLO no Hugging Face para esta família:
o LibreYOLO não hospeda nenhum checkpoint LibreDINOv2 próprio. O que
LibreDINOv2(model_path=None) baixa é o repositório
facebook/dinov2-with-registers-small da própria Meta, intocado.
Citação
@misc{oquab2023dinov2,
title={DINOv2: Learning Robust Visual Features without Supervision},
author={Oquab, Maxime and Darcet, Timothée and Moutakanni, Theo and Vo, Huy V. and Szafraniec, Marc and Khalidov, Vasil and Fernandez, Pierre and Haziza, Daniel and Massa, Francisco and El-Nouby, Alaaeldin and Howes, Russell and Huang, Po-Yao and Xu, Hu and Sharma, Vasu and Li, Shang-Wen and Galuba, Wojciech and Rabbat, Mike and Assran, Mido and Ballas, Nicolas and Synnaeve, Gabriel and Misra, Ishan and Jegou, Herve and Mairal, Julien and Labatut, Patrick and Joulin, Armand and Bojanowski, Piotr},
journal={arXiv:2304.07193},
year={2023}
}Copiado do bloco de citação dos autores em github.com/facebookresearch/dinov2#citing-dinov2.