YOLO那些事儿【YOLOv1-YOLOv3详解】

前段时间系统整理了一下关于YOLO系列论文并进行一些补充解释,如下:

目录

1. 目标检测发展时间线 

2. 目标检测网络结构

3. 目标检测优化技巧

3.1 Bag of freebies(BOF)——提升检测精度而不增加推理时间

3.2 Bag of specials(BOS)——小幅提高推理代价,带来极大性能提升

4. 目标检测评价指标

4.1 速度指标

4.2 准确度指标

5. YOLOv1

5.1 YOLOv1网络结构

5.2 输入和输出的映射关系

5.3 损失函数 

5.4 YOLOv1优缺点

6. YOLOv2

6.1 改进策略

6.2 损失函数

6.3 输入和输出的映射关系

6.4 YOLOv2优缺点

7. YOLOv3

7.1  YOLOv3网络结构

7.2  Backbone:Darknet-53

7.3 输入和输出的映射关系

7.4 YOLOv3 Anchor

7.5 正负样本匹配规则

7.5 输入和输出的映射关系

7.6 损失函数

7.7 训练过程和测试过程

7.8 YOLOv3优缺点


1. 目标检测发展时间线 

2. 目标检测网络结构

Input模型的输入——图片、图片块、图片金字塔

Backbones特征提取器,先在分类数据集(如ImageNet)上进行预训练,再检测数据上进行微调

  • GPU平台上运行的检测模型,常用的backbone有VGG、ResNet、DarkNet
  • CPU平台或边缘设备上运行的检测模型,常用的backbone为MobileNet、ShuffleNet、SqueezeNet

Neck融合不同特征层的特征,将浅层丰富的位置信息和深层丰富的语义信息进行融合,提升检测效果

  • Additional blocks:SPP,ASPP,RFB,SAM
  • Path-aggregation blocks:FPN,PAN,NAS-FPN,Fully-connected FPN,BiFPN,ASFF,SFAM

Heads物体定位和分类

  • Dense Prediction:即one-stage方法
    • anchor based:YOLO系列,SSD,RetinaNet,RPN
    • anchor free:CornerNet,CenterNet,MatrixNet,FCOS
  • Sparse Prediction:即two-stage方法
    • anchor based:Faster R-CNN,R-FCN,Mask R-CNN
    • anchor free:RepPoints 

3. 目标检测优化技巧

3.1 Bag of freebies(BOF)——提升检测精度而不增加推理时间

  1. 数据增强
    1. 光度变换: 调整亮度,对比度,色相,饱和度和噪点
    2. 几何变换: 随机缩放,裁剪,翻转和旋转
    3. 模拟目标遮挡: random erase ,CutOut, Hide and Seek, grid Mask
    4. 图像融合:MixUp、CutMix、Mosaic
    5. GAN
  2. 边界框回归的损失函数
    1. IOU Loss
    2. GIOU Loss
    3. DIOU Loss
    4. CIOU Loss
  3. 正则化
    1. DropOut
    2. DropConnect
    3. DropBlock
  4. 标签平滑——Label Smoothing
  5. 数据不平衡——Focal Loss

3.2 Bag of specials(BOS)——小幅提高推理代价,带来极大性能提升

  1. 增强感受野
    1. SPP
    2. ASPP
    3. RFB
  2. 特征融合
    1. 跳层连接
    2. FPN
    3. SFAM
    4. ASFF
    5. BiFPN
  3. 后处理方式
    1. NMS
    2. soft NMS
    3. DIOU NMS
  4. 注意力模块
    1. 通道注意力(channel-wise) SE
    2. 空间注意力(point-wise) SAM
  5. 激活函数
    1. LReLU(解决当输入小于0时ReLU梯度为0的情况)
    2. PReLU(解决当输入小于0时ReLU梯度为0的情况)
    3. ReLU6(专门为量化网络设计)
    4. hard-swish(专门为量化网络设计)
    5. SELU(对神经网络进行自归一化)
    6. Swish(连续可微激活函数)
    7. Mish(连续可微激活函数)

