前言
前段时间分析了yolov3的源码,这次想带着小伙伴一起把yolov5完全掌握。博主还是保持着一贯的风格,依旧采用debug级别的源码剖析。目的就是让大家可以通过一个系列的文章就把yolov5的架构、设计理念和每一行源码都弄懂。只要小伙伴可以花时间把这个系列读完,就会对yolov5的理解有所提升。
去年参加了kaggle的小麦检测比赛,yolov5在比赛的中段开始呈现霸榜趋势,超越了efficientdet。虽然最后yolov5因为权限等某些问题被kaggle官方禁用了,但是仍然体现出了其强大的能力。值得一学,学习本篇前读者应该至少对于yolo系列中的一个或几个有所了解,对照着学习更加利于理解。
前面做了yolov3的源码剖析,不了解的读者也可以学习下:
传送门:
下面我们就开始yolov5的学习吧,第一篇我们先focus在yolov5的架构上,对其各个组件有所了解,对其设计理念有所认知,然后在这个基础上开始逐行对yolov5进行debug解析。值得注意的是yolov5的架构一直在迭代演进,不同版本之间稍有区别,但是基本上是一致的。
一.yolov5 架构剖析

这是yolov5s的架构,图来自于百度图片,博主查了下应该是知乎上一个大神画的。这里尊重大神创作,给下地址:
从yolov5s到yolov5x之间的差别就是不同的block叠加次数不同,见下图:

从架构上看,yolov5的架构设计并不复杂,整体上维持了FPN的设计方式,FPN加强了重复迭代,两次迭代的结构称为PAN。这个结构还可以进一步重复,类似efficientdet那样演进为BiFPN。backbone仍然是darknet的形式,通过残差结构让网络加深。模型开始引入Focus的设计有点奇特,直接就降低了resolution应该是yolov5轻量的原因之一。SPP模块的引入进一步融合了多尺度特征提取。有两种不同的CSP模块,区别是有无残差结构,
整体设计和模块的加减像是消融实验的产物,不过我们还是逐个模块过下:
1. Focus

Focus的理念比较特殊,执行过程见下图:

我在观察Focus这个设计的时候带着的问题是这样的设计是为什么以及这样的设计为什么work?
我的理解是首先它这样的排列方式是将相邻的四个块从平面改为特征上的concat。

也就是这样的四个块做了叠加,从3通道变为12通道,这样尽可能的保留了位置信息。同一个通道里应该代表着局部的特征表达,这样操作一个grid位置代表了原图四个grid的特征。在保证了位置信息尽可能保留的情况下又增大了感受野。
这样的效果是特征图的尺寸为原来的一半,在这里我想到的问题是卷积是能够保持特征的位置相对性的,那么这种focus操作能否常规化代替pooling或者是stride=2的卷积呢?我们都知道pooling对feature map的信息的丢失是很严重的(当然也有一部分正则化的作用),所以很多现在的架构设计里pooling都被stride=2的convolution代替。我又想到了shufflenet里的channel shuffle操作是在做了组卷积之后,怕看不到全局特征,为了增强channel间的特征共享,进行的特征融合。所以Focus操作后面是否也应该增强每个格点通过concat拼接起来的特征向量的融合,比如通过1x1 group convolution。yolov5的融合采用的是一个普通的CBL(conv–bn–leakyrelu)。
2.CSP

yolov5的设计中有两种CSP结构,一种是带了resunit(2*CBL卷积+残差),一种是用普通的CBL替换resunit。带残差的部分是用在backbone里,不带残差的是用在backbone之外的地方。这里应该是实验的结果,backbone为较深的网络,增加残差结构可以增强层与层之间反向传播的梯度值,避免因为加深而带来的梯度消失,从而提取到更细粒度的特征而不必担心网络退化。同时,有些研究表明残差结构可以看作非残差的ensemble,从而增强部分的泛化能力。
当然以上都是理论上的分析,我之前在竞赛中对于unet的encoder,bridge,decoder的部分都分别测试了残差结构,也发现encoder的部分对于残差结构是比较依赖的,但是bridge和decoder的残差结构都没有获得精度上的提高。这里只是说一下我之前的实验结果,供大家参考。
CSP结构的好处就是对比普通的CBL,它分为两个支路,有支路就意味着特征的融合,而concat就可以更好的把不同支路的特征信息保留下来,因此CSP的设计可以提取到更为丰富的特征信息。
289


 yolov5的架构和源码debug准备&spm=1001.2101.3001.11974&articleId=114116862&d=1&t=3&u=554ab79b80634e1eb6cbbc16adc03ba8)

被折叠的 条评论
为什么被折叠?



