PicoDet

PicoDet is a single-stage detector built for mobile and edge CPUs: an ESNet backbone, a CSP-PAN neck and a shared Generalized Focal Loss head. LibreYOLO supports it for detection.

Tasks
detection
Sizes
s, m, l at 320 to 640 px
Install
pip install libreyolo
Support tier
Supported, since v. Supporting trainables: kept green in CI, features land opportunistically.
Upstream
PP-PicoDet by PaddlePaddle (Baidu), Apache-2.0. Paper, source
Licenses
Code Apache-2.0, weights Apache-2.0. Commercial use

Install

PicoDet needs no extra beyond the base package.

bash
pip install libreyolo

Predict

Weights download from Hugging Face on first use and are cached locally.

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

The returned Results object is the one every family returns, so swapping in a different detector is a one line change. conf sets the confidence threshold and iou the NMS threshold. See prediction for sources, streaming and result handling.

Variants

Three sizes, each at its own fixed input resolution: s the smallest and l the largest. Resolution grows with the size, so larger checkpoints are also more expensive to run per image, on top of carrying more parameters.

CheckpointInput (px)mAP 50-95Params (M)
LibrePICODETs32029.50.99
LibrePICODETm41637.62.15
LibrePICODETl64044.23.31

COCO val2017, 500 images. Measured by the LibreYOLO benchmark harness and published on Vision Analysis, where latency across hardware and runtimes is compared and the full run records live.

Train

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibrePICODETs.pt")model.train(    data="my-dataset.yaml",    epochs=300, batch=16, lr0=0.01,)
CLI
# imgsz is worth setting: the CLI defaults it to 640, while the s# checkpoint is native at 320.libreyolo train model=LibrePICODETs.pt data=my-dataset.yaml imgsz=320 epochs=300 batch=16 lr0=0.01

The loss components and the assigner follow the upstream recipe: VFL, DFL, GIoU and SimOTA, with classification-quality weighting and dynamic-IoU VFL targets. Inference is bit-equivalent to upstream on the same checkpoint.

What has not been checked, per train()'s own docstring: full-dataset convergence, multi-GPU behavior, and any augmentation beyond horizontal flip. The s checkpoint at its native 320 has also not reliably cleared LibreYOLO's accuracy floor on the 30-image, two-class fixture the library tests small fine-tunes with. That size is a better fit at full-COCO scale.

train() also accepts a pretrained argument, but the value is never read inside the method: training always continues from whatever weights the model was constructed with, so pretrained=False does not reinitialize the network. Leave imgsz unset in Python and it takes the loaded checkpoint's native resolution, 320 for s, 416 for m and 640 for l. The CLI always sends an imgsz, defaulting to 640, so set it there to match the checkpoint.

Left alone otherwise, the trainer runs 300 epochs with SGD at lr0=0.01, momentum 0.9, weight decay 4e-5 and a 1-epoch warmup on a cosine schedule. Horizontal flip is the only augmentation applied.

See training for datasets, augmentation, multi-GPU and loggers.

Validate

val() returns a dictionary of metrics/ keys covering precision, recall, mAP 50 and mAP 50-95, measured against any dataset in the format you trained on.

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

Export

TaskONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: supported. Detection to TorchScript: supported. Detection to ExecuTorch: supported. Detection to TensorRT: supported. Detection to OpenVINO: supported. Detection to Paddle: not supportedDetection to MNN: not supportedDetection to RKNN: supported. Detection to ncnn: supported. Detection to TFLite: not supportedDetection to CoreML: not supportedDetection to Core AI: supported.

An exported artifact loads back through LibreYOLO() on its file suffix, so a .onnx or .engine file behaves like a checkpoint and returns the same Results. Running the graph in a bare runtime, with no LibreYOLO installed, is also supported, but then preprocessing and postprocessing are yours to write.

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
Use the exported file
from libreyolo import LibreYOLO, SAMPLE_IMAGE # The factory routes on the file suffix, so an exported artifact loads# like any checkpoint and returns the same Results object.model = LibreYOLO("LibrePICODETs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Checkpoints

Every published weight file for this family.

FileInput (px)Weights license
Detection
LibrePICODETs.pt320apache-2.0
LibrePICODETm.pt416apache-2.0
LibrePICODETl.pt640apache-2.0

Every file above exists in the LibreYOLO org today and downloads on first use.

Licensing

Check the license on the Hugging Face repository of the specific weights you download. Every checkpoint in the LibreYOLO org carries one, and they are not always the same across a family. That repository is the authoritative source; the summary below describes what applied when this page was last verified.

This is a description of the licenses involved, not legal advice. If the answer matters commercially, read the licenses yourself and take your own counsel.

Original work
PP-PicoDet, PaddlePaddle (Baidu)
Upstream license
Apache-2.0
LibreYOLO code
MIT
Weights
Apache-2.0, republished at huggingface.co/LibreYOLO
Interpretation
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.

LibreYOLO's port follows Bo396543018/Picodet_Pytorch, a PyTorch re-implementation of PaddleDetection's original PP-PicoDet, with mmcv stripped out and every activation matched exactly so PaddlePaddle checkpoints converted through Bo's pipeline load with no numerical drift. Both sources carry the same Apache-2.0 terms as the paper's authors.

Citation

@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}
}

Copied from the authors' citation block at github.com/PaddlePaddle/PaddleDetection/blob/release/2.8/configs/picodet/README_en.md#cite-pp-picodet.

Verified against LibreYOLO v1.5.0. Support tables, checkpoints and benchmark numbers on this page are generated from the released library and the published weights, not written by hand.