上篇文章中我们在pycharm中已经成功运行了yolov5-v5.0的版本,这里来记录一下如何将模型生成onnx ,再将onnx文件转成ncnn (这里转成ncnn是为了之后部署到Android端去)。
打开models文件夹下有一个export.py文件,打开这个修改配置参数
修改weights里边的权重文件路径,我这里使用了自己训练的一个模型文件(注意:如果是自己训练的模型文件需要将.pt文件放在models文件目录下,不然运行会报找不到权重文件的错误),也可以使用默认官网的yolov5s.pt做转换。
接下来右击鼠标运行就可以
如果运行报无法找到XXX模块名,可以直接去anaconda中切换当前使用的深度学习环境输入“pip install 模块名”,进行下载即可。不出错运行结束会生成三个文件,都会保存再models文件目录下。(这里我只需要onnx,第三个没有下载对应模块没生成成功,所以我也没去下载那个模块了,如果有需要的也是一样再anaconda中下载对应模块即可)。
找到models文件即可看到onnx
接下来就可以准备转成ncnn了。
这里推荐使用在线转换工具进行onnx->ncnn的转换。
工具链接:https://convertmodel.com/#input=onnx&output=onnx
选择刚刚生成的onnx进行转换ncnn,如果转换成功则后续可以直接部署到Android,但是如果有报错的话我们需要对生成的文件进行一点小小的修改才能部署Android。
上述报错解决方法;
首先我们把生成的两个文件下载下来
使用文本编辑器打开这个.param的文件准备,这里我就直接用pycharm打开了。
这里推荐一个工具:Netron ,我们可以使用这个先打开我们的.param文件看看模型数据。
https://netron.app/
看到我们没有修改的模型数据会有六个Crop。我们需要修改的就是这个。
还是回到pycharm我们打开的.param文件。
找到Concat,记录下倒数第二个参数。(等下要用到)
/model.0/Concat_output_0
随后将4~13行 (Input下面开始, Convolution上面结束)需要删除掉这六个Crop,加上中间的Split和concat。
成这样
然后再Input下面添加 “ YoloV5Focus focus 1 1 images ”+之前记录的参数 “/model.0/Concat_output_0”
示例:
YoloV5Focus focus 1 1 images /model.0/Concat_output_0
这样参数就修改好了,我们再次使用Netron工具打开看看我们的模型数据。
这样模型数据就修改好了。
首先我们下载VS2019,使用免费的社区版本即可。
链接:visualstudio 2019下载
b. 下载cmake,这里我下载的是3.26.0版本。
链接:CMake 下载
Cmake下载完成解压后需要添加系统环境变量,点击bin文件,复制路径。
配置好之后可以Ctrl+R进入到cmd下输入cmake检测是否安装成功。
c. 下载编译Protobuf 3.4.0
链接:Protobuf-v3.4.0
下载解压后就可以准备编译这个了,这里建议新建一个文件夹进行这些文件的下载等...
首先点击win键,找到刚刚下载的VS2019,右击这个命令窗口,从管理员方式进入这个窗口(下面的编译都在这里进行)
> cd
> mkdir build-vs2019
> cd build-vs2019
> 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
第一个cd是这个Protobuf 3.4.0的根目录,自行更换路径。然后一条一条执行这些命令即可。
(1).执行完cmake那条命令出现上述界面则标志编译下载成功。
(2).执行完nmake命令出现下面的界面则表示编译成功。
(3).执行nmake install进行下载。
到此Protobuf 3.4.0就算编译完成了。
d. 编译ncnn
ncnn-Releases
编译步骤和上面的Protobuf编译差不多,同样也是在VS2019命令窗口中执行。
> cd
> mkdir build-vs2019
> cd build-vs2019
> cmake -G"NMake Makefiles" ^-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install
-DProtobuf_INCLUDE_DIR=/build-vs2019/install/include
-DProtobuf_LIBRARIES=/build-vs2019/install/lib/libprotobuf.lib
-DProtobuf_PROTOC_EXECUTABLE=/build-vs2019/install/bin/protoc.exe
-DNCNN_VULKAN=OFF ..
> nmake
> nmake install
第一条cd为ncnn的根目录,自行修改路径,然后一条一条执行后面的命令。Cmake的命令需要修改三个路径,将
示例:
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=C:/Users/aixin698/Desktop/onnx_ncnn/csdn/protobuf-3.4.0/build-vs2019/install/include -DProtobuf_LIBRARIES=C:/Users/aixin698/Desktop/onnx_ncnn/csdn/protobuf-3.4.0/build-vs2019/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=C:/Users/aixin698/Desktop/onnx_ncnn/csdn/protobuf-3.4.0/build-vs2019/install/bin/protoc.exe -DNCNN_VULKAN=OFF ..
然后一样的nmake编译
下载
结束后我们找到ncnn新建的那个build-vs2019文件夹->tools->onnx目录下,这样就可以看到生成了一个onnx2ncnn的exe文件。
到这里这样就成功一大步了,下面就可以通过命令将onnx转成ncnn文件了。
转换:
打开VS2019命令提示窗口,cd 进入ncnn-20201218-full-source\build-vs2019\tools\onnx目录下。
b. 通过命令转换,将下述命令的<.onnx>替换成我们yolov5生成的.onnx文件路径(这里我将.onnx文件复制到了当前目录下),将<.param>替换成待会需要生成的.param的名称,将<.bin>替换成待会需要生成的.bin的名称,随后回车运行。
./onnx2ncnn <.onnx> <.param> <.bin>
示例:
onnx2ncnn best.onnx best.param best.bin
运行之后会出现这样的
没有关系,这个报错和我们方法一中的处理方法一样去修改参数就好了。我们再次打开这个onnx文件夹就会出现转换过来的.param文件和.bin文件了。
onnx转ncnn推荐使用方法一去实现,实在是报错解决不了则再通过方法二去实现,方法二转换起来会复杂很多,同时也可以使用ubuntu的环境下去转换会简单一些。
那么到此,本章中要实现的目标就完成了。那么如果过程中有行不通的情况可以评论留言。下面就可以通过这两个文件通过ncnn的方式部署Android了。