4. 目标检测评价指标

4.1 速度指标

速度指标通常用每秒推断帧数FPS(Frames Per Second)衡量,受硬件影响较大

4.2 准确度指标

目标检测输入图像,输出图像中各个目标预测框的矩形坐标及各类别预测置信度,采用交并比IOU衡量预测框和标注框的重合程度,即预测框的定位是否准确

根据与标注框的关系,可将某一预测框划分为以下四类中的某一类,其中IOU阈值(一般为0.5)和置信度阈值(一般为0.2)由人工指定:

 (1)Precision(查准率):所有预测框中预测正确的比例,反映了模型“不把背景冤枉成目标”的准确性

(2)Recall(查全率、召回率):所有标注框中被正确预测的比例,反映了模型“不把目标放过为背景”的敏感性

 (3)Average Precision(平均精度,简称AP):将置信度阈值从0-1变化,计算每个置信度阈值对应的Precision和Recall,绘制成某类别的PR性能曲线(P和R均不能完整的表征网络的预测效果, 希望P和R同时为较大的值,即PR曲线与坐标轴围成的面积更大),其围成的面积为该类别的AP

 取所有类别的AP和不同的IOU阈值,可分别计算[email protected][email protected]:0.95

 [email protected]:IOU阈值取0.5时,各类别AP的平均值 

[email protected]:0.95:IOU阈值分别取以0.05为步长,从0.5增大至0.95的10个数时,各类别AP的平均值 

5. YOLOv1

YOLO(You Only Look Once)是一种基于深度神经网络的对象识别和定位算法——找到图片中某个存在对象的区域,然后识别出该区域中具体是哪个对象,其最大的特点是运行速度很快,可以用于实时系统。

两阶段目标检测第一阶段提取潜在的候选框(Region Proposal),第二阶段用分类器逐一筛选每个候选框,YOLO创造性的将候选区和对象识别两个阶段合二为一。

实际上,YOLO并没有真正去掉候选区,而是采用了预定义的候选区,将图片划分为 7 x 7=49 个网格,每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),总共 49 x 2=98 个bounding box。

5.1 YOLOv1网络结构

输入图像的尺寸为448 × 448,经过24个卷积层2个全连接层,reshape操作,输出的特征图大小为7 × 7 × 30(PASCAL VOC数据集)。

主要思想:

  • 将输入图像分成S*S网格,每个网格负责预测中心在此网格中的物体
  • 每个网格预测B个bounding box及其置信度,以及C个类别概率
  • bbox信息(x,y,w,h)为物体的中心位置相对格子位置的偏移及宽度和高度,均被归一化
    • x, y 是bounding box中心点相对于所在grid cell左上角格点的坐标
    • w,h 是bounding box相对于整幅图像的宽和高
  • 置信度反映是否包含物体,以及包含物体情况下位置的准确性。定义为Pr(Object)×IoU,其中Pr(Object)∈{0,1} 

5.2 输入和输出的映射关系

5.3 损失函数 

图中自行车的中心点位于4行3列网格中,所以输出tensor中4行3列位置的30维向量如右上图所示

损失:网络实际输出值与样本标签值之间的偏差

 损失函数:

5.4 YOLOv1优缺点

YOLOv1优点:

  1. 不需要提取候选框再对候选框逐一分类和回归(单阶段),一次前向推理得到bbox定位及分类结果,无复杂上下游处理工作,端到端训练优化,速度快,达到实时效率
  2. 迁移泛化好
  3. Background误差小,直接选用整图训练,能获取全局信息(RCNN系列只对候选框区域进行处理,管中窥豹)

YOLOv1缺点:

  1. 目标定位误差高,精度不足
  2. mAP低,准确度低,Recall低(比RCNN系列低)——“目标框不准,该检的检不出”

