YOLOv5-pytorch迁移至android

本文记录了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修改为减少后的层数
    改前:
    YOLOv5-pytorch迁移至android_第1张图片
    改后:
    YOLOv5-pytorch迁移至android_第2张图片

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

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

如下:

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

没有关系,是正常现象

解决:
③、修改生成的best-opt.param
改前:
在这里插入图片描述
改后:
在这里插入图片描述
以上主要参考<知乎>在ncnn实现YoloV5的Focus模块

三、ncnn -> android

该巨巨实现了在ncnn中YoloV5Focus的自定义以及YoloV5的后处理,就很棒
(╹▽╹)面向GitHub编程
ncnn-android-yolov5
YOLOv5-pytorch迁移至android_第3张图片
替换模型文件即可,连上安卓手机

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

你可能感兴趣的:(yolov5,android,studio,pytorch)