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/
要把三个勾都选上。
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权重输出有点不一样。
这是作者的模型
这是我的模型
他的后处理是在卷积层后,而官方的权重在三个输出头后面又接了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,暂时不清楚哦)
参考资料(排名不分先后)
-
https://github.com/WongKinYiu/yolov7
-
https://github.com/xiang-wuu/ncnn-android-yolov7
-
https://convertmodel.com/
-
https://blog.csdn.net/m0_50837237/article/details/126055947