系列文章目录
海思Hi3519AV100深度学习方案(一)darknet转caffmodel之caffe安装(基于Ubuntu16.04+python3.5+opencv3.4.0+cuda10.0)
前言
通过上一篇文章已经完成了模型转换的重要环境caffe的安装配置,本篇主要介绍训练好的darknet yolov3模型转换成海思支持的caffe模型
提示:以下是本篇文章正文内容,下面案例可供参考
一、准备upsample层
因为官方caffe框架不支持yolo3的upsample层,所以需要手动增加upsample层
1.1 下载upsample 层相关的代码 ,网上提供的路径,感谢作者: https://pan.baidu.com/s/13GpoYoqKSCeFX0m0ves_fQ#list/path=%2F。密码:bwrd
1.2 应用下载的源码到caffe框架里面,有四个文件:
upsample_layer.hpp、upsample_layer.cu、upsample_layer.cpp 、 caffe.proto
a) 放入caffe相关的路径里
将upsample_layer.hpp 拷贝到/caffe/include/caffe/layers
将upsample_layer.cu和upsample_layer.cpp 拷贝到/caffe/src/caffe/layers
将 caffe.proto拷贝到/caffe/src/caffe/proto
b) 修改caffe.proto文件
在caffe.proto文件 查找message LayerParameter
message LayerParameter {
………….
optional UpsampleParameter upsample_param = 149;#最后一行添加
}
赋值的149层数跟上面指定的层数不冲突。
c)在caffe.proto文件文件最后添加Upsample层的参数
message UpsampleParameter{
optional int32 scale = 1 [default = 1];
}
d)完成后需要重新编译caffe
1) sudo make clean
2) sudo make all -j4
3) sudo make pycaffe -j4
python
import caffe
二、转换yolo3 darknet模型成caffemodel
1)下载工具 工程caffe-yolov3 https://github.com/ChenYingpeng/caffe-yolov3
得到文件 caffe-yolov3-master.tar.gz
在工作路径下 打开终端解压
tar -xvf caffe-yolov3-master.tar.gz
2)下载转换程序darknet2caffe link(https://github.com/ChenYingpeng/darknet2caffe)
得到 darknet2caffe-master.zip 解压后将文件夹拷贝到 caffe-yolov3-master路径下
然后cd 到darknet2caffe-master路径下执行命令进行转换:
python darknet2caffe.py yolov3xxx.cfg yolov3xxx.weights xxx.prototxt xxx.caffemodel
注意
根据自己的caffe安装路径修改caffe_root值。
gedit yolov3-darknet2caffe.py
caffe_root='/home/mina522/caffe/'
至此,就可以产生caffe模型以及对应prototxt。
参考原文链接:https://blog.csdn.net/avideointerfaces/article/details/89111955
三、关于python3源码修改
在转换过程中由于 darknet2caffe.py是用python2写的代码,如果用python3环境,有几处要修改为python3的语法:
1.has_key()函数已抛弃,应该换为 x in y
例如:
if block.has_key(‘name’)
换为
if ‘name’ in block:
#里面有很多 查找并替换所有;
2.print改为加括号(原版代码中print有加括号也有没加括号的,实在是不合理······)
print(‘try:’) ##类似这样的
print (’%s %s: %s’ % (blanks, key,format_value(v)),file=fp)#关于文件写入的有好几处,都要注意修改;
3.修改一处代码错误,源码会使最终生成的prototxt中pad出现小数
convolution_param[‘pad’] = str(int(int(convolution_param[‘kernel_size’])/2))#(源代码少了int())
convolution_param[‘pad’] = str(int(convolution_param[‘kernel_size’])//2)# 或者修改为
4 在转换过程中提示缺少torch模块
在python3下安装指令:
pip3 install http://download.pytorch.org/whl/cu80/torch-0.1.11.post5-cp35-cp35m-linux_x86_64.whl
pip3 install torchvision