【项目--Hi3559A】(caffe-yolov3)yolov3的darknet模型转caffe模型详细教程

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 := (PYTHONINCLUDE)/usr/local/include/usr/include/hdf5/serialLIBABRYDIRS:=(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

  • 若无误则结果应为:

【项目--Hi3559A】(caffe-yolov3)yolov3的darknet模型转caffe模型详细教程_第1张图片
ps:其中的prototxt以及caffemodel是生成的
在这里插入图片描述【项目--Hi3559A】(caffe-yolov3)yolov3的darknet模型转caffe模型详细教程_第2张图片

  • 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

你可能感兴趣的:(深度学习,caffe,神经网络,github,python)