大前端

前端学习之家-大前端

YOLOv4 darknet模型转换成caffemodel再转om在Atlas服务器上面推理

YOLOv4 darknet模型转换成caffemodel

上网搜过很多转换教程,但是很多都少了一些步骤,这里的话自己整理一份教程,本人实测可以转换成功,如果大家觉得有用,关注点赞加收藏也是一种美德哦.

1. 准备训练好的darknet模型以及配置文件

如下图所示这里只需要darknet版本的cfg文件以及weights文件即可,data和names文件可以不用
在这里插入图片描述

2. git克隆转换文件仓库

克隆模型转换代码

git clone https://github.com/ChenYingpeng/darknet2caffe.git

3. 运行原版caffe的容器

网上有很多版本的教程都是要使用GPU版本的代码,但是GPU版本的代码NVCC各种不兼容,Debug时候浪费了好多时间,并且还不一定解决,我这边就是掉进了无底洞,原地哭泣一分钟.这里直接用CPU版本的caffe.

拉取CPU版本的原版caffe

docker pull bvlc/caffe:cpu

运行镜像生成容器,这里为了方便访问宿主机文件设置了映射

docker run --name caffe_cpu -itd -v /home/jxl:/home/jxl bvlc/caffe:cpu /bin/bash

进入容器

docker exec -it caffe_cpu /bin/bash

进入容器之后,我们不要急着操作下一步,而是首先要搞清楚状况,

caffe的文件位于/opt/caffe下面,文件夹目录如下所示在这里插入图片描述
caffe的运行目录,输入下面命令

root@af17e8160533:/opt/caffe# env | grep caffe
PATH=/opt/caffe/build/tools:/opt/caffe/python:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/opt/caffe
PYCAFFE_ROOT=/opt/caffe/python
PYTHONPATH=/opt/caffe/python:
CAFFE_ROOT=/opt/caffe

我们发现caffe在build目录下,因为原版是通过cmake来编译的,知道这点很重要,因为我们之后不在build目录编译了,所以这个PATH的第一项必须要修改

4. 修改caffe代码

这点和网上的教程是基本一样的,但是由于我们编译的是CPU版本,所以相关的cuda文件(以cu为结尾的文件)不需要添加
将 darknet2caffe/caffe_layers/mish_layer 下的 mish_layer.hpp 文件和darknet2caffe/caffe_layers/upsample_layer 下的 upsample_layer.hpp 拷贝到容器的路径:/opt/caffe/include/caffe/layers 下。

将 darknet2caffe/caffe_layers/mish_layer 下的 mish_layer.cpp 文件和 darknet2caffe/caffe_layers/upsample_layer 下的 upsample_layer.cpp 拷贝到容器的路径:/opt/caffe/src/caffe/layers/ 下。

将 darknet2caffe/caffe_layers/pooling_layer 下的 pooling_layer.cpp 拷贝到容器的路径:/opt/caffe/src/caffe/layers/ 下。

然后,打开容器内的 caffe 文件:/opt/caffe/src/caffe/proto/caffe.proto。按照如下说明修改相应字段的程序。

注意: 对于YOLOv4,需要把注释中YOLOv3以及YOLOv4部分的代码全部加上,YOLOv3只需要加上YOLOv3部分,目标位置在407行

// LayerParameter next available layer-specific ID: 147 (last added: recurrent_param)
message LayerParameter {
  optional TileParameter tile_param = 138;
  optional VideoDataParameter video_data_param = 207;
  optional WindowDataParameter window_data_param = 129;
  // 第407行
++optional UpsampleParameter upsample_param = 149; //added by chen for Yolov3, make sure this id 149 not the same as before.
++optional MishParameter mish_param = 150; //added by chen for yolov4,make sure this id 150 not the same as before.
}

// added by chen for YoloV3
++message UpsampleParameter{
++  optional int32 scale = 1 [default = 1];
++}

// Message that stores parameters used by MishLayer
++message MishParameter {
++  enum Engine {
++    DEFAULT = 0;
++    CAFFE = 1;
++    CUDNN = 2;
++  }
++  optional Engine engine = 2 [default = DEFAULT];
++}

添加后如图所示
在这里插入图片描述

5. 重新编译caffe并修改caffe的路径

这里比较关键,必须要在caffe的目录下面操作,而不是caffe/build文件夹

依次执行下面的命令

cd /opt/caffe
cmake ./CMakeLists.txt
make clean
make -j32

在这里插入图片描述

修改caffe的PATH路径

这里很关键,由于我们刚刚在caffe根路径下面编译caffe运行路径变成了:

/opt/caffe/tools

而不是我们一开始所说的

/opt/caffe/build/tools

所以最后我们需要把正确的路径添加到PATH

export PATH=/opt/caffe/tools:$PATH

至此caffe编译完成了

6. 转换模型文件至caffemodel

我们提前把darknet的模型放在darknet2caffe目录下面的一个文件夹里面,如下图所示
请添加图片描述

cd $darknet2caffe
# 安装pytorch,future
pip install torch
pip install future

运行转换命令,指定相应的cfg文件,weights文件,已经caffe配置文件prototxt以及caffemodel输出路径
在这里插入图片描述

转换过程
在这里插入图片描述

如果你看到这里,太好了!恭喜你完成了!下面看看我们的成果吧! 输出了prototxt文件以及caffemodel文件
在这里插入图片描述
ALL DONE

7. 利用华为的ATC工具去把模型转成om格式

以3.2.0版本为例,首先要配置ATC工具的环境变量

atc工具环境变量配置
export PATH=/usr/local/Ascend/ascend-toolkit/20.2.rc1/atc/ccec_compiler/bin:/usr/local/Ascend/ascend-toolkit/20.2.rc1/atc/bin:$PATH
/usr/local/Ascend/ascend-toolkit/20.2.rc1/atc
export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/20.2.rc1/arm64-linux/opp
export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/20.2.rc1/

配置Pyacl的环境变量,用于推理,模型转成并没有用到

export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/20.2.rc1/arm64-linux/pyACL/python/site-packages/acl:$PYTHONPATH
export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/20.2.rc1/arm64-linux/acllib/lib64:$LD_LIBRARY_PATH

准备好caffemodel
在这里插入图片描述
执行下面命令进行转换
在这里插入图片描述
转换完成后ouput目录下面就会输出om模型

到这里本教程就结束了,整理不易,如果有用,记得留言点赞哦~!

发表评论:

Copyright Your WebSite.Some Rights Reserved.