YOLOv8-Pose NCNN安卓部署
前言
YOLOv8-Pose NCNN安卓部署
目前的帧率可以稳定在30帧左右,下面是这个项目的github地址:https://github.com/gaoxumustwin/ncnn-android-yolov8-pose
介绍
在做YOLOv8-Pose NCNN安卓部署的时候,在github上发现了https://github.com/eecn/ncnn-android-yolov8-pose已经有大佬实现了这一操,并且也给出了它是如何导出ncnn模型的;
该作者是使用YOLOv8的官方给出的NCNN模型导出的方式,我按照这个方式导出ncnn模型,并观察其网络结构如下:
这个网络结构有一些错综复杂,感觉是有大量的计算图追踪,但是其安卓部署的时候速度在20帧左右也还可以接受,并且YOLOv8的官方给出了NCNN推理的python代码
https://github.com/ultralytics/ultralytics/tree/a007668e1fa8d5d586e6daa3924d65cfb139b8ac/examples/YOLOv8-NCNN-Python-Det-Pose-Cls-Seg-Obb
由于之前看到了三木君大佬,在23年的时候在知乎发布的一篇文章,只导出模型的Backbone
+ Neck
,这种思路在玩瑞芯微设备的时候多次接触,三木君大佬也给出了原因:
- 只导出模型,不导出后处理方便对模型进行公平的测速,
MMYOLO
里面的算法多种多样,而且大多是Backbone
+Neck
结构,这样测速才能较为公平体现模型的速度差异。 - 有些模型需要部署到嵌入式设备,导出后处理的话相当与会有海量的加减乘除要计算,由于模型应用会通过置信度过滤很多检测结果,会导致大多计算都是多余的。
- 有些推理后端对后处理算子支持很差,可能会无法转换到对应后端的模型,或者转换后的模型无法充分利用 BPU/TPU/NPU/GPU 加速等等问题存在。
- 很多要部署的模型都会用
c/c++
重写后处理加速,后处理代码可以多线程计算,异步计算效率会更高。
同时在CSDN上发现了有佬根据上面的思路编写了NCNN代码并且给出了NCNN代码的github地址
此时只需要参照前面的yolov8安卓部署实现把这个只导出模型的Backbone
+ Neck
的YOLOv8-Pose NCNN代码进行简单改写就可以实现
环境
我使用的ultralytics版本如下:
pip install ultralytics==8.2.98
安装好ultralytics后,后面的操纵需要更改源码,所以需要知道ultralytics安装的路径,可以使用下面的方式进行查询
>>> import ultralytics
>>> ultralytics.__version__
'8.2.98'
>>> ultralytics.__path__
pathto\ultralytics
修改
模型导出时的网络修改
修改pathto\ultralytics\nn\modules\head.py文件中的POSE类,在其forward函数中加如下代码
if self.export or torch.onnx.is_in_onnx_export():
results = self.forward_pose_export(x)
return tuple(results)
同时在POSE类加上新如下函数
def forward_pose_export(self, x):
results = []
for i in range(self.nl):
dfl = self.cv2[i](x[i]).permute(0, 2, 3, 1).contiguous()
cls = self.cv3[i](x[i]).permute(0, 2, 3, 1).contiguous()
kpt = self.cv4