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.

bash
pip install libreyolo

Predição

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

Python
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)
CLI
libreyolo predict model=LibrePICODETs.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True

O 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.

CheckpointEntrada (px)mAP 50-95Parâmetros (M)
LibrePICODETs32029.50.99
LibrePICODETm41637.62.15
LibrePICODETl64044.23.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

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibrePICODETs.pt")model.train(    data="my-dataset.yaml",    epochs=300, batch=16, lr0=0.01,)
CLI
# 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.01

Os 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.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibrePICODETs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibrePICODETs.pt data=my-dataset.yaml

Exportação

TarefaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: compatívelDetection to TorchScript: compatívelDetection to ExecuTorch: compatívelDetection to TensorRT: compatívelDetection to OpenVINO: compatívelDetection to Paddle: incompatívelDetection to MNN: incompatívelDetection to RKNN: compatívelDetection to ncnn: compatívelDetection to TFLite: incompatívelDetection to CoreML: incompatívelDetection 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.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibrePICODETs.pt")model.export(format="onnx", imgsz=320)model.export(format="tensorrt", imgsz=320, half=True)
CLI
libreyolo export model=LibrePICODETs.pt format=onnx imgsz=320libreyolo export model=LibrePICODETs.pt format=tensorrt imgsz=320 half=True
Usar o arquivo exportado
from 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.

ArquivoEntrada (px)Licença dos pesos
Detection
LibrePICODETs.pt320apache-2.0
LibrePICODETm.pt416apache-2.0
LibrePICODETl.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
PP-PicoDet, PaddlePaddle (Baidu)
Licença original
Apache-2.0
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.

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.