yolov5网络模型结构图(【yolov6系列一】深度解析网络架构)
在yolov5霸屏计算机视觉领域很久时 ,六月处美团开源了yolov6 ,并号称在精度和速度上均超越其他同量级的计算机视觉模型 ,刚刚瞅了一眼 ,star已经超过2.8k,脑子里莫名冒出一个词:“国货之光 ” 。
网上基于yolov6的解读有很多 ,文末会附上美团的官方解读和开源代码的github链接 。文本开始yolov6系列 ,先和大家分享下整个yolov6的网络架构(基于tag0.1版本的yolov6s) ,后续再基于各个模块根据自己的理解分享给大家 。
整体框架
大家如需图中ppt使用 ,请关注公众号 ,后台回复ppt 添加微信领取
以上为yolov6s整体的网络架构 ,从图中可看出yolov6网络由四个部分组成:input ,backbone ,neck以及head 。对各个部分的功能和yolov5相同,如backbone用于提取特征 ,head用于预测 。
根据上图的架构图走一遍网络流程:先对输入的图片预处理 ,对齐成640*640大小的RGB图片,输入到backbone网络中 ,根据backbone网络中的三层输出 ,在neck层通过Rep-PAN网络继续输出三层不同size大小的feature map(以下简称fm) ,输入到最后的head层中 ,对图像检测的三类任务(分类 、前后背景分类 、边框)预测 ,输出最后的结果 。
backbone
yolov6s的backbone层参见RepVGG网络的backbone[3],如上图所示(s表示stride, o为outchannel, i为inchannel, 其中o=i表示outchannel=inchannel, o≠i表示outchannel与inchannel无相关性 ,并非其值一定不相等
) ,由若干RepVGG block(以下RepVGG block简称RVB, RepBlock简称RB)组成 。
RVB在训练和部署的时候结构不同 ,在训练的时候由33的卷积添加11的卷积分支 ,同时如果输入和输出的channel以及h,w的size一致时 ,再添加一个BN的分支 ,三个分支相加输出 ,在部署时,为了方便部署 ,直接取3*3的主分支卷积输出 。
RB为几个RVB的串联 ,其中第一个RVB用于特征层的size变化,后面N个RVB 用于特征层的融合 ,size保持不变 。
stem为s=2的RVB ,同时输入输出的channel不相同 ,这样stem的RVB变成:
同时ERBlock5中增加SPPF层:
其中SConv是有conv+BN+ReLu组成:
这样SPPF网络则先通过一个SConv层 ,特征图h,w的size不变 ,outchannel变成inchannel的一半 ,输出做为一个分支 ,而后经过3个maxpooling层 ,每个maxpooling的kernel=5,s=1,padding=kernel//2, 每经过一个maxpooling后 ,fm size均不变 ,并做为分支 。而后通过cat将几个分支在channel维度上相加 ,得到的size较于SPPF的输入 ,h,w不变,channel为输入的2倍 ,最后再通过一个SConv层 ,通道减半,使得输入和输出的fm size不变 。整个backbone层流程为:输入6406403的图片 ,通过stem层(s=2)输出为32032032 ,后面接几个ERBlock,每个ERBlock均做特征层的下采样和channel的增大 ,每个ERBlock由一个RVB和一个RB组成(ERBlock5多加SPPF层) ,在RVB中做特征层的下采样 ,同时channel增大 ,在RB中对特征层充分融合后输出 ,最后backbone输出三个fm分别为(2020512, 4040128, 808064) 。
neck
Neck层美团官方称其为Rep-PAN,是基于PAN的拓扑方法 ,如上图所示 ,类似一种“U ”型结构 ,其中U型左侧从上到下fm的h,w增大 ,右侧从下到上fm的h,w减小 ,其中Upsample上采样基于torch官方自带的转置卷积实现:
整个neck层的流程为,U型左侧 ,从ERB5输出2020512的fm,通过SConv 变成2020128大小 ,上采样后h,w较之前增大一倍后与ERB4的输出在channel层上concate后fm变成404384,通过一个RB(s=1, o≠i)后 ,输出 404128 ,重复上述步骤后 ,输出808064的fm。U型右侧 ,将808064的fm先SConv下采样 ,得到404064的fm,与U型左侧h,w一致的fm在channel层上concate后 ,通过一个RB(s=1, o≠i) ,输出第二个fm ,重复U型右侧以上步骤 ,输出第三个fm 。至此 ,neck层输出三个fm分别为(2020256, 4040128, 808064).Head
如上图 ,head基于三层输出预测 ,分别对应了大小不同的从大到小的感受野 。
其中BConv
是由conv+bn+SiLu组成:
整个head借鉴了yolox中的解耦头设计,并对其做了改进 ,head流程如下:从neck层输出三个分支 ,对于每个分支,先对输出fm通过BConv层 ,做fm的特征融合后 ,分成两个分支一个分支通过BConv+Conv完成分类任务的预测 ,另外一个分支先通过BConv融合特征后再分成两个分支 ,一个分支通过Conv完成边框的回归 ,一个分支通过Conv完成前后背景的分类 ,至此三个分支再通过concate在channel层上融合 ,输出未经后处理的预测结果。结语
以上为个人理解 ,yolov6s在0.1版本上的整体网络架构 ,如有理解偏差 ,欢迎交流 ,后续根据yolov6中各个模块中的详细的原理以及代码继续更新 ,希望对大家有帮助 。
参考:
[1]https://mp.weixin.qq.com/s/RrQCP4pTSwpTmSgvly9evg(美团官方解读)
[2] https://github.com/meituan/YOLOv6(美团官方代码)
[3] https://zhuanlan.zhihu.com/p/353697121创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!