上网搜过很多转换教程,但是很多都少了一些步骤,这里的话自己整理一份教程,本人实测可以转换成功,如果大家觉得有用,关注点赞加收藏也是一种美德哦.
如下图所示这里只需要darknet版本的cfg文件以及weights文件即可,data和names文件可以不用
克隆模型转换代码
git clone https://github.com/ChenYingpeng/darknet2caffe.git
网上有很多版本的教程都是要使用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的第一项必须要修改
这点和网上的教程是基本一样的,但是由于我们编译的是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];
++}
这里比较关键,必须要在caffe的目录下面操作,而不是caffe/build文件夹
依次执行下面的命令
cd /opt/caffe
cmake ./CMakeLists.txt
make clean
make -j32
这里很关键,由于我们刚刚在caffe根路径下面编译caffe运行路径变成了:
/opt/caffe/tools
而不是我们一开始所说的
/opt/caffe/build/tools
所以最后我们需要把正确的路径添加到PATH
export PATH=/opt/caffe/tools:$PATH
至此caffe编译完成了
我们提前把darknet的模型放在darknet2caffe目录下面的一个文件夹里面,如下图所示
cd $darknet2caffe
# 安装pytorch,future
pip install torch
pip install future
运行转换命令,指定相应的cfg文件,weights文件,已经caffe配置文件prototxt以及caffemodel输出路径
如果你看到这里,太好了!恭喜你完成了!下面看看我们的成果吧! 输出了prototxt文件以及caffemodel文件
ALL DONE
以下是传送门:
YOLOv4 caffemodel转om在Atlas服务器上面推理
本期的教程就到这里啦,谢谢大家的关注哦