赞
踩
最近对yolov8接触的蛮多。趁此,今天用ncnn对u版的yolov8n进行部署。
模型可自行在官方u版yolov8仓下载。我用的是yolov8n模型。
看父类
找推理
当前部署的是检测模型,找到相关检测部分的代码,看检测头前向过程。
推理部分
decode
decode
不了解模型输出,可以先自己打印出来看,熟悉每个一个维度所表示的对象。拿传入的x举例,[1,144,80,80]分别表示: 1 : batch, 144 : nc (80) + reg (16*4), 80 : num_grid_w, 80 : num_grid_h. 可以看到,最终输出的dbox是经过decode的,直接把decode的代码在c++重写一下即可(一般情况是ncnn转换不支持的算子自己才在c++重写)。这里的chunk算子我没有尝试用ncnn转换,或许可以,大家可以自己试一试。支持也可以自己写,可以加深对这一部分的理解,或许也可以提速?
导出代码重写
最后导出onnx模型的时候,重写一下这一部分的代码就可以了。我这儿是将box和cls输出分开输出,三个特征层的输出已经concat,导出的onnx如下:
onnx可视化
cpp
python
anchor-free,预测的中心点和四个边界的距离,最后用每个特征层的stride映射回去就可以了。
先放一张错误的检测结果
错例
最后排查,是param里有两个reshape的参数0没有改成-1,如下
问题
导出的时候,图片大小是640×640,最后输出的三层的网格数量为8400,现在我们推理的图片的大小在resize的时候,不一定是640×640,输出的数量是不一样的,需要改成0=-1,自适应输出。这儿我们的倒数第二个reshape参数不对,应该是影响到划分网格的坐标了,两张图大小不匹配,导致最后框的大小有问题。如若是最后一个reshape有问题,就会导致满屏的输出。或许我的分析有问题,欢迎大家交流。
用ncnn部署模型,主要还是前处理和后处理。后处理的代码灵活多变,每个人的导出方式不一样,写的代码也不一样。下一步准备对transformer的模型进行部署尝试,顺带熟悉一下transformer结构。
最后方上检测结果和代码:
检测结果
YOLOV8-NCNNhttps://github.com/marvellee1/YOLOV8-NCNN
欢迎交流~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。