yolov6系列一深度解析网络架构
Posted 所向披靡的张大刀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
Spring源码深度解析系列 Spring整体架构
一、Spring的整体架构和模块
二、模块分类:
1、Core Container
Core Container包含有Core 、Beans、Context、和Expression Language模块
2、Data Access/Integration
Data Access/Integration包含有JDBC、ORM、OXM、JMS和Transaction模块
3、Web
Web层包含了Web、Web-Servlet、Web-Struts、Web-Porlet模块。
4、AOP
5、Test
Test模块包括JUnit和TestNG对Spring组件进行测试
三、模块详解
- 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是
BeanFactory
,它是工厂模式的实现。BeanFactory
使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 - Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
- Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
- Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
- Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
- Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
- Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
以上是关于yolov6系列一深度解析网络架构的主要内容,如果未能解决你的问题,请参考以下文章