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

简介: 【项目--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 :=(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


若无误则结果应为:

20200611073909689.png


ps:其中的prototxt以及caffemodel是生成的

20200611074022365.png


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
相关文章
|
PyTorch 开发工具 算法框架/工具
yolo系列的ONNX部署(C++)【适用于v4\v5\v5-6.1\v7】
yolo系列的ONNX部署(C++)【适用于v4\v5\v5-6.1\v7】
1236 0
yolo系列的ONNX部署(C++)【适用于v4\v5\v5-6.1\v7】
|
10月前
|
人工智能 自动驾驶 安全
YOLO v8!| 附教程+代码 以及 vs YOLOv6 v3.0
YOLO v8!| 附教程+代码 以及 vs YOLOv6 v3.0
|
PyTorch Go 算法框架/工具
YOLOv8来啦 | 详细解读YOLOv8的改进模块!YOLOv5官方出品YOLOv8,必卷!
YOLOv8来啦 | 详细解读YOLOv8的改进模块!YOLOv5官方出品YOLOv8,必卷!
1815 0
|
编解码 Go 数据库
你的YOLO V4该换了 | YOLO V4原班人马改进Scaled YOLO V4,已开源(附论文+源码)
你的YOLO V4该换了 | YOLO V4原班人马改进Scaled YOLO V4,已开源(附论文+源码)
222 0
|
计算机视觉
【YOLOV5-6.x讲解】YOLO5.0VS6.0版本对比+模型设计
【YOLOV5-6.x讲解】YOLO5.0VS6.0版本对比+模型设计
810 0
【YOLOV5-6.x讲解】YOLO5.0VS6.0版本对比+模型设计
|
Ubuntu TensorFlow 算法框架/工具
ResNet实战:tensorflow2.X版本,ResNet50图像分类任务(小数据集)
本例提取了植物幼苗数据集中的部分数据做数据集,数据集共有12种类别,今天我和大家一起实现tensorflow2.X版本图像分类任务,分类的模型使用ResNet50。 通过这篇文章你可以学到: 1、如何加载图片数据,并处理数据。 2、如果将标签转为onehot编码 3、如何使用数据增强。 4、如何使用mixup。 5、如何切分数据集。 6、如何加载预训练模型。
1342 0
ResNet实战:tensorflow2.X版本,ResNet50图像分类任务(小数据集)
|
TensorFlow 算法框架/工具 计算机视觉
ResNet实战:tensorflow2.0以上版本,使用ResNet50实现图像分类任务
ResNet实战:tensorflow2.0以上版本,使用ResNet50实现图像分类任务
756 0
|
PyTorch 算法框架/工具
使用transformer的YOLOv7及TensorRT部署
使用transformer的YOLOv7及TensorRT部署
使用transformer的YOLOv7及TensorRT部署
|
Ubuntu TensorFlow 算法框架/工具
MobileNet实战:tensorflow2.X版本,MobileNetV2图像分类任务(小数据集)
本例提取了植物幼苗数据集中的部分数据做数据集,数据集共有12种类别,今天我和大家一起实现tensorflow2.X版本图像分类任务,分类的模型使用MobileNetV2,MobileNetV2在MobileNetV1的基础上增加了线性瓶颈(Linear Bottleneck)和倒残差(Inverted Residual)是一种轻量级的网络,适合应用在真实的移动端应用场景。
276 0
MobileNet实战:tensorflow2.X版本,MobileNetV2图像分类任务(小数据集)
|
人工智能 算法 Ubuntu
MobileNet实战:tensorflow2.X版本,MobileNetV2图像分类任务(大数据集)
本例提取了植物幼苗数据集中的部分数据做数据集,数据集共有12种类别,今天我和大家一起实现tensorflow2.X版本图像分类任务,分类的模型使用MobileNetV2。本文实现的算法有一下几个特点: 1、自定义了图片加载方式,更加灵活高效,不用将图片一次性加载到内存中,节省内存,适合大规模数据集。 2、加载模型的预训练权重,训练时间更短。 3、数据增强选用albumentations。
167 0
MobileNet实战:tensorflow2.X版本,MobileNetV2图像分类任务(大数据集)