D-FINE

Um transformer de detecção que reformula a regressão de caixas como uma distribuição de probabilidade sobre cada borda da caixa, refinada ao longo das camadas do decoder. O LibreYOLO o suporta para detecção e segmentação de instâncias.

Tarefas
detection, instance segmentation
Tamanhos
n, s, m, l, x at 640 px
Instalação
pip install libreyolo
Nível de suporte
Núcleo, desde a v1.1.0. Detectores treináveis do núcleo: os recursos chegam depois dos carros-chefe na mesma leva de versões.
Origem
D-FINE por University of Science and Technology of China, Apache-2.0. Artigo, código-fonte
Licenças
Código Apache-2.0, pesos Apache-2.0. Uso comercial

Instalação

O D-FINE não precisa de nenhum extra opcional. Tudo que ele importa já está na instalação base.

bash
pip install libreyolo

O fine-tuning com adaptadores via lora=True é a exceção, e precisa do extra lora.

bash
pip install "libreyolo[lora]"

Predição

Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache localmente.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreDFINEn.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreDFINEn.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Segmentação de instâncias
from libreyolo import LibreYOLO, SAMPLE_IMAGE # O sufixo -seg no nome do arquivo seleciona a cabeça de máscaras, então# nenhum argumento task é necessário aqui.model = LibreYOLO("LibreDFINEn-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)

O objeto Results retornado é o mesmo que todas as famílias retornam, então trocar por outro detector é uma mudança de uma linha. Um nome de arquivo com -seg já resolve sozinho para a tarefa de segmentação, e aí result.masks carrega as máscaras de instância junto com as caixas. conf e max_det filtram a seleção de queries; iou é aceito por paridade de API mas não tem efeito, porque o decoder é um preditor de conjuntos sem etapa de NMS. Veja predição para fontes, streaming e tratamento de resultados.

Variantes

Cinco tamanhos. Todos rodam na mesma resolução de entrada, então a tabela os separa por número de parâmetros e acurácia.

CheckpointEntrada (px)mAP 50-95Parâmetros (M)
LibreDFINEl64060.031.24
LibreDFINEm64057.819.59
LibreDFINEn64045.83.78
LibreDFINEs64053.410.32
LibreDFINEx64061.462.62

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 segmentação reaproveita o backbone, o encoder e o decoder da detecção e acrescenta uma cabeça de máscaras, então um checkpoint -seg aceita os mesmos argumentos que o irmão de detecção. A família RT-DETRv4 do LibreYOLO é escrita como uma subclasse do wrapper do D-FINE: ela herda essa linhagem de decoder e depois fixa sua lista de tarefas de volta em detecção, porque não traz cabeça de máscaras.

Treinamento

O treinamento parte de um checkpoint publicado, para as duas tarefas.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=2e-4)
CLI
libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  epochs=50 imgsz=640 batch=8 lr0=2e-4
Segmentação de instâncias
# Continua a partir de pesos de segmentação publicados, cabeça de máscaras incluída.libreyolo train model=LibreDFINEn-seg.pt data=my-dataset.yaml \  task=segment epochs=50 imgsz=640
Segmentação a partir de pesos de detecção
# Os pesos de detecção não trazem cabeça de máscaras, então isto é uma# transferência explícita: a cabeça começa sem treinamento e só serve depois# de treinada. Pedir task=segment aqui é o que autoriza a transferência.libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  task=segment epochs=50 imgsz=640
LoRA
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, lora=True)
Multi-GPU
libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  epochs=50 device=0,1 batch=16

Sem mexer em nada, o trainer roda 132 épocas com lr0=2e-4 e amp=False, um batch de 16 e early stopping após 50 épocas sem melhora. Os pesos de detecção são um ponto de partida válido para treinar segmentação, mas só como transferência explícita, já que a cabeça de máscaras começa sem treinamento e de outro modo devolveria máscaras sem sentido. Passar task=segment para o CLI é o que autoriza isso. O caminho pelo Python é mais estreito: LibreDFINE precisa ser construído diretamente com allow_detect_to_segment_transfer=True, porque a factory LibreYOLO() não aceita esse argumento, e a construção direta não baixa nada, então o arquivo de pesos já precisa estar em disco.

lora=True vale para detecção. O treinamento de segmentação o rejeita e aponta para freeze='backbone' no lugar, porque a cabeça de máscaras não foi testada com adaptadores. No Apple silicon o trainer move a execução inteira para a CPU: o backward pass do matmul por bins do Integral esbarra em uma falha de compilação do Metal. A inferência em MPS não é afetada.

