RDK X5 板端图像处理与推理教程
模型转换完成后,在板端使用有 3 种方式,按推荐顺序:
方式 1:Python 推理(最简单,推荐新手)
步骤 1:传输文件到板子
# 在宿主机执行
scp yolov5s_bayese_640x640_nv12.bin root@x5_ip:/home/root/models/
scp test.jpg root@x5_ip:/home/root/models/
步骤 2:编写推理脚本
在板子上创建 inference.py:
#!/usr/bin/env python3
import cv2
import numpy as np
from hobot_dnn import bpu
# 1. 加载模型
model_path = "/home/root/models/yolov5s_bayese_640x640_nv12.bin"
predictor = bpu.BpuPredictor(model_path)
# 2. 读取图像
img = cv2.imread("/home/root/models/test.jpg")
h, w = img.shape[:2]
# 3. 预处理(根据模型输入格式)
# 如果模型是 nv12 输入:
nv12 = cv2.cvtColor(img, cv2.COLOR_BGR2NV12)
input_data = nv12
# 如果模型是 rgb 输入:
# rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# input_data = rgb
# 4. 推理
results = predictor.run_async([input_data]).results()
# 5. 后处理(解析 YOLO 输出)
# 根据模型输出格式解析 boxes, scores, classes
print(f"推理完成,输出形状:{[r.shape for r in results]}")
# 6. 释放资源
predictor.release()
步骤 3:运行
# 在板子上
python3 inference.py
方式 2:使用官方 Sample(最快上手)
官方 rdk_model_zoo 已提供完整推理代码:
# 1. 在板子上克隆仓库(如果还没有)
git clone https://github.com/D-Robotics/rdk_model_zoo.git
cd rdk_model_zoo/samples/vision/ultralytics_yolo/runtime/python
# 2. 修改配置
# 编辑 main.py,将 model_path 改为你的模型路径
# 3. 运行
python3 main.py \
--task detect \
--model-path /home/root/models/yolov5s_bayese_640x640_nv12.bin \
--test-img /home/root/models/test.jpg \
--label-file coco.names \
--classes-num 80 \
--reg 16 \
--strides 8,16,32 \
--score-thres 0.25 \
--nms-thres 0.7
关键参数说明:
--reg: YOLO 的 reg_max 值(v5 通常是 16)--strides: 检测头步长(8,16,32)--classes-num: 类别数
方式 3:ROS2 集成(机器人项目用)
如果需要与 ROS2 集成(如接收摄像头数据、发布检测结果):
# 1. 创建工作目录
mkdir -p ~/hobot_ws/src
cd ~/hobot_ws/src
# 2. 克隆 dnn_node_example
git clone https://github.com/D-Robotics/dnn_node_example.git
# 3. 编译
cd ~/hobot_ws
colcon build --symlink-install
source install/setup.bash
# 4. 配置文件
# 修改 src/dnn_node_example/config/yolov5_workconfig.json
# 设置 model_file 为你的模型路径
# 5. 运行
ros2 run dnn_node_example example \
--ros-args \
-p feed_type:=1 \
-p config_file:=config/yolov5_workconfig.json
图像预处理详解
根据你的模型输入格式选择:
NV12 输入(推荐,性能最好)
import cv2
import numpy as np
# 读取 BGR 图像
img = cv2.imread("test.jpg")
# 转为 NV12
nv12 = cv2.cvtColor(img, cv2.COLOR_BGR2NV12)
# 直接输入模型
results = predictor.run_async([nv12]).results()
RGB 输入
# 读取 BGR 图像
img = cv2.imread("test.jpg")
# 转为 RGB
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 如果需要 resize
rgb_resized = cv2.resize(rgb, (640, 640))
# 输入模型
results = predictor.run_async([rgb_resized]).results()
摄像头实时推理
import cv2
from hobot_dnn import bpu
# 打开摄像头
cap = cv2.VideoCapture(0)
predictor = bpu.BpuPredictor("yolov5s.bin")
while True:
ret, frame = cap.read()
if not ret:
break
# 预处理
nv12 = cv2.cvtColor(frame, cv2.COLOR_BGR2NV12)
# 推理
results = predictor.run_async([nv12]).results()
# 后处理 + 显示
# ... 解析 results 并绘制框 ...
cv2.imshow("Detection", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
predictor.release()
cv2.destroyAllWindows()
后处理示例(YOLO 检测)
def postprocess_yolo(outputs, img_w, img_h, score_thres=0.25, nms_thres=0.5):
"""
YOLO 后处理:解码 + NMS
outputs: 模型输出列表(通常是 3 个检测头)
"""
import numpy as np
# 1. 合并多尺度输出
# 根据模型输出格式解析 boxes, scores, classes
# 2. 过滤低置信度
mask = scores > score_thres
boxes = boxes[mask]
scores = scores[mask]
classes = classes[mask]
# 3. NMS
from torchvision.ops import nms
keep = nms(torch.from_numpy(boxes), torch.from_numpy(scores), nms_thres)
# 4. 坐标还原到原图
scale = min(640 / img_w, 640 / img_h)
boxes = boxes / scale
return boxes, scores, classes
性能优化建议
| 优化项 | 方法 |
|---|---|
| 输入格式 | 优先用 NV12,避免 RGB 转换开销 |
| 内存复用 | 预分配输入 buffer,避免每帧重新分配 |
| 零拷贝 | ROS2 场景用 hbmem 共享内存 |
| 多线程 | 推理与后处理分离到不同线程 |
| 模型优化 | 用 optimize_level: O3 量化 |
完整参考资源
| 资源 | 链接 |
|---|---|
| 官方 Sample 代码 | rdk_model_zoo |
| YOLO 全流程教程 | RDK YOLO Toolkit |
| 目标检测入门 | RDK X5 目标检测入门 |
| BPU SDK API | 官方文档 |
建议学习路径:
- 先用方式 2(官方 Sample)跑通单张图片推理
- 再尝试方式 1(自己写 Python 脚本)
- 最后根据项目需求选择是否集成 ROS2
需要我帮你写一个完整的推理脚本模板吗?(包含预处理 + 推理 + 后处理 + 结果可视化)