x5 cpu docker提取下载问题

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 官方文档

建议学习路径:

  1. 先用方式 2(官方 Sample)跑通单张图片推理
  2. 再尝试方式 1(自己写 Python 脚本)
  3. 最后根据项目需求选择是否集成 ROS2

需要我帮你写一个完整的推理脚本模板吗?(包含预处理 + 推理 + 后处理 + 结果可视化)