yolov7 ncnn安卓部署(pt->onnx->ncnn)

0-前言

网上有很多yolov5在安卓上的部署,yolov7的比较少。因为需要替换自己的模型,把踩过的坑记录一下。

流程:pt->onnx->ncnn。

1-yolov7(pt->onnx)

下载代码和权重,这里用的是tiny。

代码用main分支的,权重手动下载release里的。

(PS:测试时如果出现‘Command ‘git tag’ returned non-zero exit status 128.’报错就手动下载权重,参考资料4)

运行

python export.py yolov7-tiny.pt --simplify

运行时要加simplify,不然onnx转ncnn会有不支持的算子。

2-ncnn(onnx->ncnn)

这部分当然可以编译protobuf和ncnn的代码,自行百度,但是太麻烦。

推荐一个网站,可以直接转换,太良心了。

https://convertmodel.com/

要把三个勾都选上。

yolov7 ncnn安卓部署(pt->onnx->ncnn)_第1张图片

3-安卓部署

下载代码:https://github.com/xiang-wuu/ncnn-android-yolov7

按照readme的要求下载ncnn-YYYYMMDD-android-vulkan.zip和opencv-mobile-XYZ-android.zip。

我用的是ncnn-20210525-android-vulkan和opencv-mobile-4.5.1-android。

打开Android Studio启动项目,sdk路径应该能获取到,但相机的ndk路径可能会找不到,在local.properties文件中修改ndk.dir,你可以在AS中下载,也可以手动下载安装包,r21e对应21.4.7075529,修改下路径即可。

4-编译

编译成功即可运行,打包apk很简单自行百度。

5.使用自己的模型

这份代码使用的yolov7权重输出有点不一样。

这是作者的模型

yolov7 ncnn安卓部署(pt->onnx->ncnn)_第2张图片

这是我的模型

yolov7 ncnn安卓部署(pt->onnx->ncnn)_第3张图片

他的后处理是在卷积层后,而官方的权重在三个输出头后面又接了reshape和permute。

我一开始仿照ncnn官方代码yolov7的例子,取的是permute后的输出,结果闪退且没有框。

他们的后处理generate_proposals有些不同,最简单的办法就是也取卷积的输出。

在ncnn-android-yolov7/app/src/main/jni/yolo.cpp的Yolo::detect修改:
in0->images
out0->259
out1->279
out2->299

其他部分不用改,重新编译就能运行。

(PS:对比了一下他的模型是fp16的,但好像代码里没有设置opt.use_fp16_arithmetic = true,暂时不清楚哦)

参考资料(排名不分先后)

  1. https://github.com/WongKinYiu/yolov7

  2. https://github.com/xiang-wuu/ncnn-android-yolov7

  3. https://convertmodel.com/

  4. https://blog.csdn.net/m0_50837237/article/details/126055947

你可能感兴趣的:(android)