原因分析:

  • 采用全连接层进行最终预测,而全连接层可以认为是作用在全图特征的函数,目标检测是一个局部预测问题,以全图特征预测局部对象的位置信息本身就是矛盾的
  • YOLOv1采用7 x 7的网格划分,总共预测98个框,很难实现对图像上出现的目标有效覆盖,全部目标全部检出的能力差
  • YOLOv1的每个网格单元仅产生一个预测框,一个网格只能预测一个物体,导致YOLO-V1针对分布较密集的小型目标会产生比较严重的漏检现象

6. YOLOv2

6.1 改进策略

YOLOv1虽然检测速度快,但定位不够准确,并且召回率较低。为了提升定位准确度,改善召回率,YOLOv2在YOLOv1的基础上提出了几种改进策略,如下图所示:

1)Batch Normalization——increase of 4% mAP

  • YOLOv2中在每个卷积层后加Batch Normalization(BN)层,去掉了dropout层
  • Batch Normalization层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合

2)High Resolution Classifier(高分辨率预训练分类网络)——mAP提高4%

  • 一般的图像分类网络,以很小的图像分辨率在ImageNet上进行预训练,例如224 x 224
  • YOLOv1网络输入为448 x 448,从小分辨率切换到大分辨率,导致性能的降低
  • 为了使网络适应新的分辨率,YOLOv2先以224 x 224在ImageNet训练,再以448 × 448的分辨率在ImageNet进行10个epoch的微调,最后再以448 × 448在目标检测数据集上进行微调

3)Anchor Boxes——Recall提升7%,mAP降低0.3%

  • YOLOv1将图片划分为7 x 7的网格,每个网格预测两个bounding box,与ground truth的IOU大的bbox负责拟合该ground truth,利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准
  • YOLOv2去掉YOLOv1中的全连接层,使用类似Faster R-CNN和SSD的锚点机制,使用Anchor Boxes预测边界框,在卷积特征图上的每个位置绑定若干个具有不同尺度、不同长宽比的预定义Anchor Boxes,每个Anchor Boxes只需要在原有位置上进行微调,预测偏移量,仍旧是与ground truth的IOU大的Anchor Box负责拟合该ground truth,最后用来预测的卷积特征图为与之对应的包围框位置变换参数、置信度和目标类别概率
  • 即:人工标注框的中心点落在哪个grid cell里面,就由这个grid cell产生的Anchor中与ground truth的IOU最大的Anchor负责预测,只需要预测出相对于本身的偏移量即可
  • Motivation:解决一个网格中存在多个目标的问题(YOLOv1一个网格中只能检测一个目标)

注意⚠️:

Tips1:YOLOv2将feature map设为奇数长宽

原因:奇数长宽的feature map有中心cell,若图像中有占主导的大目标,则它的中心点有确定的grid cell负责预测,而不是偶数长宽有四个grid cell去抢

Tips2:mAP降低,Recall提升,则Precision降低了

原因:YOLOv1最多产生98个预测框,YOLOv2加入Anchor后产生845个预测框,尽可能可以把目标全部检测出来,所以Recall提升了,但845个框里面没用框的比例也增大了,Precision降低了(可以通过后处理来减少精度降低带来的影响,所以加Anchor是值得的)


  • Faster RCNN的Anchor产生的9个候选框是“人为”选择的(事先设定尺度和长宽比参数,按照一定规则生成),YOLOv2为了选择更合理的候选框(很难与gt建立对应关系的Anchor实际上是无效的),使用了聚类(K-means)的策略 (对数据集长宽比进行聚类,实验聚类出多个数量不同anchor box组,分别应用到模型中,找出在模型的复杂度和高召回率之间折中的那组anchor box)
  • 优点:使用anchor机制生成密集的anchor box,使网络能够直接在此基础上进行目标分类和边界框坐标回归,有效提高网络目标的召回能力,对小目标的检测有非常明显的提高
  • 缺点:冗余框非常多,一张图片内的目标只是有限的,每个anchor设置大量的anchor box会产生大量的完全不包含目标的背景框,引起正负样本严重失衡的问题
  • 注:预测框是以Anchor为基准,在Anchor基础上偏移得到的

