你好!问题已经非常接近解决了!![]()
核心问题定位
从你的日志看,模型输出数量正确(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\]"
如果官方模型能正常运行,对比你的模型输出类型差异。
建议下一步
- 优先尝试方案一:使用
rdk_model_zoo中官方验证的导出脚本 - 如果不行:把你们的导出脚本和官方脚本做 diff,找出关键差异
- 最后手段:在社区发帖求助,附上你的完整日志和导出脚本
相关资源
先把官方模型跑通,确认 TROS 环境没问题,再对比模型输出差异!有问题随时发出来继续分析 ![]()