YOLOV8-NCNN

最近对yolov8接触的蛮多。趁此,今天用ncnn对u版的yolov8n进行部署。

1. 模型准备

模型可自行在官方u版yolov8仓下载。我用的是yolov8n模型。

2. 熟悉后处理,pt2onnx

看父类

找推理

当前部署的是检测模型,找到相关检测部分的代码,看检测头前向过程。

推理部分

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可视化

3. 代码重写

cpp

python

anchor-free,预测的中心点和四个边界的距离,最后用每个特征层的stride映射回去就可以了。

4. 遇到的问题

先放一张错误的检测结果

错例

最后排查,是param里有两个reshape的参数0没有改成-1,如下

问题

导出的时候,图片大小是640×640,最后输出的三层的网格数量为8400,现在我们推理的图片的大小在resize的时候,不一定是640×640,输出的数量是不一样的,需要改成0=-1,自适应输出。这儿我们的倒数第二个reshape参数不对,应该是影响到划分网格的坐标了,两张图大小不匹配,导致最后框的大小有问题。如若是最后一个reshape有问题,就会导致满屏的输出。或许我的分析有问题,欢迎大家交流。

5. 总结

用ncnn部署模型,主要还是前处理和后处理。后处理的代码灵活多变,每个人的导出方式不一样,写的代码也不一样。下一步准备对transformer的模型进行部署尝试,顺带熟悉一下transformer结构。

最后方上检测结果和代码:

检测结果

YOLOV8-NCNNicon-default.png?t=N7T8https://github.com/marvellee1/YOLOV8-NCNN

欢迎交流~

  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值