ncnn-android-yolov7
这是一个示例 ncnn android 项目,它依赖于 ncnn 库和 opencv
https://github.com/Tencent/ncnn
https://github.com/nihui/opencv-mobile
https://github.com/xiang-wuu/ncnn-android-yolov7
如何构建和运行
步骤1
https://github.com/Tencent/ncnn/releases
下载 ncnn-YYYYMMDD-android-vulkan.zip或自己构建 ncnn for android
将 ncnn-YYYYMMDD-android-vulkan.zip 提取到 app/src/main/jni 中,并在 app/src/main/jni/CMakeList 中将ncnn_DIR路径更改为您的路径.txt
步骤2
https://github.com/nihui/opencv-mobile
下载opencv-mobile-XYZ-android.zip
将opencv-mobile-XYZ-android.zip提取到app/src/main/jni中,并在app/src/main/jni/CMakeLists中将OpenCV_DIR路径更改为您的路径.txt
步骤3
使用Android Studio打开这个项目,构建它并享受!
一些注意事项
- 安卓 ndk 相机用于最佳效率
- 由于缺少HAL3相机接口,崩溃可能发生在非常旧的设备上
- 所有模型均手动修改以接受动态输入形状
- 大多数小型模型在 GPU 上的运行速度比在 CPU 上的运行速度慢,这很常见
- 由于相机曝光时间较长,在黑暗环境中的FPS可能较低
跑自己的模型
流程:pt->onnx->ncnn。
1、yolov7(pt->onnx)
下载代码和权重,这里用的是tiny。
代码用main分支的,权重手动下载release里的。
运行
python export.py yolov7-tiny.pt --simplify
运行时要加simplify,不然onnx转ncnn会有不支持的算子。
2、ncnn(onnx->ncnn)
使用下面这个网站转换,要把三个勾都选上。
https://convertmodel.com
3、修改权重输入输出
进入Netron,上传自己的param文件查看权重输入输出(1个输入、3个输出),并更改代码后即可直接编译;
获取晚后在ncnn-android-yolov7/app/src/main/jni/yolo.cpp的Yolo::detect方法修改着几个地方:
in0->images
out0->265
out1->279
out2->293
4、修改标注类别名称
不出意外,到这里重新编译一下就可以
由于部分设备不支持camera2,新增JNI方法,传图片进行识别
具体调用看MainActivity处理
THE END
感谢查阅
玉念聿辉:编辑