跟着超哥摸索 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-
再次感谢各位大佬的资料让我学到了许多!