RDKx5板载yolov11我也是成功了!

跟着超哥摸索 https://developer.d-robotics.cc/forumDetail/253775338902237209-
注:所有路径最好全英文,因为有中文路径可能会出不知道的错-
第一步下载源码训练你的模型!-
注:环境自己配python可以选高一点-
yolov11源码地址-
https://github.com/ultralytics/ultralytics-
下载为zip-
去这个网站可以自己标注也可以通过别人的开源数据集-
https://roboflow.com/-

-
我们就找一个鞋子的训练集效果不错拿来用了-
将下载完的源码和数据集解压-
这里训练要下一个

pip install ultralytics 后面转onnx时要把这个库删掉

yolo detect train data=你的配置文件(xx.yaml)的绝对路径 model=yolo11n.pt pretrained=yolo11n.pt epochs=100 batch=4 lr0=0.01 resume=False
//这个训练代码不一定要和我一样根据自己的电脑来安排

data那里的路径如果是开源数据集下载下来的已经有配好的yaml直接用就行了-

-
然后将训练好的pt模型转成onnx格式-
这里非常重要!!!

pip uninstall ultralytics   # 或者
conda uninstall ultralytics  #都试一试一定要确保这个库不在环境里了

然后修改我们下载的源码-
下面和超哥一样修改-
修改Detect的输出头,直接将三个特征层的Bounding Box信息和Classify信息分开输出,一共6个输出头。-
文件目录:./ultralytics/ultralytics/nn/modules/head.py,约第58行,=Detect类的forward方法替换成以下内容.-
注:建议您保留好原本的forward方法,例如改一个其他的名字forward_, 方便在训练的时候换回来。

def forward(self, x):
  bboxes = [self.cv2[i](x[i]).permute(0, 2, 3, 1).contiguous() for i in range(self.nl)]
  clses = [self.cv3[i](x[i]).permute(0, 2, 3, 1).contiguous() for i in range(self.nl)]
  return (bboxes, clses)

把你的模型从runs搬到与runs同级目录-
进入你修改好的源码路径比如-
C:\Yolo\yolo11\ultralytics,然后建一个a.py(txt改后缀就好了)复制粘贴下面代码,-
如果有No module named onnxsim报错,安装一个即可-
注意,如果生成的onnx模型显示ir版本过高,可以将simplify=False。两种设置对最终bin模型没有影响,打开后可以提升onnx模型在netron中的可读性。

from ultralytics import YOLO
YOLO('你训练的模型.pt').export(imgsz=640, format='onnx', simplify=True, opset=11)

目录cmd进入环境-
命令行python a.py-

-
然后你的目录就多了一个你的模型.onnx-
-
可以用这个网站看一下他的节点(我看不懂但大为震撼)-
https://netron.app/-
接下来需要docker和wsl这个我以前配置过有一点点麻烦-
我给你们连接你们看这个大佬的-
https://blog.csdn.net/Zhaoxi_Li/article/details/125516265?spm=1001.2014.3001.5502-
配好以后-
因为要用x5所以要重新下工具链的包-
https://developer.d-robotics.cc/forumDetail/251934919646096384-

-
把镜像和sdk源码下载,镜像下好打开docker就会有一个(我多一个x3的)-
-
这个源码额好像是要解压的,我解压的时候,中间会说什么没有权限没关系能用

-
挂载你的文件

docker run -it --rm \
-v "C:\RdkX5_TOOL\Ai_Toolchain_Package-release-v1.23.8-OE-v1.2.6":/open_explorer \
-v "C:\RdkX5_TOOL\DATA":/data \
openexplorer/ai_toolchain_ubuntu_20_x5_cpu:"${version}"

解释第二行要是你解压出来的文件绝对位置-
第三行是为了方便数据交换,比如你的模型就可以直接拖进去用(文件夹自己建然后挂上去就好了)-
最后一行是你的镜像名,还有别忘记改你的版本,有可能已经和我不一样了-
最好写成一行,我分行写老是报错

