I’m deploying YOLO26n (detect) on an Orange Pi 5 Plus (RK3588, 6 TOPS NPU) via RKNN export (end2end=False, per issue #23753) for a real-time edge use case with a ~500ms end-to-end latency budget (detection + tracking + embedding).
Has anyone benchmarked real inference latency/fps for YOLO26n on RK3588/RK3588S via RKNN? Looking for actual on-device numbers (ms/frame for detect + NMS postprocessing), not just the 6 TOPS spec sheet.
As I understand it, RKNN export currently only officially supports the detect task for YOLO26 (no seg/obb). Is that still accurate? If so, are there recommended alternatives for instance segmentation on this NPU — community RKNN export tooling, a different architecture, or anything else worth looking at?
The repo I linked supports YOLO11-OBB export on RKNN.
You can’t do it without modifying Ultralytics at all because Ultralytics doesn’t have official support for it. The linked repo is a fork of Ultralytics with modifications for RKNN support.
Is OBB on RKNN officially supported by Ultralytics? No.
But you also asked if there are “community tooling” that supports it:
As I understand it, RKNN export currently only officially supports the detect task for YOLO26 (no seg/obb). Is that still accurate? If so, are there recommended alternatives for instance segmentation on this NPU — community RKNN export tooling, a different architecture, or anything else worth looking at?
which is why I linked you to an unofficial community developed alternative above in my earlier response.
If you want to ask if there’s official support by Ultralytics, then the answer is no currently
We validated RKNN Toolkit conversion for all seven tasks in Linux Docker and added the same all-task smoke matrix to CI and the production worker image. One important distinction: this validates successful RKNN export/conversion; actual NPU inference latency and accuracy still need to be measured on Rockchip hardware.
All the YOLO26 models support inference without NMS including YOLO26 OBB models. However, RKNN doesn’t support the NMS-free head, which is why if you run inference using RKNN, you still need NMS. This a limitation with RKNN. It doesn’t support the required ops.
Hi @user4@pderrenger, One thing I would keep in mind when moving from YOLO26 FP32 to RKNN + custom C++ postprocessing is that export success does not always guarantee output parity. In your case, there are several independent variables that can affect final counting accuracy:
RKNN INT8/FP16 numerical changes may affect borderline detections.
The custom C++ NMS/postprocessing implementation may introduce differences compared with the original PyTorch pipeline.
Small confidence or box geometry changes can be amplified by tracking logic (especially under heavy occlusion).
A useful validation step before tuning the dataset further is to run the same field frames through:
PyTorch FP32 reference
vs.
RKNN + C++ postprocessing output
and compare:
confidence score deltas
box/OBB geometry shifts
dropped detections after thresholding
tracker association changes
This helps separate:
“the model needs more data”
from
“the deployment pipeline changed the model behavior.”
I am currently exploring a lightweight label-free deployment parity diagnostic workflow for exactly this type of cross-backend validation. Your RK3588 + YOLO26 + custom NMS setup would actually be an interesting real-world case to test this approach. Happy to compare notes if you reach the export stage.
To give a pragmatic update for when you reach the RKNN export and custom C++ NMS stage:
Since you are running tracking downstream (e.g. for real-time video/counting), even tiny confidence deltas between PyTorch FP32 and C++ postprocessing can cause “flickering” or dropped tracks under heavy occlusion. If you encounter unexpected missed detections on RK3588 later, here is a quick 3-step Parity Checklist to run before changing your dataset:
1.Pre-NMS Raw Tensor Alignment: Feed the exact same preprocessed image tensor to both PyTorch FP32 and RKNN NPU. Compare raw logit/confidence deltas to isolate quantization loss from NMS logic.
2.C++ NMS Threshold Boundary Check: Log detections that exist in PyTorch FP32 with confidence around . See if RKNN numerical drift pushed them just below your C++ NMS threshold.
3.Temporal Stability / Tracker Check: Pass PyTorch FP32 bounding boxes vs. RKNN C++ boxes into your tracker separately on a short video clip. Compare ID switch counts to verify if tracking instability is caused by geometry jitter.
Isolating these 3 layers early saves weeks of unnecessary re-annotation .
Not yet — we don’t currently have an official end-to-end C++ RKNN runtime example for yolo26n-obb.rknn.
The yolo_postprocess.hpp file linked above provides shared preprocessing and postprocessing, but it does not load or execute an RKNN model. I should also clarify that its current non-end-to-end OBB path uses axis-aligned proxy NMS, so it is not a complete reference for accurate rotated NMS on RKNN.
The supported ready-to-run path today is Python with YOLO("./yolo26n-obb_rknn_model"), as shown in the RKNN documentation. A C++ implementation would need to connect Rockchip’s rknn_api input/output buffers to preprocessing and a true rotated-box NMS implementation. I don’t want to point you to the existing header as though a verified turnkey C++ RKNN OBB example already exists.