DEIM
Um transformer de detecção treinado com correspondência densa um-para-um, que converge em muito menos épocas que as receitas DETR sobre as quais é construído. O LibreYOLO inclui duas versões dele, distinguidas pelo checkpoint que você carrega.
- Tarefas
- detection
- Tamanhos
- deim: n, s, m, l, x at 640 px
- Instalação
pip install libreyolo- Nível de suporte
- Núcleo, desde a v1.2.0. Detectores treináveis do núcleo: os recursos chegam depois dos carros-chefe na mesma leva de versões.
- Origem
- DEIM and DEIMv2 por Intellindust AI Lab, Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Artigo, código-fonte
- Licenças
- Código Apache-2.0, pesos Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Uso comercial
Instalação
Nenhuma das duas versões precisa de um extra opcional. Tudo o que elas importam está na instalação base.
pip install libreyoloO fine-tuning por adaptadores com lora=True é a exceção, e precisa do extra
lora.
pip install "libreyolo[lora]"Predição
Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache localmente.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreDEIMn.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreDEIMn.pt save=True \ source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpgfrom libreyolo import LibreYOLO # A versão faz parte do nome do arquivo, e a fábrica roteia com base# no checkpoint, então as duas carregam do mesmo jeito.model = LibreYOLO("LibreDEIMv2pico.pt") # Qualquer fonte que a biblioteca aceita: arquivo, pasta, URL, índice# de webcam, stream RTSP ou uma lista .streamsfor result in model.predict("clip.mp4", stream=True, save=True): print(len(result.boxes))O objeto Results retornado é o mesmo que toda família retorna, então trocar
por outro detector é uma mudança de uma linha. conf e max_det filtram uma
decodificação top-k sobre queries e classes; não há um passo de NMS para
ajustar, e iou é aceito mas não usado. Veja predição para
fontes, streaming e tratamento de resultados.
Variantes
A versão 1 traz cinco tamanhos, todos no mesmo tamanho de entrada. A versão 2
mantém esses cinco nomes e acrescenta três menores, atto, femto e pico, os
dois primeiros nativos em um tamanho de entrada menor que o resto. Cinco códigos
de tamanho existem, portanto, nas duas versões e nomeiam modelos diferentes; a
versão está escrita no nome do arquivo do checkpoint.
| Checkpoint | Entrada (px) | mAP 50-95 | Parâmetros (M) |
|---|---|---|---|
| LibreDEIMl | 640 | 57.8 | 31.24 |
| LibreDEIMm | 640 | 55.4 | 19.59 |
| LibreDEIMn | 640 | 46.8 | 3.78 |
| LibreDEIMs | 640 | 52.1 | 10.32 |
| LibreDEIMx | 640 | 59.6 | 62.62 |
| LibreDEIMv2atto | 320 | 27.5 | 0.51 |
| LibreDEIMv2femto | 416 | 34.5 | 0.98 |
| LibreDEIMv2l | 640 | 58.6 | 32.55 |
| LibreDEIMv2m | 640 | 56.0 | 18.36 |
| LibreDEIMv2n | 640 | 46.7 | 3.6 |
| LibreDEIMv2pico | 640 | 42.2 | 1.54 |
| LibreDEIMv2s | 640 | 53.0 | 9.78 |
| LibreDEIMv2x | 640 | 61.3 | 51.21 |
COCO val2017, 500 images. Medido pelo conjunto de testes de benchmark do LibreYOLO e publicado no Vision Analysis, onde a latência entre hardwares e runtimes é comparada e os registros completos das execuções ficam disponíveis.
A versão 1 mantém a arquitetura do D-FINE e troca seu objetivo de classificação
pela loss ciente de matchability da receita densa um-para-um, então as duas
famílias compartilham quase todas as chaves do state dict e são distinguidas
pelos metadados do checkpoint. A versão 2 mantém esse contrato de treinamento e
mistura backbones: HGNetv2 abaixo de s, e um vision transformer DINOv3 com um
adaptador de tuning espacial em s e acima. Esse backbone é o que coloca uma
segunda licença nesses quatro checkpoints, então leia
licenciamento antes de colocar um deles em produção.
Treinamento
O treinamento parte de um checkpoint publicado. pretrained nunca chega ao
treinador: a versão 1 avisa que a chave é desconhecida e a ignora, a versão 2 a
remove. Nenhuma das duas entrega um modelo inicializado aleatoriamente.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # coco128.yaml baixa uma amostra de 128 imagens no primeiro uso.# Aponte `data` para o YAML do seu próprio dataset em uma execução real.model.train(data="coco128.yaml", epochs=50, batch=8, lr0=1e-4)libreyolo train model=LibreDEIMn.pt data=coco128.yaml \ epochs=50 batch=8 lr0=1e-4from libreyolo import LibreYOLO # Se não forem definidos, epochs, batch, imgsz e lr0 vêm da receita# publicada para o tamanho que foi carregado.model = LibreYOLO("LibreDEIMv2pico.pt")model.train(data="coco128.yaml", epochs=50)# Precisa do extra lora: pip install "libreyolo[lora]"from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt")model.train(data="coco128.yaml", epochs=50, lora=True)libreyolo train model=LibreDEIMn.pt data=coco128.yaml \ epochs=50 device=0,1Passe lr0 você mesmo na versão 1. A assinatura Python do train() dela usa
4e-4 como padrão, a taxa da receita COCO publicada, enquanto a configuração de
treinamento da família carrega 1e-4 como seu padrão de fine-tune, e é esse
valor menor que a CLI resolve quando o argumento está ausente. A configuração
registra a medição por trás disso: nos tamanhos de batch que um fine-tune de
fato usa, em datasets pequenos, a taxa do COCO degradou a transferência de forma
mensurável.
A versão 2 resolve esses padrões sozinha. Deixar epochs, batch, imgsz e
lr0 sem definir faz com que ela leia cada um da receita publicada para o
tamanho que foi carregado, então os tamanhos pequenos treinam na própria
resolução de entrada sem que ninguém precise dizer, e um valor que você passa
sobrescreve a receita. imgsz é o argumento que ela restringe: precisa ser um
múltiplo positivo de 32, e a versão 2 lança um erro antes de a execução começar
caso contrário.
Veja treinamento para datasets, data augmentation, multi-GPU e loggers.
Validação
val() retorna um dicionário de chaves metrics/ cobrindo precisão, recall,
mAP 50 e mAP 50-95, medidos contra qualquer dataset no formato em que você
treinou.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # val() retorna um dict simples, não um objetometrics = model.val(data="coco128.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])print(metrics["metrics/precision"], metrics["metrics/recall"])libreyolo val model=LibreDEIMn.pt data=coco128.yaml# coco-val-only.yaml busca as 5000 imagens de val2017 e pula o# conjunto de treinamento. Ele traz um script de download embutido,# então precisa de permissão explícita a menos que o dataset já esteja# local.libreyolo val model=LibreDEIMn.pt data=coco-val-only.yaml \ allow_download_scripts=TrueAs linhas da tabela de benchmark acima vêm do harness de benchmark do LibreYOLO; a nota abaixo dessa tabela registra qual dataset as produziu e liga os registros das execuções.
Exportação
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: compatível | Detection to TorchScript: compatível | Detection to ExecuTorch: incompatível | Detection to TensorRT: compatível | Detection to OpenVINO: compatível | Detection to Paddle: compatível | Detection to MNN: compatível | Detection to RKNN: incompatível | Detection to ncnn: incompatível | Detection to TFLite: incompatível | Detection to CoreML: incompatível | Detection to Core AI: compatível |
A matriz cobre as duas versões em uma única página: onde elas discordam sobre um formato, a célula mostra a mais fraca das duas, então nada aqui fica supervalorizado para a versão que você carregar.
Um artefato exportado volta a carregar por LibreYOLO() pelo sufixo do arquivo,
então um arquivo .onnx ou .engine se comporta como um checkpoint e retorna o
mesmo Results.
# Precisa do extra onnx: pip install "libreyolo[onnx]"from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt")path = model.export(format="onnx")print(path)libreyolo export model=LibreDEIMn.pt format=onnxfrom libreyolo import LibreYOLO, SAMPLE_IMAGE # A fábrica roteia pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e retorna o mesmo objeto Results.model = LibreYOLO("LibreDEIMn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Checkpoints
Todo arquivo de pesos publicado desta família.
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| Detection | ||
| LibreDEIMn.pt | 640 | apache-2.0 |
| LibreDEIMs.pt | 640 | apache-2.0 |
| LibreDEIMm.pt | 640 | apache-2.0 |
| LibreDEIMl.pt | 640 | apache-2.0 |
| LibreDEIMx.pt | 640 | apache-2.0 |
| LibreDEIMv2n.pt | 640 | apache-2.0 |
| LibreDEIMv2s.pt | 640 | other |
| LibreDEIMv2m.pt | 640 | other |
| LibreDEIMv2l.pt | 640 | other |
| LibreDEIMv2x.pt | 640 | other |
| LibreDEIMv2atto.pt | apache-2.0 | |
| LibreDEIMv2femto.pt | apache-2.0 | |
| LibreDEIMv2pico.pt | apache-2.0 | |
Todos os arquivos acima existem hoje na organização LibreYOLO e são baixados no primeiro uso.
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
- DEIM and DEIMv2, Intellindust AI Lab
- Licença original
- Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License
- Código-fonte original
- github.com/Intellindust-AI-Lab/DEIM
- Código do LibreYOLO
- MIT
- Pesos
- Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License, republicado em huggingface.co/LibreYOLO
- 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. It places no obligation on your own application code, and weights you train yourself on your own data are yours. DEIM is Apache-2.0 throughout, and so are the DEIMv2 sizes below S, which use an HGNetv2 backbone. The DEIMv2 S, M, L and X sizes take their backbone from DINOv3, so both their weights and the backbone source vendored in LibreYOLO are additionally governed by Meta's DINOv3 License Agreement, which is not an OSI license: redistribution has to carry the agreement with it, and it forbids use for military or warfare purposes, weapons development, espionage, nuclear industries and anything subject to ITAR. Their Hugging Face repositories declare both licenses, and DEIMv2 is also cited separately (arXiv 2509.20787).
Citação
@misc{huang2024deim,
title={DEIM: DETR with Improved Matching for Fast Convergence},
author={Shihua, Huang and Zhichao, Lu and Xiaodong, Cun and Yongjun, Yu and Xiao, Zhou and Xi, Shen},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
year={2025},
}Copiado do bloco de citação dos autores em github.com/Intellindust-AI-Lab/DEIM#5-citation.
O DEIMv2 é um artigo separado e tem seu próprio bloco de citação em github.com/Intellindust-AI-Lab/DEIMv2; cite esse se você usou um checkpoint da versão 2.