RTMDet
O RTMDet é um detector de estágio único que prediz a partir de um prior por ponto em cada posição da grade, sem âncoras, através de uma cabeça cujas convoluções são compartilhadas entre os níveis de features. O LibreYOLO o suporta para detecção e para segmentação de instâncias com o RTMDet-Ins.
- Tarefas
- detection, instance segmentation
- Tamanhos
- t, s, m, l, x at 640 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
- RTMDet por OpenMMLab, Apache-2.0. Artigo, código-fonte
- Licenças
- Código Apache-2.0, pesos Apache-2.0. Uso comercial
Instalação
O RTMDet não precisa de nenhum extra além do pacote base.
pip install libreyoloPredição
Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache local.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreRTMDets.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreRTMDets.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # O sufixo -seg no nome do arquivo seleciona a cabeça de máscaras do# RTMDet-Ins, então nenhum argumento task é necessário aqui.model = LibreYOLO("LibreRTMDets-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 do RTMDet-Ins, e aí result.masks
carrega as máscaras de instância junto com as caixas. conf define o limiar de
confiança e iou, o limiar do NMS. Veja predição para fontes,
streaming e tratamento de resultados.
Variantes
Cinco tamanhos, de t a x, compartilham uma mesma arquitetura em uma
resolução de entrada comum. Esta família não traz tabela de benchmark aqui:
compare os tamanhos pelo tamanho do arquivo de cada checkpoint na tabela abaixo.
Treinamento
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.train( data="my-dataset.yaml", epochs=300, imgsz=640, batch=16, lr0=0.004,)libreyolo train model=LibreRTMDets.pt data=my-dataset.yaml imgsz=640 epochs=300 batch=16 lr0=0.004A detecção treina pelo train(). Os componentes QualityFocalLoss, GIoU e
DynamicSoftLabelAssigner são portados do mmdetection upstream, e o forward pass
e a exportação para ONNX são equivalentes bit a bit a ele, com o
pós-processamento batendo com a saída do mmdet dentro de 0.001 mAP em
subconjuntos do val2017.
O que não foi conferido, conforme a própria docstring de train(): a
convergência de um fine-tuning em dataset pequeno, a paridade com o paper
treinando do zero, o comportamento multi-GPU, o throughput de Mosaic e MixUp em
cache, a troca estrita para o pipeline de dois estágios do upstream, e os
overrides de weight decay por parâmetro que zeram o decay nos parâmetros de norm
e de bias.
O RTMDet-Ins não tem caminho de treinamento. Chamar train() em um checkpoint
-seg, ou com task="segment", levanta NotImplementedError; a segmentação de
instâncias suporta apenas inferência e validação.
O train() também aceita um argumento pretrained, mas o valor nunca é lido
dentro do método: o treinamento sempre continua a partir dos pesos com que o
modelo foi construído, então pretrained=False não reinicializa a rede.
Sem mexer em nada, o trainer roda 300 épocas com AdamW em lr0=0.004 e
weight_decay=0.05, um warmup de 1 época em um cronograma cosseno, e Mosaic e
MixUp desligados nas 20 épocas finais.
Veja treinamento para datasets, data augmentation, multi-GPU e loggers.
Validação
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("LibreRTMDets.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreRTMDets.pt data=my-dataset.yamlfrom libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"]) # máscarasprint(metrics["metrics/mAP50-95(B)"]) # caixasContra 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
| 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: compatível | Detection to TensorRT: compatível | Detection to OpenVINO: compatível | Detection to Paddle: incompatível | Detection to MNN: incompatí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 |
| Instance segmentation | Instance segmentation to ONNX: incompatível | Instance segmentation to TorchScript: incompatível | Instance segmentation to ExecuTorch: incompatível | Instance segmentation to TensorRT: incompatível | Instance segmentation to OpenVINO: incompatível | Instance segmentation to Paddle: incompatível | Instance segmentation to MNN: incompatível | Instance segmentation to RKNN: incompatível | Instance segmentation to ncnn: incompatível | Instance segmentation to TFLite: incompatível | Instance segmentation to CoreML: incompatível | Instance segmentation to Core AI: incompatível |
A detecção exporta para a maioria dos formatos; a segmentação de instâncias hoje
não exporta para nenhum deles, e a matriz acima reflete essa divisão. Um artefato
de detecção 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. Rodar o grafo em um runtime puro, sem o LibreYOLO
instalado, também é suportado, mas aí o pré-processamento e o pós-processamento
ficam por sua conta.
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreRTMDets.pt format=onnx imgsz=640libreyolo export model=LibreRTMDets.pt format=tensorrt imgsz=640 half=Truefrom 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("LibreRTMDets.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Checkpoints
Todos os arquivos de pesos publicados desta família.
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| Detection | ||
| LibreRTMDett.pt | 640 | apache-2.0 |
| LibreRTMDets.pt | 640 | apache-2.0 |
| LibreRTMDetm.pt | 640 | apache-2.0 |
| LibreRTMDetl.pt | 640 | apache-2.0 |
| LibreRTMDetx.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreRTMDett-seg.pt | 640 | apache-2.0 |
| LibreRTMDets-seg.pt | 640 | apache-2.0 |
| LibreRTMDetm-seg.pt | 640 | apache-2.0 |
| LibreRTMDetl-seg.pt | 640 | apache-2.0 |
| LibreRTMDetx-seg.pt | 640 | 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
- RTMDet, OpenMMLab
- Licença original
- Apache-2.0
- Código-fonte original
- github.com/open-mmlab/mmdetection
- 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 published RTMDet and RTMDet-Ins checkpoints are converted from mmdetection's own COCO weights, trained by OpenMMLab under the same license.
Citação
@misc{lyu2022rtmdet,
title={RTMDet: An Empirical Study of Designing Real-Time Object Detectors},
author={Chengqi Lyu and Wenwei Zhang and Haian Huang and Yue Zhou and Yudong Wang and Yanyi Liu and Shilong Zhang and Kai Chen},
year={2022},
eprint={2212.07784},
archivePrefix={arXiv},
primaryClass={cs.CV}
}Copiado do bloco de citação dos autores em github.com/open-mmlab/mmdetection/tree/main/configs/rtmdet#citation.