docker run -it --rm  -v "C:\RdkX5_TOOL\Ai_Toolchain_Package-release-v1.23.8-OE-v1.2.6":/open_explorer -v "C:\RdkX5_TOOL\DATA":/data openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.6

这样你就成功了!-
-
首先检测你的模型

cd /data #根据你上面挂载上去的方便交换的数据

把模型拉到你的文件夹里面是那个训练好的onnx

hb_mapper checker --model-type onnx --march bayes-e --model 模型名字.onnx #

然后叽哩吧啦的,你会发现好多算子都在bpu上说明利用很厉害,反正用bpu跑就是快!-
在同目录下(这里是data目录)建一个后缀为.yaml(改后缀就好了)window文件夹里操作-
里面直接复制粘贴-
超哥贴子里的,有两个根据需要自己选我这里给一个!!!-
里面有要修改的参数

model_parameters:
  onnx_model: './你的模型名字.onnx'
  march: "bayes-e"
  layer_out_dump: False
  working_dir: 'bin_dir/yolo11n_detect_bayese_640x640_nv12'
  output_model_file_prefix: 'yolo11n_detect_bayese_640x640_nv12'
  # YOLO11 n, s, m
  node_info: {"/model.10/m/m.0/attn/Softmax": {'ON': 'BPU','InputType': 'int16','OutputType': 'int16'}}
  # YOLO11 l, x
  # node_info: {"/model.10/m/m.0/attn/Softmax": {'ON': 'BPU','InputType': 'int16','OutputType': 'int16'},
  #             "/model.10/m/m.1/attn/Softmax": {'ON': 'BPU','InputType': 'int16','OutputType': 'int16'}}
input_parameters:
  input_name: ""
  input_type_rt: 'nv12'
  input_type_train: 'rgb'
  input_layout_train: 'NCHW'
  norm_type: 'data_scale'
  scale_value: 0.003921568627451
calibration_parameters:
  cal_data_dir: './calibration_data_rgb_f32_640'
  cal_data_type: 'float32'
compiler_parameters:
  compile_mode: 'latency'
  debug: False
  optimize_level: 'O3'

里面要修改的参数是-
第二行 onnx_model: ‘./你的模型名字.onnx’-
第四行和第五行选着改,就是输出的名字-
这个是校准数据集,需要你把数据集改一下格式保存在这个文件夹里,如何改我把代码放在下面-
calibration_parameters:-
cal_data_dir: ‘./calibration_data_rgb_f32_640’-
cal_data_type: ‘float32’-
注:文件名可自定义-
然后

hb_mapper makertbin --model-type onnx --config 你的yaml文件的名字.yaml

结束以后你就会发现在自动生成的working_dir: 'bin_dir/yolo11n_detect_bayese_640x640_nv12’这个路径下有一个.bin文件如果没有改名他就叫yolo11n_detect_bayese_640x640_nv12.bin-
检查一下这个bin模型代码要在有bin文件的路径下比如这时你cd bin_dir/yolo11n_detect_bayese_640x640_nv12

hb_perf yolo11n_detect_bayese_640x640_nv12.bin

你就会得到一个hb_perf_result文件夹点进去到最下面的目录有一个png图片点开看看模型是不是这样六个输出就是对的-

-
如果是下面这个大图片,这个好吧重新转换一下pt到onnx因为你没有修改forward函数,或者pip,conda的库没删!导致输出不一样,虽然你会后处理的话我想是可以用,但是我不会啊-
-
好啦!把模型拷到板子上-
然后把超哥的python推理代码搬过来https://developer.d-robotics.cc/forumDetail/253775338902237209-
,因为是我们自己训练的模型所以要改我用中文写的地方

