CV / YOLOv10
YOLOv10
reComputer R Series (CM5 + Hailo-10H)
YOLOv10 object detection for reComputer RK3576, RK3588, and R Series with Hailo-8 or Hailo-10H.
Choose the device you're using, the set up guide and documentation will update accordingly.
Getting Started
sudo docker run --rm \
--name cm5-hailo10h-yolov10n \
--privileged \
--net=host \
-e PYTHONUNBUFFERED=1 \
--device /dev/hailo0:/dev/hailo0 \
-v /usr/lib/libhailort.so.5.1.1:/usr/lib/libhailort.so.5.1.1:ro \
-v /usr/lib/libhailort.so:/usr/lib/libhailort.so:ro \
ghcr.io/seeed-projects/recomputer-hailo10h-cv/yolov10n:latest \
python web_detection.py --model_path model/yolov10n.hef --video_path video/test.mp4Model Details
reComputer R Series (CM5 + Hailo-10H)YOLOv10 on reComputer R Series (CM5 + Hailo-10H)
YOLOv10n / YOLOv10s / YOLOv10b / YOLOv10x perform COCO 80-class object detection on Hailo-10H through HailoRT. The compiled HEF runs NMS on-chip (HPP) with the one2one head, so the host parses the post-NMS result and never decodes boxes or runs NMS itself.
This page targets reComputer R Series (CM5 + Hailo-10H) with a PCIe Hailo-10H accelerator.
Hardware and Host Setup
| Item | Value |
|---|---|
| Board | reComputer R Series with Raspberry Pi CM5 |
| Accelerator | Hailo-10H over PCIe, exposed as /dev/hailo0 |
| Runtime | HailoRT 5.1.1 |
| Python in container | 3.13, aarch64 |
Install the Hailo-10H packages on the host and confirm that the driver and device are ready before starting the container:
sudo apt update
sudo apt install hailo-h10-all -y
sudo reboot
# After reboot
hailortcli --version
hailortcli fw-control identify
ls -l /dev/hailo0The expected HailoRT version for these images is 5.1.1.
Run With Demo Video
YOLOv10n:
sudo docker run --rm \
--name cm5-hailo10h-yolov10n \
--privileged \
--net=host \
-e PYTHONUNBUFFERED=1 \
--device /dev/hailo0:/dev/hailo0 \
-v /usr/lib/libhailort.so.5.1.1:/usr/lib/libhailort.so.5.1.1:ro \
-v /usr/lib/libhailort.so:/usr/lib/libhailort.so:ro \
ghcr.io/seeed-projects/recomputer-hailo10h-cv/yolov10n:latest \
python web_detection.py --model_path model/yolov10n.hef --video_path video/test.mp4YOLOv10s:
sudo docker run --rm \
--name cm5-hailo10h-yolov10s \
--privileged \
--net=host \
-e PYTHONUNBUFFERED=1 \
--device /dev/hailo0:/dev/hailo0 \
-v /usr/lib/libhailort.so.5.1.1:/usr/lib/libhailort.so.5.1.1:ro \
-v /usr/lib/libhailort.so:/usr/lib/libhailort.so:ro \
ghcr.io/seeed-projects/recomputer-hailo10h-cv/yolov10s:latest \
python web_detection.py --model_path model/yolov10s.hef --video_path video/test.mp4YOLOv10b:
sudo docker run --rm \
--name cm5-hailo10h-yolov10b \
--privileged \
--net=host \
-e PYTHONUNBUFFERED=1 \
--device /dev/hailo0:/dev/hailo0 \
-v /usr/lib/libhailort.so.5.1.1:/usr/lib/libhailort.so.5.1.1:ro \
-v /usr/lib/libhailort.so:/usr/lib/libhailort.so:ro \
ghcr.io/seeed-projects/recomputer-hailo10h-cv/yolov10b:latest \
python web_detection.py --model_path model/yolov10b.hef --video_path video/test.mp4YOLOv10x:
sudo docker run --rm \
--name cm5-hailo10h-yolov10x \
--privileged \
--net=host \
-e PYTHONUNBUFFERED=1 \
--device /dev/hailo0:/dev/hailo0 \
-v /usr/lib/libhailort.so.5.1.1:/usr/lib/libhailort.so.5.1.1:ro \
-v /usr/lib/libhailort.so:/usr/lib/libhailort.so:ro \
ghcr.io/seeed-projects/recomputer-hailo10h-cv/yolov10x:latest \
python web_detection.py --model_path model/yolov10x.hef --video_path video/test.mp4Open http://<Board_IP>:8000 to view the web preview.
USB Camera Mode
sudo docker run --rm \
--name cm5-hailo10h-yolov10n \
--privileged \
--net=host \
-e PYTHONUNBUFFERED=1 \
--device /dev/hailo0:/dev/hailo0 \
--device /dev/video0:/dev/video0 \
-v /usr/lib/libhailort.so.5.1.1:/usr/lib/libhailort.so.5.1.1:ro \
-v /usr/lib/libhailort.so:/usr/lib/libhailort.so:ro \
ghcr.io/seeed-projects/recomputer-hailo10h-cv/yolov10n:latest \
python web_detection.py --model_path model/yolov10n.hef --camera_id 0Swap yolov10n for yolov10s, yolov10b or yolov10x to use another variant.
HEF Files
| Model | Size | Notes |
|---|---|---|
yolov10n.hef | 5,230,592 (5.0 MB) | 2.3M params, 6.8G ops, 38.5 mAP (full precision) |
yolov10s.hef | 10,182,656 (9.7 MB) | 7.2M params, 21.7G ops, 45.85 mAP (full precision) |
yolov10b.hef | 19,619,840 (18.7 MB) | 20.15M params, 92.09G ops, 52.0 mAP (full precision) |
yolov10x.hef | 26,251,264 (25.0 MB) | 31.72M params, 160.56G ops, 53.7 mAP (full precision) |
All four variants are Hailo Model Zoo v5.4.0 Hailo-10H builds of the same THU-MIG YOLOv10 family.
Source: https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v5.4.0/hailo10h/yolov10n.hef (yolov10s.hef, yolov10b.hef, yolov10x.hef in the same directory).
REST API
POST http://<Board_IP>:8000/api/models/yolov10n/predictcurl -X POST "http://<Board_IP>:8000/api/models/yolov10n/predict" \
-F "file=@test.jpg"| Endpoint | Method | Purpose |
|---|---|---|
/ | GET | Web preview UI |
/api/models/yolov10{n,s,b,x}/predict | POST | Detections (JSON) |
/api/video_feed | GET | MJPEG preview stream |
Implementation Notes
- The Model Zoo
base/yolov10.yamluseshpp=trueanddevice_pre_post_layers.nms=truewithmeta_arch=yolov8, applies sigmoid on the three one2one class convolutions and documentsinfo.output_shape: 80x5x100(80 classes, at most 100 boxes per class). - The parser nodes are the one2one head (
/model.23/one2one_cv2.{0,1,2}/Convbox,/model.23/one2one_cv3.{0,1,2}/Convclass): one prediction per grid cell, no anchors. Nothing is decoded and no NMS runs on the host. - HailoRT 5.1.1 returns the raw NMS-by-class buffer as a flat 1-D FLOAT32 array in compact layout: per class one integer-valued detection count followed by only that many
[ymin, xmin, ymax, xmax, score]rows, normalized to [0, 1]. The parser stops at the first implausible class header, so the worst-case padding tail is not read as data; ragged NMS-by-score and dense(1,C,5,D)/(1,C,D,5)layouts stay supported as well. - The IOU slider has no effect (NMS is on-chip); the confidence slider filters the parsed detections.
- The HEF bakes
normalize_in_net(mean 0 / std 255) andpadding_color=114: the app letterboxes with gray (114) and feeds raw uint8 RGB pixels — no manual normalization. - Class IDs 0..79 index the standard COCO class list directly.
- First-inference diagnostics are disabled in production (
_OUTPUT_LOGGED = True); set it toFalseinweb_detection.pyto dump the raw output type, shape, value range and per-class rows when validating a new HEF.
Development Notes
- Source modules:
src/hailo10h_yolov10{n,s,b,x}/in thereComputer-Hailo10H-CVrepository - Containers:
ghcr.io/seeed-projects/recomputer-hailo10h-cv/yolov10{n,s,b,x}:latest - On Hailo-8 (R20 demo) only n/b/x are published; the Hailo-10H builds cover all four variants.
- Model licence: AGPL-3.0 (upstream THU-MIG/yolov10).
Inputs and Outputs
Input: image, video, or USB camera frame. Output: detection boxes, classes, confidences, and annotated MJPEG preview.