熬夜数日给 RDK S100 写了个 BPU 原生推理库 BCDL(检测/分割/OCR/双目深度/ByteTrack…C++Base PythonBind),已开源

BCDL —— RDK S100/S100P/S600 的 BPU 推理与多媒体库(开源) 倾注心血、希望大家喜欢

仓库:GitHub - ruisv/bcdl: BPU-native vision stack for RDK S100/S100P/S600: zero-copy inference pipelines, hardware-accelerated codec, and Python/C++ SDK. · GitHub | 协议:Apache-2.0 | 板型:RDK S100 / S100P / S600

加载一个编译好的 .hbm,推理、前后处理、硬件编解码、取流全部在板端完成,
多媒体与计算单元之间默认零拷贝。C++17 实现,附 NumPy 友好的 Python 绑定。

效果展示

功能

视觉任务(均含 CPU/NEON 后处理,也提供无需 Engine 的纯 decode_* 函数):

  • 检测:anchor-free LTRB 多尺度 + DFL 头(YOLO26 / v8 / v5 / v11),分类别 NMS
  • 分类
  • 姿态:17 关键点
  • 实例分割:proto × mask-coef
  • 旋转框 OBB:旋转 IoU NMS
  • 语义分割
  • 单目深度
  • 双目深度:双图视差
  • OCR:三段式 PP-OCRv5(DBNet 检测 → PP-LCNet 方向分类 → CRNN/CTC 识别,18385 类)
  • 多目标跟踪:ByteTrack(Kalman + 两阶段关联)

多媒体:

  • 硬件 JPEG 编解码(JPU)
  • 硬件 H.264 / H.265 编解码(VPU)

流水线(缓冲复用,链路 JPU → VP → BPU → CPU/VPU):

  • DetectionPipeline(同步)
  • AsyncDetectionPipeline(预处理与推理多线程重叠)
  • TrackingPipeline、StereoPipeline
  • 视频文件 → 解码 → 检测

后端与封装:

  • Engine 封装 hbDNN(hbDNNInferV2),自动处理缓存一致性(推理前 clean、读取前 invalidate)
  • 零拷贝 / 反量化的输出读取器
  • SysMem / Task / MemPool 等 RAII(move-only)核心封装
  • Python:nanobind 绑定,NumPy 进出,阻塞推理时释放 GIL

统一基础:整套计算 + 多媒体建立在两个 hobot 原语之上——hbUCPSysMem
(唯一共享内存缓冲,BPU 张量 / 编解码图像 / VP 单元共用)与 hbUCPTaskHandle_t
(唯一任务模型,推理 / 编解码 / resize 同一调度器)。因此零拷贝是默认行为。

性能(RDK S100P,软件 4.0.5)

infer 为纯 BPU 推理,decode 为 infer 加 BCDL 后处理:

任务 模型 输入 infer (ms) infer (FPS) decode (ms)
分类 yolo26n 224² 0.45 2235 0.45
检测 yolo26n (LTRB) 640² 1.16 860 1.99
姿态 yolo26n 640² 1.31 761 1.52
实例分割 yolo26n 640² 1.64 612 11.4
旋转框 yolo26n 640² 1.15 872 1.65
语义分割 deeplabv3plus 2048×1024 49.6 20 58.0
单目深度 depth-anything-v2 686×518 113 9 117
双目深度 las2-m 640×480 14.2 71 21.8
OCR PP-OCRv5 三段 960²/48×320 20.2 50 137
  • yolo26s @1280×720 流式:同步 216 FPS,异步重叠 334 FPS(约 1.55 倍)
  • 硬件 JPEG 解码(JPU)比 cv2/libjpeg 快约 3.6–5.3 倍(零拷贝 NV12 → BPU)

安装与使用

板上 conda 装,免编译(Python 3.9–3.14 均有预编译包,依赖的 hobot SDK 已随包打包):

conda install -c https://mirrors.ruis.ai/conda -c conda-forge bcdl
python -c "import bcdl; print(bcdl.__version__)"

异步流式检测示例:

import bcdl

engine = bcdl.Engine("models/yolo26s_det_nashm_640x640_nv12.hbm")
cfg = bcdl.PipelineConfig(); cfg.detect.num_classes = 80
pipe = bcdl.AsyncDetectionPipeline(engine, cfg, depth=3)

for i, frame in enumerate(frames):     # frame: HxWx3 uint8 BGR
    pipe.submit(frame)
    if i >= 3:
        for d in pipe.next():
            print(d.class_id, d.score, d.x1, d.y1, d.x2, d.y2)
pipe.finish()

C++ 示例见 examples/。纯 C++ 用户装 libbcdl 后 find_package(bcdl) 即可。

说明

  • 模型转换(ONNX → .hbm、PTQ)在 x86 用 OpenExplorer 离线完成,BCDL 只跑成品;
    .hbm 按 march 编译(S100/S100P 共用 Nash,S600 单独编),运行时代码全系列通用。
  • BCDL 本体 Apache-2.0,不打包模型权重;示例所用第三方模型遵循各自许可证
    (Ultralytics YOLO 为 AGPL-3.0,商用注意)。

仓库含中英 README、Python/C++ API 参考、完整基准与标注图。欢迎 issue / PR。

项目地址:GitHub - ruisv/bcdl: BPU-native vision stack for RDK S100/S100P/S600: zero-copy inference pipelines, hardware-accelerated codec, and Python/C++ SDK. · GitHub

1 个赞

如果有兴趣小伙伴欢迎试用,我也可以提供权重