一步一步教你如何将 yolov3/yolov4 转为 caffe 模型

简介: 一步一步教你如何将 yolov3/yolov4 转为 caffe 模型

实际工作中,目标检测 yolov3 或者 yolov4 模型移植到 AI 芯片中,经常需要将其先转换为 caffe1.x 模型,大家可能或多或少也有这方面的需求。例如华为海思 NNIE 只支持caffe1.x 模型,所以 yolov3/yolov4 模型要想在海思芯片上部署,转换为 caffe1.x 模型是必须的。


今天,专门给大家写一下将  yolov3/yolov4 模型转为 caffe 模型的详细步骤。


0. 系统环境


  • Ubuntu 16.04
  • cuda 9.x


1. 部署 caffe 环境


常规的方法是下载 caffe 的源码,进行编译安装。但是,这种方法比较复杂,不太容易成功。更简单的方法是直接下载 caffe1.x 的docker 镜像。这种方法需要你提前在 Ubuntu 里安装了 nvidia-docker。


打开 docker hub 网站:

https://registry.hub.docker.com/


搜索 caffe,看到这个镜像:


image.png

点击进去,看到该镜像的下拉命令:


sudo docker pull bvlc/caffe

打开 Ubuntu 终端,输入上面的下拉命令,将 caffe 的 docker 镜像下载下来。


image.png

下载完成之后,终端输入命令:


sudo docker images

就可以看到已下载的 caffe 镜像了。


image.png

为镜像创建容器:


docker run --runtime=nvidia --name caffe -i -t bvlc/caffe /bin/bash

这里我们给该容器起的名字是 caffe,大家可以自由设置,根据 `sudo docker ps -a` 这条命令来查看各个容器。


这样,我们就进入了 caffe1.x 的 docker 容器之内了。


该容器已部署好了 caffe1.x,caffe1.x 路径为:


image.png

2. caffe 源码修改


因为官方 caffe1.x 框架不支持 yolo3/yolov4 的 upsample 层,所以需要手动增加 upsample 层,对 caffe 源码进行修改。


克隆 GitHub 上的转换工具项目:

git clone https://github.com/ChenYingpeng/darknet2caffe.git

image.png


darknet2caffe/caffe_layers/mish_layer 下的 mish_layer.hpp 文件和 darknet2caffe/tree/master/caffe_layers/upsample_layer 下的 upsample_layer.hpp  拷贝容器的路径/opt/caffe/include/caffe/layers  


darknet2caffe/caffe_layers/mish_layer 下的 mish_layer.cpp、mish_layer.cu 文件和 darknet2caffe/tree/master/caffe_layers/upsample_layer 下的 upsample_layer.cpp、upsample_layer.cu  拷贝容器的路径/opt/caffe/src/caffe/layers/  


darknet2caffe/caffe_layers/pooling_layer 下的 pooling_layer.cpp 拷贝容器的路径/opt/caffe/src/caffe/layers/  


然后,打开容器内的 caffe 文件:/opt/caffe/src/caffe/proto/caffe.proto。按照如下说明修改相应字段的程序。

// LayerParameter next available layer-specific ID: 147 (last added: recurrent_param)
message LayerParameter {
  optional TileParameter tile_param = 138;
  optional VideoDataParameter video_data_param = 207;
  optional WindowDataParameter window_data_param = 129;
++optional UpsampleParameter upsample_param = 149; //added by chen for Yolov3, make sure this id 149 not the same as before.
++optional MishParameter mish_param = 150; //added by chen for yolov4,make sure this id 150 not the same as before.
}
// added by chen for YoloV3
++message UpsampleParameter{
++  optional int32 scale = 1 [default = 1];
++}
// Message that stores parameters used by MishLayer
++message MishParameter {
++  enum Engine {
++    DEFAULT = 0;
++    CAFFE = 1;
++    CUDNN = 2;
++  }
++  optional Engine engine = 2 [default = DEFAULT];
++}


其中,++ 表示该行是增加的内容。


3. caffe 重新编译


修改完 caffe 的一些源码之后,需要对 caffe 重新编译。


进入 /opt/caffe/build 目录,输入以下命令:

make clean
make all -j8
make pycaffe -j8


