PicoDet

PicoDet es un detector de una etapa pensado para CPUs de móvil y edge: un backbone ESNet, un neck CSP-PAN y una cabeza compartida con Generalized Focal Loss. LibreYOLO lo soporta para detección.

Tareas
detection
Tamaños
s, m, l at 320 to 640 px
Instalación
pip install libreyolo
Nivel de compatibilidad
Compatible, desde v. Modelos entrenables de apoyo: se mantienen operativos en CI y reciben funciones cuando surge la oportunidad.
Proyecto original
PP-PicoDet de PaddlePaddle (Baidu), Apache-2.0. Artículo, fuente
Licencias
Código Apache-2.0, pesos Apache-2.0. Uso comercial

Instalación

PicoDet no necesita nada más allá del paquete base.

bash
pip install libreyolo

Predicción

Los pesos se descargan de Hugging Face en el primer uso y se guardan en la caché 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

El objeto Results devuelto es el mismo que devuelven todas las familias, así que cambiar a otro detector es un cambio de una línea. conf fija el umbral de confianza y iou el umbral de NMS. Consulta predicción para fuentes, streaming y manejo de resultados.

Variantes

Tres tamaños, cada uno a su propia resolución de entrada fija: s el más pequeño y l el más grande. La resolución crece con el tamaño, así que los checkpoints más grandes también son más caros de ejecutar por imagen, además de llevar más parámetros.

CheckpointEntrada (px)mAP 50-95Parámetros (M)
LibrePICODETs32029.50.99
LibrePICODETm41637.62.15
LibrePICODETl64044.23.31

COCO val2017, 500 images. Medido con el sistema de benchmarks de LibreYOLO y publicado en Vision Analysis, donde se comparan la latencia entre distintos hardwares y runtimes y se conservan los registros completos de las ejecuciones.

Entrenamiento

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibrePICODETs.pt")model.train(    data="my-dataset.yaml",    epochs=300, batch=16, lr0=0.01,)
CLI
# Merece la pena fijar imgsz: el CLI usa 640 por defecto, mientras que# el checkpoint s es nativo a 320.libreyolo train model=LibrePICODETs.pt data=my-dataset.yaml imgsz=320 epochs=300 batch=16 lr0=0.01

Los componentes de la loss y el assigner siguen la receta de upstream: VFL, DFL, GIoU y SimOTA, con ponderación por calidad de clasificación y targets de VFL con IoU dinámico. La inferencia es equivalente bit a bit a la de upstream sobre el mismo checkpoint.

Lo que no se ha comprobado, según el propio docstring de train(): la convergencia sobre un dataset completo, el comportamiento multi-GPU y cualquier aumento de datos (data augmentation) más allá del volteo horizontal. El checkpoint s a su resolución nativa de 320 tampoco ha superado de forma fiable el mínimo de precisión de LibreYOLO en el fixture de 30 imágenes y dos clases con el que la biblioteca prueba los fine-tunes pequeños. Ese tamaño encaja mejor a escala de COCO completo.

train() también acepta un argumento pretrained, pero el valor nunca se lee dentro del método: el entrenamiento siempre continúa desde los pesos con los que se construyó el modelo, así que pretrained=False no reinicializa la red. Si dejas imgsz sin fijar en Python, toma la resolución nativa del checkpoint cargado: 320 para s, 416 para m y 640 para l. El CLI siempre envía un imgsz, con 640 por defecto, así que fíjalo ahí para que coincida con el checkpoint.

Si no se toca nada más, el trainer ejecuta 300 épocas con SGD a lr0=0.01, momentum 0.9, weight decay 4e-5 y un warmup de 1 época sobre un schedule coseno. El volteo horizontal es el único aumento de datos que se aplica.

Consulta entrenamiento para datasets, aumento de datos (data augmentation), multi-GPU y loggers.

Validación

val() devuelve un diccionario de claves metrics/ que cubren precisión, recall, mAP 50 y mAP 50-95, medidas contra cualquier dataset en el formato con el que entrenaste.

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

Exportación

TareaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: compatibleDetection to TorchScript: compatibleDetection to ExecuTorch: compatibleDetection to TensorRT: compatibleDetection to OpenVINO: compatibleDetection to Paddle: no compatibleDetection to MNN: no compatibleDetection to RKNN: compatibleDetection to ncnn: compatibleDetection to TFLite: no compatibleDetection to CoreML: no compatibleDetection to Core AI: compatible

Un artefacto exportado se vuelve a cargar con LibreYOLO() según la extensión del archivo, así que un archivo .onnx o .engine se comporta como un checkpoint y devuelve el mismo Results. Ejecutar el grafo en un runtime pelado, sin LibreYOLO instalado, también está soportado, pero entonces el preprocesado y el postprocesado corren de tu cuenta.

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 el archivo exportado
from libreyolo import LibreYOLO, SAMPLE_IMAGE # La factoría enruta según la extensión del archivo, así que un# artefacto exportado se carga como cualquier checkpoint y devuelve el# mismo objeto Results.model = LibreYOLO("LibrePICODETs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Checkpoints

Todos los archivos de pesos publicados de esta familia.

ArchivoEntrada (px)Licencia de los pesos
Detection
LibrePICODETs.pt320apache-2.0
LibrePICODETm.pt416apache-2.0
LibrePICODETl.pt640apache-2.0

Todos los archivos anteriores existen hoy en la organización de LibreYOLO y se descargan la primera vez que se usan.

Licencia

Comprueba la licencia en el repositorio de Hugging Face de los pesos concretos que descargues. Cada checkpoint de la organización de LibreYOLO incluye una, y no siempre es la misma en toda una familia. Ese repositorio es la fuente autorizada; el resumen siguiente describe qué se aplicaba cuando se verificó esta página por última vez.

Esta es una descripción de las licencias implicadas, no asesoramiento legal. Si la respuesta es importante a nivel comercial, lee las licencias y busca tu propio asesoramiento.

Trabajo original
PP-PicoDet, PaddlePaddle (Baidu)
Licencia del proyecto original
Apache-2.0
Fuente del proyecto original
github.com/PaddlePaddle/PaddleDetection
Código de LibreYOLO
MIT
Pesos
Apache-2.0, republicados en huggingface.co/LibreYOLO
Interpretación
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.

El port de LibreYOLO sigue a Bo396543018/Picodet_Pytorch, una reimplementación en PyTorch del PP-PicoDet original de PaddleDetection, con mmcv eliminado y todas las activaciones replicadas con exactitud para que los checkpoints de PaddlePaddle convertidos con el pipeline de Bo carguen sin ninguna deriva numérica. Ambas fuentes llevan los mismos términos Apache-2.0 que los autores del paper.

Cita

@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 del bloque de cita de los autores en github.com/PaddlePaddle/PaddleDetection/blob/release/2.8/configs/picodet/README_en.md#cite-pp-picodet.

Verificado con LibreYOLO v1.5.0. Las tablas de compatibilidad, los checkpoints y las cifras de rendimiento de esta página se generan a partir de la biblioteca publicada y los pesos publicados; no se escriben a mano.