Veja treinamento para datasets, data augmentation, multi-GPU e loggers.

Validação

val() retorna um dicionário indexado pelo nome da métrica, e imprime os resultados por classe quando verbose fica ligado.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreDFINEn.pt data=my-dataset.yaml
Segmentação de instâncias
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"])   # máscarasprint(metrics["metrics/mAP50-95(B)"])   # caixas

Contra um checkpoint -seg, a chave metrics/mAP50-95 pura contém a pontuação das máscaras, e a mesma execução também reporta as caixas em (B) e as máscaras em (M), então as duas ficam disponíveis em uma única passada.

Exportação

TarefaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: compatívelDetection to TorchScript: compatívelDetection to ExecuTorch: incompatívelDetection to TensorRT: compatívelDetection to OpenVINO: compatívelDetection to Paddle: compatívelDetection to MNN: compatívelDetection to RKNN: incompatívelDetection to ncnn: incompatívelDetection to TFLite: incompatívelDetection to CoreML: incompatívelDetection to Core AI: compatível
Instance segmentationInstance segmentation to ONNX: compatívelInstance segmentation to TorchScript: compatívelInstance segmentation to ExecuTorch: incompatívelInstance segmentation to TensorRT: compatívelInstance segmentation to OpenVINO: compatívelInstance segmentation to Paddle: incompatívelInstance segmentation to MNN: incompatívelInstance segmentation to RKNN: incompatívelInstance segmentation to ncnn: incompatívelInstance segmentation to TFLite: incompatívelInstance segmentation to CoreML: incompatívelInstance segmentation to Core AI: incompatível

Um artefato exportado é recarregado pelo LibreYOLO() a partir do sufixo do arquivo, então um arquivo .onnx ou .engine se comporta como um checkpoint e devolve o mesmo Results. Os caminhos de OpenVINO, Paddle, MNN e Core AI exportam com um canvas fixo em vez de formas dinâmicas. Exportação lista os argumentos que todo formato aceita e os extras que alguns deles acrescentam.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)
CLI
libreyolo export model=LibreDFINEn.pt format=onnx imgsz=640libreyolo export model=LibreDFINEn.pt format=tensorrt imgsz=640 half=True
Usar o arquivo exportado
from libreyolo import LibreYOLO, SAMPLE_IMAGE # A factory decide pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e devolve o mesmo objeto Results.model = LibreYOLO("LibreDFINEn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Checkpoints

Todos os arquivos de pesos publicados desta família.

ArquivoEntrada (px)Licença dos pesos
Detection
LibreDFINEn.pt640apache-2.0
LibreDFINEs.pt640apache-2.0
LibreDFINEm.pt640apache-2.0
LibreDFINEl.pt640apache-2.0
LibreDFINEx.pt640apache-2.0
Instance segmentation
LibreDFINEn-seg.pt640apache-2.0
LibreDFINEs-seg.pt640apache-2.0
LibreDFINEm-seg.pt640apache-2.0
LibreDFINEl-seg.pt640apache-2.0
LibreDFINEx-seg.pt640apache-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
D-FINE, University of Science and Technology of China
Licença original
Apache-2.0
Código-fonte original
github.com/Peterande/D-FINE
Código do LibreYOLO
MIT
Pesos
Apache-2.0, 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. The segmentation weights carry a second Apache-2.0 upstream, ArgoHA/D-FINE-seg, under the same terms.

Os pesos de segmentação têm um segundo upstream: o decoder de máscaras, o matching de máscaras e a loss de máscaras vêm do ArgoHA/D-FINE-seg, também Apache-2.0, cujo maintainer aprovou o reuso com atribuição.

Citação

@misc{peng2024dfine,
      title={D-FINE: Redefine Regression Task in DETRs as Fine-grained Distribution Refinement},
      author={Yansong Peng and Hebei Li and Peixi Wu and Yueyi Zhang and Xiaoyan Sun and Feng Wu},
      year={2024},
      eprint={2410.13842},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

Copiado do bloco de citação dos autores em github.com/Peterande/D-FINE#citation.

Verificado com o LibreYOLO v1.5.0. As tabelas de suporte, os checkpoints e os números de benchmark desta página são gerados a partir da biblioteca lançada e dos pesos publicados, não escritos à mão.