经过地瓜机器人工作人员(感谢吴超同学)的及时技术支持,整体比较顺利的跑起来了yolo11s-seg分割模型。将一些经验记录下来:
首先下载使用docker镜像: https://developer.d-robotics.cc/forumDetail/228559182180396619 https://developer.d-robotics.cc/forumDetail/251934919646096384
本人使用的使用的docker环境是:openexplorer/ai_toolchain_ubuntu_20_x5_gpu v1.2.6
整体要跑起来yolo11s-seg模型,分为两部:
1、导出正确的onnx模型文件;
2、生成反量化的bin模型文件;
1、导出正确的onnx模型文件
参考https://developer.d-robotics.cc/forumDetail/251934743552436332 和https://github.com/D-Robotics/rdk_model_zoo/blob/main/demos/Instance_Segmentation/YOLOv8-Seg/README_cn.md 1.1 下载项目
git clone https://github.com/ultralytics/ultralytics.git
1.2 创建虚拟环境
conda create -n yolov8 python=3.8 -y # 进入虚拟环境
conda activate yolov8
1.3、卸载yolo
- 卸载yolo相关的命令行命令,这样直接修改
./ultralytics/ultralytics
目录即可生效。
$ conda list | grep ultralytics $ pip list | grep ultralytics # 或者 # 如果存在,则卸载 $ conda uninstall ultralytics $ pip uninstall ultralytics # 或者
1.4、修改模型结构
- 修改ultralytics/ultralytics/nn/modules/head.py中Detect类的forward部分,其余部分不变动
class Detect(nn.Module):def forward(self, x):results = []for i in range(self.nl):box = self.cv2[i](x[i]).permute(0, 2, 3, 1).contiguous()cls = self.cv3[i](x[i]).permute(0, 2, 3, 1).contiguous()results.append(cls)results.append(box)return tuple(results)
- 修改ultralytics/ultralytics/nn/modules/head.py中Segment类的forward部分,其余部分不变动
class Segment(Detect):def forward(self, x):p = self.proto(x[0]).permute(0, 2, 3, 1).contiguous() # mask protosresults = []for i in range(self.nl):box = self.cv2[i](x[i]).permute(0, 2, 3, 1).contiguous()cls = self.cv3[i](x[i]).permute(0, 2, 3, 1).contiguous()mask = self.cv4[i](x[i]).permute(0, 2, 3, 1).contiguous()results.append(cls)results.append(box)results.append(mask)results.append(p)return tuple(results)
1.5、进入python,导出onnx文件
from ultralytics import YOLO
YOLO('yolo11s-seg.pt').export(imgsz=640, format='onnx', simplify=False, opset=11)
这里需要注意simplify参数,之前设置为true或没有设置,导致导出的onnx文件ir version为10,不满足后续check要求。设置为false后,目前导出的版本为6,可以正常使用;
2、生成反量化的bin模型文件
2.1、进入docker环境
docker run -it -v /home/robot:/open_explorer openexplorer/ai_toolchain_ubuntu_20_x5_gpu:v1.2.6
2.2、check
(bpu_docker) $ hb_mapper checker --model-type onnx --march bayes-e --model yolov8n-seg.onnx
2.3、编译,需要下载校准文件并保存到calibration_data_rgb_f32文件夹里。参考目标检测yolov5的例子操作
(bpu_docker) $ hb_mapper makertbin --model-type onnx --config yolov8_instance_seg_bayese_640x640_nv12.yaml
2.4、进入编译结果文件,并查看可以移除的反量化节点
cd yolo11s_instance_seg_bayese_640x640_nv12
hb_model_modifier yolo11s_instance_seg_bayese_640x640_nv12.bin
- 在生成的hb_model_modifier.log文件中,找到以下信息。主要是找到大小为[1, 160, 160, 32]、[1, 80, 80, 64]、[1, 80, 80, 32]、[1, 40, 40, 64]、[1, 40, 40, 32]、[1, 20, 20, 64]、[1, 20, 20, 32] 这几个输出的名称(即除了分类以外的所有输出)。注意, 导出时这些名称可能不同, 请仔细确认.
2.5、 移除节点
hb_model_modifier yolo11s_instance_seg_bayese_640x640_nv12.bin -r "490_HzDequantize" -r "/model.23/cv2.0/cv2.0.2/Conv_output_0_HzDequantize" -r "/model.23/cv4.0/cv4.0.2/Conv_output_0_HzDequantize" -r "/model.23/cv2.1/cv2.1.2/Conv_output_0_HzDequantize" -r "/model.23/cv4.1/cv4.1.2/Conv_output_0_HzDequantize" -r "/model.23/cv2.2/cv2.2.2/Conv_output_0_HzDequantize" -r "/model.23/cv4.2/cv4.2.2/Conv_output_0_HzDequantize"
移除后的模型为:yolo11s_instance_seg_bayese_640x640_nv12_modified.bin,至此模型文件生成完成。
2.6、运行验证
将模型拷贝到x5板子上:
scp D:\X3\yolo_seg\yolo11s_instance_seg_bayese_640x640_nv12_modified.bin sunrise@172.16.3.126:/home/sunrise/yolo_seg
在修改workconfig.json文件,将其中的model_file修改对应模型文件名。注意:dnn_Parser参数不要修改
然后就可以用教程的命令运行了