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。
