PicoDet
O PicoDet é um detector de estágio único feito para CPUs móveis e de borda: um backbone ESNet, um neck CSP-PAN e uma cabeça compartilhada com Generalized Focal Loss. O LibreYOLO o suporta para detecção.
- Tarefas
- detection
- Tamanhos
- s, m, l at 320 to 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
- PP-PicoDet por PaddlePaddle (Baidu), Apache-2.0. Artigo, código-fonte
- Licenças
- Código Apache-2.0, pesos Apache-2.0. Uso comercial
Instalação
O PicoDet 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("LibrePICODETs.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibrePICODETs.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=TrueO objeto Results retornado é o mesmo que todas as famílias retornam, então
trocar por outro detector é uma mudança de uma linha. conf define o limiar de
confiança e iou o limiar do NMS. Veja predição para fontes,
streaming e tratamento de resultados.
Variantes
Três tamanhos, cada um com sua própria resolução de entrada fixa: s o menor e
l o maior. A resolução cresce junto com o tamanho, então checkpoints maiores
também são mais caros de rodar por imagem, além de carregarem mais parâmetros.
| Checkpoint | Entrada (px) | mAP 50-95 | Parâmetros (M) |
|---|---|---|---|
| LibrePICODETs | 320 | 29.5 | 0.99 |
| LibrePICODETm | 416 | 37.6 | 2.15 |
| LibrePICODETl | 640 | 44.2 | 3.31 |
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.
Treinamento
from libreyolo import LibreYOLO model = LibreYOLO("LibrePICODETs.pt")model.train( data="my-dataset.yaml", epochs=300, batch=16, lr0=0.01,)# Vale a pena definir o imgsz: a CLI assume 640 por padrão, enquanto o# checkpoint s é nativo em 320.libreyolo train model=LibrePICODETs.pt data=my-dataset.yaml imgsz=320 epochs=300 batch=16 lr0=0.01Os componentes da loss e o assigner seguem a receita do upstream: VFL, DFL, GIoU e SimOTA, com ponderação por qualidade de classificação e alvos VFL de IoU dinâmico. A inferência é bit a bit equivalente à do upstream no mesmo checkpoint.
O que não foi verificado, conforme a própria docstring de train():
convergência em dataset completo, comportamento multi-GPU e qualquer data
augmentation além do flip horizontal. O checkpoint s, na sua resolução nativa
de 320, também não passou de forma confiável no piso de acurácia do LibreYOLO
na fixture de 30 imagens e duas classes com que a biblioteca testa fine-tunes
pequenos. Esse tamanho se encaixa melhor na escala do COCO completo.
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. Deixe
imgsz sem definir no Python e ele assume a resolução nativa do checkpoint
carregado: 320 para o s, 416 para o m e 640 para o l. A CLI sempre envia
um imgsz, com 640 por padrão, então defina esse valor lá para bater com o
checkpoint.
Sem outros ajustes, o treinador roda 300 épocas com SGD a lr0=0.01, momentum
0.9, weight decay 4e-5 e um warmup de 1 época em um schedule cosseno. O flip
horizontal é o único data augmentation aplicado.
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("LibrePICODETs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibrePICODETs.pt data=my-dataset.yamlExportaçã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: compatível | Detection to ncnn: compatível | Detection to TFLite: incompatível | Detection to CoreML: incompatível | Detection to Core AI: compatível |
Um artefato exportado volta a carregar por LibreYOLO() pela extensão do
arquivo, então um arquivo .onnx ou .engine se comporta como um checkpoint e
retorna 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("LibrePICODETs.pt")model.export(format="onnx", imgsz=320)model.export(format="tensorrt", imgsz=320, half=True)libreyolo export model=LibrePICODETs.pt format=onnx imgsz=320libreyolo export model=LibrePICODETs.pt format=tensorrt imgsz=320 half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # A factory roteia pela extensão do arquivo, então um artefato exportado# carrega como qualquer checkpoint e retorna o mesmo objeto Results.model = LibreYOLO("LibrePICODETs.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 | ||
| LibrePICODETs.pt | 320 | apache-2.0 |
| LibrePICODETm.pt | 416 | apache-2.0 |
| LibrePICODETl.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
- PP-PicoDet, PaddlePaddle (Baidu)
- Licença original
- Apache-2.0
- Código-fonte original
- github.com/PaddlePaddle/PaddleDetection
- 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. LibreYOLO's port follows Bo396543018/Picodet_Pytorch, a PyTorch re-implementation of PaddleDetection's original PP-PicoDet, and both carry the same Apache-2.0 terms as the paper's authors.
O port do LibreYOLO segue o Bo396543018/Picodet_Pytorch, uma reimplementação em PyTorch do PP-PicoDet original do PaddleDetection, com o mmcv removido e cada ativação replicada exatamente, de modo que checkpoints do PaddlePaddle convertidos pelo pipeline do Bo carregam sem nenhum desvio numérico. Ambas as fontes carregam os mesmos termos Apache-2.0 dos autores do artigo.
Citação
@misc{yu2021pppicodet,
title={PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices},
author={Guanghua Yu and Qinyao Chang and Wenyu Lv and Chang Xu and Cheng Cui and Wei Ji and Qingqing Dang and Kaipeng Deng and Guanzhong Wang and Yuning Du and Baohua Lai and Qiwen Liu and Xiaoguang Hu and Dianhai Yu and Yanjun Ma},
year={2021},
eprint={2111.00902},
archivePrefix={arXiv},
primaryClass={cs.CV}
}Copiado do bloco de citação dos autores em github.com/PaddlePaddle/PaddleDetection/blob/release/2.8/configs/picodet/README_en.md#cite-pp-picodet.