yolov4网络结构(yolov7 网络架构深度解析)
在美团yolov6刚出来不到一个月 ,yolov4的官方人马yolov7带着论文和代码高调现身 ,迅速霸屏 ,膜拜下速度和精度:
四个字“多快好省 ” ,yolov7依旧基于anchor based的方法 ,同时在网络架构上增加E-ELAN层 ,并将REP层也加入进来 ,方便后续部署 ,同时在训练时 ,在head时 ,新增Aux_detect用于辅助检测 ,个人理解是对预测结果的一种初筛 ,有种two-stage的感觉(欢迎打脸) 。网上基于yolov7的解读有很多,文末会附上yolov7的ariv论文连接和开源代码的github链接 。本文先和大家分享下整个yolov7的网络架构(基于tag0.1版本的yolov7L) ,后续再基于各个模块根据自己的理解分享给大家 。
整体框架
如果大家需文中ppt使用 ,请点击下方链接,关注公众号 ,后台添加微信 ,领取 ,备注“ppt ” 。 yolov7网络架构深度解析
以上为yolov7整体的网络架构 ,从图中可看出yolov7网络由三个部分组成:input ,backbone和head ,与yolov5不同的是 ,将neck层与head层合称为head层 ,实际上的功能的一样的 。对各个部分的功能和yolov5相同 ,如backbone用于提取特征 ,head用于预测 。
根据上图的架构图走一遍网络流程:先对输入的图片预处理 ,对齐成640*640大小的RGB图片 ,输入到backbone网络中,根据backbone网络中的三层输出 ,在head层通过backbone网络继续输出三层不同size大小的feature map(以下简称fm) ,经过RepVGG block 和conv,对图像检测的三类任务(分类 、前后背景分类 、边框)预测 ,输出最后的结果 。
backbone
yolov7的backbone层如上图所示 ,由若干BConv层 、E-ELAN层以及MPConv层组成 ,其中BConv层由卷积层+BN层+激活函数组成 ,在tag0.1版本中的激活函数为ReakyReLu 。
不同颜色的Bconv表示卷积的kernel不同(以下k表示kernel长宽大小 ,s表示stride, o为outchannel, i为inchannel, 其中o=i表示outchannel=inchannel, o≠i表示outchannel与inchannel无相关性 ,并非其值一定不相等) ,第一个为(k=1,s=1)的点卷积核的卷积 ,输入输出的长宽不变 ,第二个为(k=3,s=1)卷积核的卷积 ,输出输出的长宽也不变 ,第三个是s=2,输出的长宽为输入的一半 。上述不同颜色的Bconv主要为了区分k和s ,不区分输入输出通道 。E-ELAN层也是由不同的卷积拼接而成,如下图所示:
整个E-ELAN层输入输出的长宽不变 ,channel上o=2i, 其中2i是由4个conv层输出channel为i/2的输出concate拼接而成 。
MPConv层(名字自取的 ,如果有实际确定的命名,欢迎私聊我改正)流程如上图 ,输入输出通道相同 ,输出长宽为输入长宽的一半 ,上分支通过maxpooling使长宽减半 ,通过BConv对通道减半 ,下分支则通过第一个BConv对通道减半 ,第二的k=3 ,s=2的Bconv对长宽减半 ,而后上下分支cat合并 ,得到长宽减半 ,o=i的输出 。综述整个backbone层由若干BConv层 、E-ELAN层以及MPConv层交替减半长宽 ,增倍通道 ,提取特征。
head
如上图所示,整个head层通过SPPCPC层 、若干BConv层 、若干MPConv层 、若干Catconv层以及后续输出三个head的RepVGG block层组成 。
其中SPPCPC层如下图:整个SPPCSPC层的输出层channel为out_channel ,计算中会计算出一个hidden_channel = int(2eout_channel) ,用于对hidden_channel(以下统称hc)拓展,一般取e=0.5 ,则hc=out_channel 。具体的流程如下图:
Catconv层(名字自取的 ,如果有实际确定的命名 ,欢迎私聊我改正)与E-ELAN层的操作基本相同:
整个Catconv层输入输出的长宽不变 ,channel上o=2i, 其中2i是由6个conv层输出channel为i/2的输出concate拼接而成。REP层即repvgg_block层 ,为今年超级火的一个部署友好的网络层 ,yolov6中也有用到:
REP在训练和部署的时候结构不同 ,在训练的时候由33的卷积添加11的卷积分支 ,同时如果输入和输出的channel以及h,w的size一致时 ,再添加一个BN的分支 ,三个分支相加输出 ,在部署时 ,为了方便部署,会将分支的参数重参数化到主分支上 ,取3*3的主分支卷积输出 。整个head层的流程为 ,如上图所示输出三个feature map后,分别通过三个REP和conv层输出三个不同size大小的未经处理的预测结果 。
以上为个人理解 ,再看其他的yolov7网络架构 ,会有DownC和ReOrg两个yolov7L中未出现的层 ,其中DownC层与MPConv层异曲同工:
ReOrg层与yolov5前期的focus层的切片原理相同 。如有理解偏差 ,欢迎交流 ,后续根据yolov7中各个模块中的详细的原理以及代码继续更新 ,希望对大家有帮助 。【yolov7系列】网络框架细节拆解
参考:
[1] https://github.com/WongKinYiu/yolov7(官方github代码)
[2] https://arxiv.org/pdf/2207.02696.pdf(yolov7论文)
[3]https://www.zhihu.com/question/541985721
[4]YOLOv7官方开源 | Alexey Bochkovskiy站台 ,精度速度超越所有YOLO ,还得是AB (qq.com)
[5] YOLOv7来临:论文详读和解析 (qq.com)
[6]【yolov6系列】细节拆解网络框架 (qq.com)创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!