发布于2023-01-07 22:13 阅读(1141) 评论(0) 点赞(12) 收藏(3)
在美团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
,对图像检测的三类任务(分类、前后背景分类、边框)预测,输出最后的结果。
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层通过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中各个模块中的详细的原理以及代码继续更新,希望对大家有帮助。
参考:
[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)
原文链接:https://blog.csdn.net/zqwwwm/article/details/125901507
作者:你说php不行了
链接:http://www.phpheidong.com/blog/article/472455/197844b2b2aefcf99c41/
来源:php黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 php黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-4
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!