YOLOv5-nopaper
在YOLOv4的基础上添加了一些新的改进思路,网络做成了可选择配置的方式
什么是YOLOv5?
- 在YOLOv4的基础上添加了一些新的改进思路,网络做成了可选择配置的方式,分为Yolov5s、Yolov5l、Yolov5s、Yolo5x 等版本
- 输入端: 在模型训练阶段,提出了一些改进思路:Mosaic数据增强、自适应锚框计算、自适应图片缩放
- 基准网络: 融合其它检测算法中的一些新思路,主要包括:Focus结构、快速金字塔池化(SpatialPyramidPooling-Fast,SPPF)
- Neck 网络: 目标检测网络在 BackBone 与最后的 Head 输出层之间往往会插入一些层,Yolov5 中添加特征金字塔网络(FeaturePyramidNetwork,FPN)、PANet
- Head 输出层: 输出层的锚框机制与 YOLOv4相同,主要改进的是训练时的损失函 深度学习的损失函数#^fnaag1|GIOU loss,以及预测框筛选目标检测基础知识#^lgcpjg|DIOU-NMS
YOLOv5的网络结构?
- 输入:608x608 输出多尺度预测结果:19x19/38x38/76x76
- 网络中的 1、2、3、4、5、6 分别时组成 YOLOv5 的基础组件,即:CBL 模块、Res 模块、CSP1_X、CSP1_X、Focus 结构、SPPF
- YOLOv5 使用了 2 类 CSPNet 结构,CSP1_X 和 CSP2_X,前者用于 BackBone,由 CBL+Res+Concate 组成,后者用于 Neck,由卷积+Res+Concate 组成
YOLOv5的Focus结构?
和YOLOv2使用传递层(passthroughlayer)相似,通过slice操作来对输入图片进行裁剪。原始输入图片大小为608 * 608 * 3,经过Slice与Concat操作之后输出一个304 * 304 * 12的特征映射;接着经过Conv层
Focus结构可以扩大感受野,提升对大尺度目标的预测能力
什么是快速金字塔池化(Spatial Pyramid Pooling - Fast, SPPF)结构?
- YOLOv5改空间空间金字塔池化(SpatialPyramidPooling,SPP)得到,主要思想是:将输入串行通过多个不同大小的MaxPool,然后做进一步融合,两者的作用是一样的,但后者效率更高
- SPPF 结构是将输入串行通过多个 5x5 大小的 MaxPool 层,这里需要注意的是串行两个 5x5 大小的 MaxPool 层是和一个 9x9 大小的 MaxPool 层计算结果是一样的,串行三个 5x5 大小的 MaxPool 层是和一个 13x13 大小的 MaxPool 层计算结果是一样的
1 | class SPPF(nn.Module): |
什么是BottleneckCSP?
- Bottleneck结构CSPNet结合,形成 CSP瓶颈层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class BottleneckCSP(nn.Module):
# CSP Bottleneck https://github.com/WongKinYiu/CrossStagePartialNetworks
def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansion
super(BottleneckCSP, self).__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_, k=1)
self.cv2 = nn.Conv2d(c1, c_, kernel_size=1, bias=False)
self.cv3 = nn.Conv2d(c_, c_, kernel_size=1, bias=False)
self.cv4 = Conv(2 * c_, c2, k=1)
self.bn = nn.BatchNorm2d(2 * c_) # applied to cat(cv2, cv3)
self.act = nn.LeakyReLU(0.1, inplace=True)
self.m = nn.Sequential([Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
def forward(self, x):
y1 = self.cv3(self.m(self.cv1(x)))
y2 = self.cv2(x)
return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))
YOLOv5的自适应锚框计算原理?
- 在开始训练之前对数据集核查,计算此数据集针对默认锚定框的最佳召回率,当最佳召回率大于或等于0.98,则不需要更新锚定框;如果最佳召回率小于0.98,则需要重新计算此数据集的锚定框
- 1)载入数据集,得到数据集中所有数据的wh
- 2)将每张图片中wh的最大值等比例缩放到指定大小img_size,较小边也相应缩放
- 3)将bboxes从相对坐标改成绝对坐标(乘以缩放后的wh)
- 4)筛选bboxes,保留wh都大于等于两个像素的bboxes
- 5)使K-Means聚类得到n个anchors(K-Means算法涉及一个白化操作)
- 6)使遗传算法随机对 anchors 的 wh 进行变异,如果变异后效果变得更好(使用 anchor_fitness 方法计算得到的 fitness(适应度)进行评估)就将变异后的结果赋值给 anchors,如果变异后效果变差就跳过,默认变异1000次
YOLOv5的自适应图片缩放原理?
- 训练阶段―
- 直接按比例缩放并填充
- 测试阶段―
- 第一步:计算缩放比例
- 第二步:计算缩放后的尺寸
- 第三步:计算黑边填充数值,网络进行了5倍下采样,网络填充部分能被32整除的部分到最后也是背景,不被32整除部分可能参与预测
- 注意: YOLOv3与YOLOv4中默认填充的数值是(0,0,0),而YOLOv5中默认填充的数值是(114,114,114)
YOLOv5正样本的匹配策略?
- YOLOv5使用3种方法增加正样本数量
- 1)跨anchor预测: 不同于IOU匹配,yolov5采用基于宽高比例的匹配策略,GT框和先验框宽高相除得ratio1,先验框与GT的宽高相除得到ratio2,取ratio1和ratio2的最大值作为最后的宽高比,该宽高比和设定阈值(默认为4)比较,小于设定阈值的anchor则为匹配到的anchor”
- 2)跨grid预测: GT框中心点处于grid1中,grid1被选中,为了增加增样本,grid1的上下左右grid为候选网格,因为GT中心点更靠近grid2和grid3,grid2和grid3也作为匹配到的网格,根据上步的anchor匹配结果,GT与anchor2、anchor3相匹配,因此GT在当前层匹配到的正样本有6个,分别为: grid1_anchor2,grid1_anchor3,grid2_anchor2,grid2_anchor3,grid3_anchor2, grid3_anchor3
- 3)跨分支预测: 假设一个GT框可以和2个甚至3个预测分支上的anchor匹配,则这2个或3个预测分支都可以预测该GT框, 即一个GT框可以由多个预测分支来预测,重复anchor匹配和grid匹配的步骤,可以得到某个GT 匹配到 的所有正样本
YOLOv5损失函数?
- 分类损失: 采用的二值交叉熵损失BCELoss,注意只计算正样本的分类损失
- obj 损失: 采用的依然是 BCE loss,注意这里的 obj 指的是网络预测的目标边界框与 GT Box 的CIoU loss。这里计算的是所有样本的 obj 损失
- 定位损失: 采用的是 GIoU loss,注意只计算正样本的定位损失
- 三个预测特征层(P3, P4, P5)上的obj损失采用不同的权重。在源码中,针对预测小目 标的预测特征层(P3)采用的权重是4.0,针对预测中等目标的预测特征层(P4)采用的权重是1.0,针 对预测大目标的预测特征层(P5)采用的权重是0.4