caffe 重新编译之后,就可以对 yolov3/yolov4 模型进行 caffe 转换了。


4. 模型转换


准备好我们已有的 yolov3 模型的配置文件和权重文件,例如:yolov3.cfg 和 yolov3.weights。在 darknet2caffe 目录下,输入以下命令:

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

如果输出类似下面的语句,则证明转换成功!


I0522 10:19:19.015708 25251 net.cpp:228] layer1-act does not need backward computation.
I0522 10:19:19.015712 25251 net.cpp:228] layer1-scale does not need backward computation.
I0522 10:19:19.015714 25251 net.cpp:228] layer1-bn does not need backward computation.
I0522 10:19:19.015718 25251 net.cpp:228] layer1-conv does not need backward computation.
I0522 10:19:19.015722 25251 net.cpp:228] input does not need backward computation.
I0522 10:19:19.015725 25251 net.cpp:270] This network produces output layer139-conv
I0522 10:19:19.015731 25251 net.cpp:270] This network produces output layer150-conv
I0522 10:19:19.015736 25251 net.cpp:270] This network produces output layer161-conv
I0522 10:19:19.015911 25251 net.cpp:283] Network initialization done.
unknow layer type yolo 
unknow layer type yolo 
save prototxt to ./yolov3.prototxt
save caffemodel to ./yolov3.caffemodel


其中,yolov3.prototxt 和 yolov3.caffemodel 为转换后的 caffe 模型。


至此,yolov3/yolov4 转换为 caffe 模型完成!


相关文章
|
数据安全/隐私保护 Windows
svn篇1:svn下载安装
svn篇1:svn下载安装
632 0
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
|
缓存 NoSQL 数据库
高性能Web服务器架构设计
【8月更文第28天】在当今互联网时代,网站的响应速度直接影响用户体验和业务成功率。因此,构建一个高性能的Web服务器架构至关重要。本文将从硬件配置、软件架构以及网络设置三个方面探讨如何提高Web服务器的性能,并提供一些实际的代码示例。
623 0
|
算法框架/工具 开发工具 git
【项目--Hi3559A】(caffe-yolov3)yolov3的darknet模型转caffe模型详细教程
【项目--Hi3559A】(caffe-yolov3)yolov3的darknet模型转caffe模型详细教程
249 1
【项目--Hi3559A】(caffe-yolov3)yolov3的darknet模型转caffe模型详细教程
|
11月前
|
存储 项目管理 数据库
6款适合团队使用的在线协作文档工具:功能、费用与特色对比
在数字化工作环境中,选择合适的在线协作文档工具对团队生产力至关重要。本文介绍了六款备受好评的工具:板栗看板、Google Docs、Microsoft OneNote、Notion、Dropbox Paper 和 Quip。从功能、费用到特色,全面对比分析,帮助企业管理者找到最适合团队需求的解决方案。
891 6
|
并行计算 Ubuntu PyTorch
Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10(上)
Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10
608 0
|
监控 Java 程序员
Java中的垃圾回收机制:原理与优化实践
在Java编程语言中,垃圾回收(Garbage Collection, GC)是内存管理的关键组成部分。本文章深入探讨了Java垃圾回收的工作原理、常见的垃圾回收器类型及其特点,以及如何监控和优化垃圾回收性能。通过引用最新的研究成果和官方文档,本文旨在为Java开发者提供一套系统的垃圾回收知识体系,帮助他们更好地理解和掌握这一核心技术。
|
存储 边缘计算 安全
阿里云全球基础设施展示,公共云地域、边缘节点、超级数据中心分布图
本文为大家介绍了阿里云在2024年的全球基础设施布局,包括公共云地域、边缘节点、超级数据中心等各个阶段和方面。阿里云基础设施已覆盖全球四大洲,拥有30个公共云地域和89个可用区,以及超过3200个边缘节点,为其用户提供了广泛且深入的服务覆盖。
阿里云全球基础设施展示,公共云地域、边缘节点、超级数据中心分布图
windows下更改pip版本
在CMD中运行`pip -V`检查pip与Python的关联版本。通过系统设置>环境变量>Path,修改包含Python和Scripts目录的路径为实际安装路径。完成后,验证`pip -V`显示的Python版本已更新。