4)Dimension Clusters(Anchor Box的宽高由聚类产生)

  • YOLOv2采用k-means聚类算法对训练集中的边界框做了聚类分析,选用boxes之间的IOU值作为聚类指标
  • 聚类分析得到的先验框比手动选择的先验框有更高的平均IOU值,这使得模型更容易训练学习
  • 注意:在标准K-means在聚类时采用欧几里得(Euclidean)度量作为聚类的距离判定标准,而在这种度量下,大框往往会产生比小框更大的误差,因此,YOLOv2在K-means聚类中使用更能体现框重叠关系的距离度量IOU

5)Direct location prediction(绝对位置预测)——mAP提高5%

  • YOLOv1每个grid cell预测两个框,这两个框野蛮生长,可以跑到图像中任何位置,YOLOv2加入Anchor后,预测相对Anchor的偏移量,按道理,这个偏移量仍可以全图乱窜,导致模型非常不稳定
  • 即相对位置是随机的,意味着在训练时要求预测得到的偏移量变换系数“一会儿正一会儿负”,导致模型在训练时产生严重震荡
  • 产生上述问题的原因在于目标包围框的位置不受到任何限制,出现的位置太过于随机
  • YOLOv2沿用YOLOv1的方法,根据所在网格单元的位置来预测坐标,在进行生成预测框时,有时候生成的预测框会超出图片的边界线,因此为了解决这一个问题,提出了使用绝对位置预测来限制预测框出现的位置(YOLOv1只是从这个村子出生,它仍然可以纵横天下,但在YOLOv2里生老病死全在这个村里了)

  • 如上图所示:
    • Cx, Cy:grid cell左上角x, y坐标
    • Pw, Ph:Anchor宽高 ——注:grid cell长宽归一化为1 x 1(需乘以grid cell下采样倍数,得到原始输入图像上预测框x,y坐标)
    • bx, by:预测框x, y坐标
    • bw, bh:预测框宽高

6)Direct location prediction(绝对位置预测)——mAP提高5%

  •  YOLOv2采用Darknet-19,包括19个卷积层和5个max pooling层
  • 主要采用3 × 3卷积和1 × 1卷积,1×1卷积(先降维再升维)可以压缩特征图通道数以降低模型计算量和参数
  • 每个卷积层后使用BN层以加快模型收敛同时防止过拟合
  • YOLOv2通过缩减网络,使用416 × 416的输入,模型下采样的总步长为32,最后得到13 × 13的特征图,然后对13 × 13的特征图的每个cell预测5个Anchor Boxes,可以预测13 × 13 × 5 = 845个边界框
  • 全卷积代替全连接: 与Faster R-CNN和SSD类似,YOLOv2利用具有小卷积核的全卷积层替换YOLOv1最后的全连接层进行目标框预测,该操作的实质即以局部特征代替全局特征来预测框,在一定程度上恢复局部框预测模式

7)Fine-Grained Features(细粒度特征)——提升了1%

  • YOL v2借鉴SSD使用多尺度的特征图做检测,提出pass through层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测 

  • pass through拆分方法:

  

8)Multi-Scale Training(多尺寸训练)——在速度和精度上进行自由权衡

  • YOLOv2采用多尺度输入的方式训练,在训练过程中每隔10个batches,重新随机选择输入图片的尺寸
  • 由于Darknet-19下采样总步长为32,输入图片的尺寸一般选择32的倍数{320,352,…,608}
  • 采用Multi-Scale Training, 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高mAP值,但速度有所下降