parser = argparse.ArgumentParser()
    parser.add_argument('--model-path', type=str, default='models/yolo11n_detect_bayese_640x640_nv12.bin(模型的地址)', 
                        help="""Path to BPU Quantized *.bin Model.
                                RDK X3(Module): Bernoulli2.
                                RDK Ultra: Bayes.
                                RDK X5(Module): Bayes-e.
                                RDK S100: Nash-e.
                                RDK S100P: Nash-m.""") 
    parser.add_argument('--test-img', type=str, default='../../../resource/assets/bus.jpg(你测试用的图片地址)', help='Path to Load Test Image.')
    parser.add_argument('--img-save-path', type=str, default='jupyter_result.jpg', help='Path to Load Test Image.')
    parser.add_argument('--classes-num', type=int, default=你的模型要检测的数量!比如只检测鞋子填1, help='Classes Num to Detect.')
    parser.add_argument('--reg', type=int, default=16, help='DFL reg layer.')
    parser.add_argument('--iou-thres', type=float, default=0.45, help='IoU threshold.')
    parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold.')

然后下拉代码找到也是改我的中文

def postProcess(self, outputs: list[np.ndarray]) -> tuple[list]:
    begin_time = time()
    # reshape
    s_bboxes = outputs[0].reshape(-1, 64)
    m_bboxes = outputs[1].reshape(-1, 64)
    l_bboxes = outputs[2].reshape(-1, 64)
    s_clses = outputs[3].reshape(-1, 你的模型要检测的数量!比如只检测鞋子填1)
    m_clses = outputs[4].reshape(-1, 你的模型要检测的数量!比如只检测鞋子填1)
    l_clses = outputs[5].reshape(-1, 你的模型要检测的数量!比如只检测鞋子填1)

再改一下

coco_names = [填你的检测框的名字一定要和你的模型检测个数一样,(上面的也是要一样)如果不知道就去https://netron.app/看看你的onnx文件最下面的输出点一下右边就会显示
]

好啦运行一下就欧克-
附上我改成usb摄像头输出的代码c_shoe.py,用了HDMI显示屏输出要记得关掉desktop!如果是桌面版的话

sudo systemctl stop lightdm

x.py是图片转换的校准数据集代码-
引用的博客-
https://developer.d-robotics.cc/forumDetail/253775338902237209-
https://blog.csdn.net/Zhaoxi_Li/article/details/125516265?spm=1001.2014.3001.5502-
再次感谢各位大佬的资料让我学到了许多!

c_shoe.py-
x.py

想问一下各位佬 报错illegal instuction是不成功 cpu不兼容吗?我用的是virtualbox挂载的ubuntu20.04

帧率不高,如果不用tros肯定不行。但是这个tros的攻略超哥写的很乱,新手完全干不了

大佬,请问这个怎么解决,代码是借鉴c_shoe.py的改动了一些,是有一些库没有下载吗?

2025-04-15 00:21:23.952744092 [E:onnxruntime:, sequential_executor .cc:183 Execute] Non-zero status code returned while running Resha pe node. Name:‘/model.10/m/m.0/attn/Reshape’ Status Message: /home /jenkins/agent/workspace/model_convert_hmct1_ut_cpu_1.1.0/onnxrunt ime/onnxruntime/core/providers/cpu/tensor/reshape_helper.h:43 onnx runtime::ReshapeHelper::ReshapeHelper(const onnxruntime::TensorSha pe&, std::vector&) gsl::narrow_cast<int64_t>(input_shape .Size()) == size was false. The input tensor cannot be reshaped to the requested shape. Input shape:{8,256,20,20}, requested shape:{ 1,2,128,400}

这种情况正常吗,是尺寸不对吗-
训练用的是640*320图片,模型yolov11n.pt-

这个没有移除反量化节点么?

大佬,请问帧率能达到多少呀?

Congratulations!

x.py文件里是处理图片的,里面会把不同大小的文件自动压缩成某一长宽比,你可以看一下

和你一样

实测,板端部署,帧率50左右

解决了 虽然不知道啥原理解决的