1. 前言
最近在做Hi3559A的相关项目,其中需要使用yolov3模型,然而网上基本找不到现成的caffe-yolov3模型,只能够自行转换。另外网上有一些相关的博客,但是其中存在一些问题,特此记录。
本文环境所配环境: ubun16.0.4+cuda8.0+cudnn6.0+opencv3.4.3+torch0.40+python3.5
ps:opencv必须用源码编译,不能pip install opencv-python; ps:
最好退出anaconda环境,连base都退出,笔者在编译caffe时报错,退出conda deactivate恰好解决了问题; ps:
pytorch库是因为后续需要一个脚本其进行darknet-caffe的转换。
2.配置过程
2.1 caffe安装
先从git://github.com/BVLC/caffe下载caffe的1.0版本,或直接命令行获取 git clone
git://github.com/BVLC/caffe.git(需要安装git)
而后cd caffe
复制Makefile.config:cp Makefile.config.example Makefile.config
修改Makefile.config,注意以下几点 a、USE_CUDNN := 1 b、WITH_PYTHON_LAYER := 1
c、删除CUDA_ARCH的两个值 :-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21 \ d、增加HDF5文件引用路径,如下图红体字所示 INCLUDE_DIRS :=( P Y T H O N I N C L U D E ) / u s r / l o c a l / i n c l u d e / u s r / i n c l u d e / h d f 5 / s e r i a l L I B A B R Y D I R S : = (PYTHON_INCLUDE)/usr/local/include /usr/include/hdf5/serial LIBABRY_DIRS :=(PYTHON
I
NCLUDE)/usr/local/include/usr/include/hdf5/serialLIBABRY
D
IRS:=(PYTHON_LIB) /usr/local/lib
/usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
e、改为python3(原配置文件中默认使用python2.7) # Uncomment to use Python 3
(default is Python 2) PYTHON_LIBRARIES := boost_python3 python3.5m
PYTHON_INCLUDE := /usr/include/python3.5m
/usr/lib/python3.5/dist-packages/numpy/core/include
编译caffe: make all -j8
ps:在这个环节会出现很多的错误提示,一般都是由于缺少相应的库造成的,这个时候一般百度错误都可以找到相关的pip下载指令,如有解决不了的可以留言,我会尽力帮助。
编译py-caffe: make pycaffe -j8
ps:在这个环节或许会出现找不到python.h的问题,一般是由于软连接问题,以下博客可以解决: cd
/usr/lib/x86_64-linux-gnu sudo ln -s libboost_python-py35.so
libboost_python3.so
添加caffe系统环境变量 vi ~/.bashrc export
PYTHONPATH=/xx/xx/caffe/python:$PYTHONPATH(就是你编译caffe的那个文件夹)
source ~/.bashrc
验证安装: make runtest 笔者这一步顺利通过,据说只有几个错一般问题不大,如有问题请留言; import
caffe 可能会找不到相应的python库的问题,利用pip安装;
2.2 caffe升级支持yolov3
caffe官方不支持upsample,需要自行添加相关代码以使其支持yolov3的上采样层,附上网上的一份代码:
https://pan.baidu.com/s/13GpoYoqKSCeFX0m0ves_fQ#list/path=%2F 密码:bwrd
将其中的upsample_layer.hpp移动至include/caffe/layers;
upsample_layer.cpp与upsample_layer.cu移动至src/caffe/layers;
修改相应的caffe.proto文件,src/caffe/proto/caffe.proto中的LayerParameter的最后一行加入:
message LayerParameter { … optional UpsampleParameter
upsample_param = 149; }
ps:这里的ID号是谷歌protobuf的格式要求,随便给一个之前无重复的数字即可,149一般是可以的。
然后在caffe.proto中添加upsample层的参数: message UpsampleParameter{ optional
int32 scale = 1 [default = 1]; } 而后重新编译make clean make all -j8
make pycaffe -j8 至此,caffe编译完成。 ps:函数名称不要敲错了
3.yolov3 caffe转换
这里需要一个脚本,参考:https://github.com/ChenYingpeng/darknet2caffe
下载完成之后,将相应的yolov3.cfg
以及yolov3.weights放入文件夹中,另外修改darknet2caffe.py中前两行的caffe_root为自己的caffe目录,笔者为
/home/passwd123/caffe-master
而后运行脚本: python darknet2caffe.py cfg/yolov3.cfg
weights/yolov3.weights prototxt/yolov3.prototxt
caffemodel/yolov3.caffemodel
若无误则结果应为:
ps:其中的prototxt以及caffemodel是生成的
ps:这一步会出现不少的问题,可能是由于源代码的python版本问题,主要有以下几点:
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())
4.注意创建文件夹caffemodel,不然输出时会找不到路径,或者修改脚本命令中caffemodel/yolov3.caffemodel为yolov3.caffemodel
至此,yolov3-caffe转换完成。 第一次写博客,还望海涵,如有问题请留言。
3.1 资料补录
应网友要求将我实验成功的脚本打包,已上传至百度云:
链接:https://pan.baidu.com/s/1eClYuGAIiTfdjcptqqZ65w
提取码:uzip
运行这个脚本的前提是你装好了caffe(是指添加了upsample层等源码之后重新编译过后的caffe),请先测试caffe是否安装成功,再进行之后的模型转换。
经个人总结,出现错误的原因可能是权重和cfg文件不匹配、对应的算子不支持、或者是darknet的weights文件不完整(ctrl+c之后自动保存的weights文件一般都是不完整的,请使用满1000iteration自动保存的权重文件)。
“本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/ll15982534415/article/details/106677227。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。”
本次更新:2020/7/21
4.参考链接:
https://blog.csdn.net/ll15982534415/article/details/107330909