6.2 损失函数

论文中没有明确提出损失函数,下图来自同济子豪兄的损失函数解析:

6.3 输入和输出的映射关系

6.4 YOLOv2优缺点

  • YOLOv2相较于之前的版本有了质的飞跃,主要体现在吸收了其他算法的优点,最主要的是引入了Anchor,同时利用了多种训练技巧,在网络设计上做了很多tricks,使得模型在保持极快速度的同时大幅度提升了检测的精度
  • 单层特征图:虽然采用了Passthought层来融合浅层特征,增强多尺度检测性能,但仅仅采用一层特征图做预测,细粒度仍然不够,对小物体等检测提升有限,并且没有使用残差这种较为简单、有效的结构,受限于其整体网络架构,仍然没有很好地解决小物体的预测问题

7. YOLOv3

YOLOv3主要是融入目前较好的检测思想到YOLO中,在保持速度优势的前提下,YOLO3借鉴了残差网络结构,形成更深的网络层次,以及多尺度检测,进一步提升了检测精度,尤其是对小物体的检测能力。具体来说,YOLOv3主要改进了网络结构、网络特征及后续计算三个部分。

7.1  YOLOv3网络结构

(来自江大白的网络结构图)

  • 残差思想:Backbone DarkNet-53借鉴了ResNet的残差思想,在基础网络中大量使用了残差连接,因此网络结构可以设计的很深,并且缓解了训练中梯度消失的问题,使得模型更容易收敛
  • 多层特征图:通过上采样与Concat操作,融合了深浅层的特征,最终输出了3种尺寸的特征图,有利于多尺度物体及小物体检测
  • 无池化层:DarkNet-53没有采用池化,通过步长为2的卷积核来达到缩小尺寸的效果,下采样5次,总体下采样率为32(输入图像大小为32的倍数即可,输入越大,得到的三个特征图越大)

7.2  Backbone:Darknet-53

  • Backbone:DarkNet-53(混合DarkNet-19和ResNet)——特征提取器(骨干网络提供食材,后续进行烹饪,好的食材不一定能做出好饭,但没有好食材肯定做不了好饭,骨干网络提取好的特征)
  • Darknet-53采用连续的3 x 3卷积和1 x 1卷积,一共有53个带权重的层(52个卷积层+一个全连接),对于ResNet-152和ResNet101在分类精度上差不多,计算速度更快,网络层数更少 
  • Darknet-53能更高效利用GPU,更快进行前向推断(ResNet层数太多)

  • YOLOv3在AP0.5表现好,说明当IOU阈值(影响正负样本的划分,从而影响模型训练结果)设置比较小时,大概能定位正确;当IOU阈值提升,例如提升至0.95时,预测框必须和GT非常重合,才能判定此框为TP,预测正确,此时YOLOv3性能较差——精准定位性能差
  • YOLOv3在小目标和密集目标的改进:
    • grid cell个数增加(YOLOv2和YOLOv3兼容任意图片大小输入——全卷积网络)
    • 设置了针对小目标的Anchor
    • 整合了多尺度的特征进行多尺度预测(FPN)
    • 损失函数增加了惩罚小框项
    • 网络结构使用跨层连接且骨干网络的特征提取能力增强 

7.3 输入和输出的映射关系

  • 输入:416x416的图像,通过Darknet网络得到三种不同尺度的预测结果(受FPN特征金字塔的启发),每个尺度都对应255个通道(85 x 3),包含着预测的信息,每个网格每个尺寸的anchors的预测结果
  • YOLOv1:输入448 x 448,划分为7 x 7网格,无Anchor,生成B个bbox(B=2),产生7 x 7 x 2 = 98个预测框,类别数C=20,输出张量维度为7 x 7 x (5 x B + C) 
  • YOLOv2:输入416 x 416,每个grid cell五个Anchor,每个grid cell对应的原图感受野大小一样,对大小目标一视同仁(pass through),产生13 x 13 x 5 = 845个预测框,输出张量维度为13 x 13 x 5 x ( 5 + 20 )
  • YOLOv3:输入416 x 416,生成13 x 13(大目标),26 x 26(中目标),52 x 52(小目标)三个尺度feature map,每个尺度三个Anchor,产生(13x13 + 26x26 + 52x52) x 3 = 10647个预测框,每个预测对应85维,分别是4(坐标值),1(置信度分数),80(coco类别数)

