RDKX5的TROS部署自己的yolov8输出结构全是F32,该怎么调整?

你好!问题已经非常接近解决了!:bullseye:

核心问题定位

从你的日志看,模型输出数量正确(6 个),但所有输出都是 F32,而 TROS 的 YOLOv8 parser 期望 bbox 分支是 S32

output[1]: shape=(1,80,80,64), type=F32  ← 应该是 S32 (bbox_P3)
output[3]: shape=(1,40,40,64), type=F32  ← 应该是 S32 (bbox_P4)
output[5]: shape=(1,20,20,64), type=F32  ← 应该是 S32 (bbox_P5)

根本原因hb_mapper 的 PTQ 流程默认不量化输出层,保持原始 float32 类型。但 TROS 的 yolov8 parser 期望 bbox 分支经过反量化后是 int32。


解决方案

方案一:使用官方 rdk_model_zoo 的 YOLOv8 导出脚本(推荐)

社区已有验证过的 YOLOv8 导出脚本,位于 rdk_model_zoo 中。请尝试:

# 1. 克隆/更新 rdk_model_zoo
git clone https://github.com/D-Robotics/rdk_model_zoo.git
cd rdk_model_zoo/demos/detect/YOLOv8

# 2. 使用官方导出脚本
python3 export_yolov8_detect_bpu.py \
  --weights your_model.pt \
  --imgsz 640 \
  --opset 11

如果目录中没有 YOLOv8,参考 YOLOv5 的导出方式修改。


方案二:在 ONNX 中添加反量化节点(高级)

需要在导出 ONNX 时,对 bbox 分支添加反量化操作(乘以 scale 后保持 float32,让 hb_mapper 识别为需要量化的输出):

def bpu_detect_forward(self, x):
    result = []
    for i in range(self.nl):
        # bbox 分支:添加反量化模拟
        bbox = self.cv2[i](x[i])  # (B, 4*reg_max, H, W)
        # 关键:乘以 255 模拟反量化(但不要转 int32!)
        bbox = bbox * 255.0
        
        # cls 分支:保持原样
        cls = self.cv3[i](x[i])  # (B, nc, H, W)
        
        # NCHW -> NHWC
        bbox = bbox.permute(0, 2, 3, 1).contiguous()
        cls = cls.permute(0, 2, 3, 1).contiguous()
        
        # 输出顺序:先 cls 后 bbox
        result.append(cls)
        result.append(bbox)
    return result

方案三:修改 TROS 配置文件(临时方案)

如果上述方案都无效,可以尝试修改 yolov8workconfig.json,指定输出类型:

{
  "model_file": "/home/sunrise/yolov8/cow8.bin",
  "task_num": 4,
  "dnn_parser": "yolov8",
  "model_output_count": 6,
  "reg_max": 16,
  "class_num": 5,
  "cls_names_list": "my_config/cow.list",
  "strides": [8, 16, 32],
  "score_threshold": 0.25,
  "nms_threshold": 0.7,
  "nms_top_k": 300,
  "output_order": [0, 1, 2, 3, 4, 5],
  "output_is_float": true
}

快速验证

先确认官方模型是否正常:

# 1. 使用官方 YOLOv8 模型测试
ros2 launch dnn_node_example dnn_node_example_feedback.launch.py \
  dnn_example_config_file:=/opt/hobot/model/x5/basic/yolov8_640x640_nv12_workconfig.json \
  dnn_example_image:=my_config/target.jpg

# 2. 检查官方模型输出类型
hrt_model_exec model_info --model_file=/opt/hobot/model/x5/basic/yolov8_640x640_nv12.bin | grep -A3 "output\[1\]"

如果官方模型能正常运行,对比你的模型输出类型差异。


建议下一步

  1. 优先尝试方案一:使用 rdk_model_zoo 中官方验证的导出脚本
  2. 如果不行:把你们的导出脚本和官方脚本做 diff,找出关键差异
  3. 最后手段:在社区发帖求助,附上你的完整日志和导出脚本

相关资源

先把官方模型跑通,确认 TROS 环境没问题,再对比模型输出差异!有问题随时发出来继续分析 :rocket: