地平线x5下运行yolo11s-seg模型

经过地瓜机器人工作人员(感谢吴超同学)的及时技术支持,整体比较顺利的跑起来了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 protos
        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()
            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参数不要修改

然后就可以用教程的命令运行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zgrobot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值