7.4 YOLOv3 Anchor

  • YOLOv3每个grid cell分配三个Anchor(聚类),一共9个Anchor
  • 13 x 13 feature map:对应原图的感受野是一个grid cell对应原图32 x 32的像素,下采样32倍,负责预测大目标,对应大Anchor
  • 26 x 26 feature map:负责预测中目标
  • 52 x 52 feature map:负责预测小目标

  • 例如,落在某grid cell中的目标,由该grid cell的Anchor中与目标ground truth的IOU最大的Anchor预测该目标,但是每个尺度都有一个IOU最大的Anchor,究竟由哪个尺度的grid cell对应的Anchor预测呢?
  • 由所有Anchor中与目标ground truth的IOU最大的Anchor负责预测,YOLOv3不再看中心点落在哪个grid cell里面,而是看谁IOU最大

7.5 正负样本匹配规则

  • 正例:任取一个ground truth,与4032个框全部计算IOU,IOU最大的预测框,即为正例
    • 一个预测框只能分配给一个ground truth负责预测(IOU最大的)
    • 正例产生置信度loss、检测框loss、类别loss,类别标签对应类别为1,其余为0,置信度标签为1
  • 忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5),则为忽略样例
    • 忽略样例不产生任何loss
  • 负例:正例除外(与ground truth计算后IOU最大的检测框,但是IOU小于阈值,仍为正例),与全部ground truth的IOU都小于阈值(0.5),则为负例
    • 负例只有置信度产生loss,置信度标签为0


注意⚠️:

  1. YOLOv1按照中心点分配对应的预测box,YOLOv3根据预测值寻找IOU最大的预测框作为正例,是由于Yolov3使用了多尺度特征图,不同尺度的特征图之间会有重合检测部分,忽略样例是Yolov3中的点睛之笔
  2. Yolov1/2中的置信度标签是预测框与真实框的IOU,而Yolov3是0和1,意味着该预测框是或者不是一个真实物体,是一个二分类
  3. Yolov1/2中使用IOU作为置信度阈值有何不好
    1. 很多预测框与gt的IOU最高只有0.7(这个值本来就不高,把这个值作为标签,很难训练,若直接把标签设为1,明确告诉模型这就是正样本,好好学,当成偶像学,而不是只学0.7)
    2. COCO数据集中小目标非常多,IOU对像素偏移很敏感,无法有效学习——《Augmentation for small object detection》

7.5 输入和输出的映射关系

7.6 损失函数

下图来自同济子豪兄的损失函数解析:

注意⚠️:YOLOv3尝试使用了Focal Loss,mAP反而降低了两个点

原因分析:Focal Loss解决单阶段目标检测“正负样本不均衡,真正有用的负样本少”的问题,相当于是某种程度的难例挖掘。YOLOv3中负样本IOU阈值设置过高(0.5),导致负样本中混入疑似正样本(label noise),而Focal Loss又会给这些noise赋予更大的权重,因此效果不好 

7.7 训练过程和测试过程

7.8 YOLOv3优缺点

YOLOv3优点:

  • 推理速度快,性价比高
  • 背景误检率低
  • 通用性强

YOLOv3缺点:

  • 召回率较低
  • 定位精度较差
  • 对于靠近或者遮挡的群体、小物体的检测能力相对较弱

猜你喜欢

转载自blog.csdn.net/daydayup858/article/details/130118143