本文记录了yolov5迁移至android的详细过程
流程三步走:1、pytorch转换成onnx; 2、onnx转换成ncnn;3、在android部署ncnn。
在此感谢逝去的头发 o(╥﹏╥)o

一、pytorch -> onnx

1、 打开yolov5/models/export.py,修改红色框路径

转换后我们得到 best.onnx
2、去掉onnx模型的冗余维度

pip install onnx-simplifier
python -m onnxsim best.onnx best-sim.onnx

至此我们得到简化后的onnx模型文件:best-sim.onnx

二、onnx -> ncnn

1、windows下编译ncnn(血与泪的回忆)

windows下编译ncnn官方教程
①、需要安装的依赖库:
* ncnn
* vs2019
* protobuf-3.4.0
* opencv
②、选择git clone或zip download下载ncnn源码
③、在vs2019的本机工具命令提示符里编译
开始 → Visual Studio 2019→ Visual Studio Tools → x64 Native Tools Command Prompt for VS 2019
④、编译protobuf

cd protobuf-3.4.0> mkdir build> cd build> cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake> nmake> nmake install

⑤、编译ncnn

 cd ncnn-master> mkdir -p build> cd build> cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=../../protobuf-3.4.0/build/install/include -DProtobuf_LIBRARIES=../../protobuf-3.4.0/build/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=../../protobuf-3.4.0/build/install/bin/protoc.exe -DNCNN_VULKAN=OFF ..> nmake> nmake install

✿ヽ(°▽°)ノ✿编译成功后,在ncnn-master/build/tools/onnx下有可执行文件onnx2ncnn.exe
注:
(1)ncnn的cmake步骤注意修改protobuf路径(当前路径在ncnn的build下)
(2)错误信息:

The submodules were not downloaded! Please update submodules with "git submodule update --init" and try again.

解决:官方Git里cmake语句 -DNCNN_VULKAN=ON,改成OFF
(3)错误信息:

could not find opencv

解决:在CmakeLists.txt里添加opencv路径
set(OpenCV_DIR D:/opencv/build)
find_package(OpenCV REQUIRED)
(4)错误信息:

LINK : fatal error LNK1181: 无法打开输入文件“..\..\protobuf-3.4.0\build\install\lib\libprotobuf.lib.lib”

解决:打开/ncnn-master/tools/caffe/CmakeLists.txt修改protobuf lib路径
target_link_libraries(caffe2ncnn PRIVATE ${PROTOBUF_LIBRARIES} )
target_link_libraries(caffe2ncnn PRIVATE D:/Downloads/protobuf-3.4.0/build/install/lib/libprotobuf.lib)

2、实现onnx转换ncnn

onnx2ncnn best-sim.onnx best.param best.bin

如下

Unsupported slice step !Unsupported slice step !Unsupported slice step !Unsupported slice step !Unsupported slice step !Unsupported slice step !Unsupported slice step !Unsupported slice step !

没有关系,这是由于yolov5/models/common.py中Focus模块转换操作,切片操作在ncnn中不被支持

class Focus(nn.Module):    # Focus wh information into c-space    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups        super(Focus, self).__init__()        self.conv = Conv(c1 * 4, c2, k, s, p, g, act)    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)        return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))

解决:
①、修改生成的best.param

  • 用 Exp层替换有来的Split + Crop + Concat
    (Exp是森莫我也不知道,反正nihui这样说的)
  • 第二行layer_count修改为减少后的层数
    改前:

    改后:

②、用ncnnoptimize.exe修正,顺便转为 fp16 存储减小模型体积

ncnnoptimize best.param best.bin best-opt.param best-opt.bin 65536

如下:

Input layer images without shape info, shape_inference abortedInput layer images without shape info, estimate_memory_footprint aborted

没有关系,是正常现象

解决:
③、修改生成的best-opt.param
改前:

改后:

以上主要参考<知乎>在ncnn实现YoloV5的Focus模块

三、ncnn -> android

该巨巨实现了在ncnn中YoloV5Focus的自定义以及YoloV5的后处理,就很棒
(╹▽╹)面向GitHub编程
ncnn-android-yolov5

替换模型文件即可,连上安卓手机

---------------------------------------------------- end ----------------------------------------------------------

更多相关文章

  1. Pycharm安装PyQt5的详细教程
  2. Android(安卓)内核源代码交叉编译(创建自己的模拟器内核,哈哈终于
  3. android studio 开发 Execution failed for task
  4. Android(安卓)打造编译时注解解析框架 这只是一个开始
  5. [置顶] Android(安卓)启动 白屏问题 解决
  6. Android中JNI的使用方法
  7. Android(安卓)Studio项目/Flutter 案例Gradle报错通用解决方案(包
  8. ionic3中android状态栏
  9. Android上的ART虚拟机

随机推荐

  1. 一个讲的很好的android SDK 入门网站
  2. Android HAL层HAL_MODULE_INFO
  3. android:uploaddatatoWeb
  4. Android与服务器通信
  5. android获取存储卡使用情况
  6. 毕设---android按钮事件
  7. android 使用百度地图画轨迹
  8. android ImageSwitcher案例
  9. Android Fragment 简洁版 list
  10. android seekbar的用法