当前位置:   article > 正文

YOLOV8-NCNN_yolov8 ncnn

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

欢迎交流~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/863093
推荐阅读
相关标签
  

闽ICP备14008679号