darknet转caffe

背景

最近在做华为atlas平台AI项目,atlas平台只支持tensorflow和caffe模型,而自己训练的是yolov3/yolov4/yolov5的darknet模型,需要先转换到pb或者caffemodel格式。

====================================================================
在网上查过一些模型转换方式,一种是先转ONNX模型,再转tensorflow/caffe模型,这当中踩过不少坑,大家可以参考这个github工程;本人之前通过这个github工程转pb文件成功过,但是最后从pb文件转到atlas支持的om文件时,报有些层不支持的错误,具体可以参见这篇帖子.

后来又采取另外一种方式(推荐这种,简单、适应性强),就是要讲的darknet直接转caffe。我用的是这个github工程,非常好用,它里面的models/darknet_yolov3/darknet_yolov3/darknet2caffe.py的脚本是python2.7写的,配置非常简单,必须要有toch和caffe环境,用python2.7最简单,python3.X有些语句不支持,不过修改一下就好了,我在python3.6和python2.7下都跑通过,坑比较少,只是这个只能转yolov3系列的,yolov4的mish激活函数不支持,你可以将mish改成leaky relu。转换精度本人测试过yolov3,tiny_yolov3,yolov3.pelee.spp.panet等网络,精度几乎没有下降。
models/darknet_yolov3/darknet_yolov3/darknet2caffe.py转换模型时碰到的问题:
1.yolov3.pelee.spp.panet的route层有三个,在darknet2caffe.py的307行添加一个if分支,否则会报错:

if (bottom_layer_dim == 3):
    layer_name = [layer_id + int(idx) if int(idx) < 0 else int(idx) + 1 for idx in layer_name ]
    prev_layer_id1 = int(layer_name[0])
    prev_layer_id2 = int(layer_name[1])
    prev_layer_id3 = int(layer_name[2])
    bottom1 = topnames[prev_layer_id1]
    bottom2 = topnames[prev_layer_id2]
    bottom3 = topnames[prev_layer_id3]
    route_layer['bottom'] = [bottom1, bottom2, bottom3]

2.在转换leaky loss版本的yolov4时,route层有时为单个正数,将296行的prev_layer_id = layer_id + int(block[‘layers’])替换成下面的代码,否则会报错:

layer_name = [layer_id + int(idx) if int(idx) < 0 else int(idx) + 1 for idx in layer_name ]
prev_layer_id = int(layer_name[0])

后来在网上找到了支持yolov4的mish层工程https://github.com/zhangsong8/darknet2caffe,写的也是非常不错,将mish.h、mish.cpp、mish.cu拷贝到对应目录下重新编译caffe工程就好了,so easy。

希望此博客能帮到转模型遇坑的你。

====================================================================

下面贴出配置环境用到的一些命令:

python demo_darknet2onnx.py ./model/yolov4.cfg ./model/yolov4.weights ./model/000150.jpg 1
python convertCaffe.py ./model/yolov4_1_3_608_608_static0.onnx ./model/zhang.prototxt ./model/zhang.caffemodel
python convertCaffe.py ./yolov4_1_3_608_608_static.onnx ./zhang.prototxt ./zhang.caffemode
pip install scikit-image
conda create  --name pytorch1.3.1 python=3.6
pip install torch==1.4.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install torchvision==0.4.2 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install onnx==1.6.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install onnxruntime-gpu==1.0.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install tensorflow-gpu==1.15.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install onnx-tf==1.5.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install matplotlib -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install tqdm -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install scikit-image -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install protobuf -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip install numpy -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com


python darknet2caffe.py ../../yolov3.cfg ../../yolov3.weights zhang.prototxt zhang.caffemodel

export PYTHONPATH=/root/zhangsong/huawei/trainning/caffe/MobileNet-YOLO-master/python:$PYTHONPATH
export PYTHONPATH=/root/zhangsong/huawei/trainning/caffe/MobileNet-YOLO-master/python/caffe:$PYTHONPATH

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