跳至主要內容

长篇解读YOLO系列模型

高礼彬大约 21 分钟深度学习目标检测YOLO

目标检测的YOLO是一种基于单个神经网络的目标检测系统,由Joseph Redmon和Ali Farhadi等人于2015年提出。

YOLO将目标检测视为一个回归问题,直接预测输入图像中物体的类别和位置,与传统的两阶段目标检测算法(如R-CNN系列)不同, YOLO不需要提前找到可能存在物体的区域,因此具有速度快、实时检测的优点。

YOLOv1解读 [1]

YOLOv1主要结构
YOLOv1主要结构

上图展示了YOLOv1的主要结构,模型由输入层、卷积特征提取层、全连接层、以及输出层。

  • 输入层: YOLOv1模型输入必须448*448*3 的图像。原因是模型中包含一个全连接层,全连接层只能接受固定的特征大小,不能动态变化(后续版本解决)。
  • 卷积特征提取层: YOLOv1模型采用的CNN模型是预训练的GoogleNet网络,从输入448*448*3 图像到特征提取的 4096 特征。
  • 全连接层:将 4096 的特征大小通过全连接层压缩降维到 1470(=7*7*30)
  • 输出层:将特征变形(reshape)为 7*7*30

为什么特征最后是 7*7*30

首先,YOLOv1将输入图像划分为 S×S 的网格(cell),如下图所示。如果一个物体的中心落在某一个网格单元内,则该网格单元负责检测该物体。原论文设置 S 为7。

原文:If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object.

其次,每个网格通过网络后,会生成三种数据:B个边界框数据、B个置信度数据和C个类别概率。原论文设置B为2,C为20。

  1. 一个边界框数据中包含四个参数 (x,y,w,h) ,即中心坐标 xy,框的宽 w 和高 h

注意

边界框的坐标和长宽均为相对偏移坐标x, y 是相对于当前网格(cell)的偏移;w, h是相对于整张图片的偏移。

  1. 置信度 c 用于衡量网络对边界框的相信程度,与某个边界框数据对应。 具体计算方式为:
Confidence=Pr(Object)IOUpredtruth

Pr(Object)0/1 函数:若此网格里没有负责任何目标,则为0c 也为0;否则为1

IOUpredtruth 是预测的边界框与Ground TrueIOU。 作者希望有目标的网格里,置信度 c 代表网络预测边界框框住Ground True的能力。

  1. 类别概率为该网格(cell)对于其负责的目标分类的概率。类别的多少与数据集中存在的类别有关,与边界框无任何关系。

因此,最终的特征维度为S×S×(B×(4+1)+C),带入本文设置的数据为:7×7×(2×5+20),即 7×7×30

为什么有两个预测的边界框?

因为YOLOv1预定义了两个常见的先验框,分别是长方形和正方形。

在不同的模型或数据集中,预先定义的先验框的数量也不一样。例如:YOLOv2的先验框是5个,YOLOv3的先验框是9个。

先验框不意味着越多越好,过量的先验框可能会影响模型性能。

为什么要有先验框?

先验框是预设的候选区域,用于提高目标检测效率和精度。 通过利用常见目标物体的先验知识,减少检测区域并覆盖更多可能的情况。

简单来说,有了先验知识后,模型基于先验知识能够有更好的表现。

YOLOv1输出特征
YOLOv1输出特征

YOLOv1的损失函数是如何设计的?

完整的损失函数如下:

λcoord i=0S2j=0B1ijobj [(xix^i)2+(yiy^i)2]+λcoord i=0S2j=0B1ijobj [(wiw^i)2+(hih^i)2]+i=0S2j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj(CiC^i)2+i=0S21iobj c classes (pi(c)p^i(c))2

损失函数包含三个部分,即:

Loss=Loss+Loss+Loss+Loss

1. 边界框损失

Loss衡量边界框的预测准确程度,也就是位置误差。

Loss=λcoord i=0S2j=0B1ijobj [(xix^i)2+(yiy^i)2]+λcoord i=0S2j=0B1ijobj [(wiw^i)2+(hih^i)2]

公式解释:

  1. i=0S2:代表遍历S2个网格
  2. j=0B:代表遍历B个候选框
  3. 1ijobj :代表只计算对存在目标的i号网格负责的j边界框的损失

为什么长宽的损失带根号?

作者尝试解决小物体的损失不敏感的问题。 因为 y=x 在x较小时候斜率较高、x较大时斜率较低。

2. 置信度损失

Loss 衡量置信度 c 值的预测准确程度。

Loss=Lossobj+Lossobj=i=0S2j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj(CiC^i)2

公式解释:

  1. 1ijobj :代表只计算对存在目标的i号网格负责的j边界框的置信度损失
  2. Ci,C^i:代表 Ground True 和预测的 c

提示

在训练时计算置信度损失时,在含有背景的网格中,只计算多个候选框中与 Ground True IOU最大的候选框的损失

3. 类别损失

Loss:衡量各类别概率预测的准确程度。

Loss=i=0S21iobj c classes (pi(c)p^i(c))2

公式解释:

  1. 1ijobj  代表只计算存在目标的i号的网格上各类别预测概率的累加损失

4. 惩罚项 λcoord λnoobj 

λcoord  用于调整 LossLoss 的平衡。 作者认为两者维度不匹配(前者维度为4 * B,后者维度为C),所以需要惩罚项平衡。原论文实验中此项设置为 5

λnoobj  用于调整Loss两项内部的平衡。 作者发现一张图片中许多网格并未包含任何目标,所以需要平衡有目标与无目标损失之和。 原论文实验中此项设置为 0.5

YOLOv1优点与缺点

优点

  1. 快且准确率不俗
  2. 迁移到其他任务的能力强

缺点

  1. 一个网格只能预测一个物体,重叠无法解决
  2. YOLO对相互靠近的物体,以及很小的群体检测效果不好

这是因为一个网格只预测了B个框,并且每个网格都只属于同一类 (训练时已经标注了某个网格属于某个单一类别), 只有一个one-hot类别概率。 在w, h的损失上的处理并未完全解决问题, 只是一定程度上缓解了不同大小的边界框对于相同偏移不平衡的问题。

作者提到:特别是针对小物体的预测,YOLO还有待加强。 YOLO出现的主要问题也是预测框的准确度不高。 YOLO对不常见的角度的目标泛化性能偏弱

YOLOv2解读 [2]

YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率,从而提高mAP, YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势。

YOLOv2提升路径
YOLOv2提升路径

YOLOv2的改进策略如图所示,可以看出,大部分的改进方法都可以比较显著提升模型的mAP。 下面详细介绍各个改进策略:

Batch Normalization (BN)

Batch Normalization(BN) 可以提升模型收敛速度,并降低过拟合风险。

在YOLOv2中,每个卷积层后都添加了Batch Normalization层,不再使用dropout,提升了mAP 2.4%

High Resolution Classifier (高分辨率分类器)

目前大部分的检测模型都会在先在ImageNet分类数据集上预训练模型的主体部分(CNN特征提取器), 由于历史原因, ImageNet分类模型基本采用大小为 224×224 的图片作为输入,分辨率相对较低,不利于检测模型。 所以YOLOv1在采用 224×224 分类模型预训练后,再将分辨率增加至 448×448,使高分辨率在目标检测的数据集上进行微调。

但是直接切换分辨率,检测模型可能难以快速适应高分辨率。 所以YOLOv2增加了在ImageNet数据集上使用 448×448 输入来微调网络这一中间过程 10 epochs, 这可以使得模型在检测数据集上微调之前已经适用高分辨率输入。

使用高分辨率分类器后,YOLOv2的mAP提升了约4%

convolutional with Anchor Boxes (先验框尝试)

在YOLOv2尝试加入Anchor Boxes机制,但认为固定的先验框并不适合对应数据集,因此改用聚类计算先验框的尺寸。

在YOLOv1中,输入图片最终被划分为7×7网格,每个单元格预测2个边界框。 YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的, 而由于各个图片中存在不同尺度和长宽比的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的, 这也导致YOLOv1在精确定位方面表现较差。

YOLOv2去除了YOLO的全连接层,借鉴了Faster R-CNN中RPN网络的 锚框(anchor box) / 先验框(prior bounding box) 机制。 使用了先验框机制之后,每个位置的各个先验框都单独预测一套分类概率值。

此外:

  1. 去除了一层池化层以保证卷积输出具有较高的分辨率。
  2. 把输入图像 448×448的尺寸 收缩到 416×416

因为作者想让输出特征图的维度是奇数13×13 (416/32=13),这样的话会有一个中间单元格。

物体(尤其是大物体)经常占据图像的中心,所以有一个单独位置恰好在中心位置能够很好地预测物体。

使用了先验框机制之后,准确率有一点点下降。YOLOv1只能在每张图给出98(7×7×2)个预测框, 但是使用了先验框机制之后模型能预测超过1000(13×13×num_anchors)个框。

最终输出特征为: 13×13×(num_anchors×(5+num_classes))

锚框/先验框机制是什么?

Faster R-CNN的RPN网络对CNN特征提取器得到的特征图进行卷积,来预测每个位置的每个先验框下的 offsets 以及置信度 c

offsets:是在相对于已经预先定义好的一些先验框下,预测边界框的坐标进行修正或偏移的参数。

New Network: Darknet-19

YOLOv2采用了一个新的基础模型(特征提取器),称为Darknet-19,包括19个卷积层和5个maxpooling层,如下图所示。

DarkNet-19结构
DarkNet-19结构

Darknet-19与VGG16模型设计原则是一致的,主要采用3×3卷积,采用2×2的maxpooling层之后,特征图维度降低2倍, 而同时将特征图的通道数增加两倍。

与NIN(Network in Networkopen in new window)类似, Darknet-19最终采用全局平均池化层做预测,并且在3×3卷积之间使用1×1卷积来压缩特征图通道数以降低模型计算量和参数。 Darknet-19每个卷积层后面同样使用了BN层以加快收敛速度,降低模型过拟合。

在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。 使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。

Dimension Clusters (聚类提取先验框的尺度信息)

在Faster R-CNN和SSD中,先验框的长和宽都是手动设定的,带有一定的主观性

如果选取的先验框尺寸比较合适,那么模型更容易学习,从而做出更好的预测。如果尺寸不合适则难以训练。

因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析,聚类分析时选用边界框之间的IOU值作为距离指标(在相同中心的情况下计算IOU):

d(box,centroid)=1IOU(box,centroid)

对于两个数据集,5个先验框的宽和高如下所示(来源:YOLO源码的cfg文件):

  • COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
  • VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

需要注意的是:这里先验框的大小是相对于预测的特征图大小(13×13

Direct location prediction(直接位置预测)

前文中提到了YOLOv2借鉴RPN网络使用先验框来预测边界框相对先验框的 offsets,这里详细介绍一下各类参数,分别包含如下内容:

边界框的实际中心位置 (x,y),需要根据预测的坐标偏移值 (tx,ty) ,先验框的尺度 (wa,ha) 以及中心坐标 (xa,ya) (特征图每个网格的中心点),在之前的RPN网络中的公式如下:

x=(tx×wa)xay=(ty×ha)ya

但是上面的公式是无约束的,预测的边界框很容易向任何方向偏移;例如:当tx=1时边界框将向右偏移先验框的一个宽度大小 ,而当tx=1时,边界框将向左偏移先验框的一个宽度大小。

这导致每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的 offsets

因此,YOLOv2弃用了这种预测方式,而是沿用YOLOv1的方法,预测边界框中心点相对于对应网格左上角坐标 (cx,cy) 的相对偏移值。

为了将边界框中心点约束在当前网格中,使用 sigmoid 函数处理偏移值,这样预测的偏移值在 (0,1) 范围内(每个网格的尺度看做1)。

根据边界框预测的4个offsets tx,ty,tw,th, 可以按如下公式计算出边界框(基于特征图尺度下)的位置和大小:

bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth
  • pw,ph 是(相对于特征图大小的)先验框的宽度与长度
  • bx,by,bw,bh 是(相对于特征图大小的)预测框的 x,y,w,h

具体的示意图如下:

边界框位置与大小的计算示例图
边界框位置与大小的计算示例图

当需要将特征图大小转换为真实图像的大小时,特征图的大小记为(Wf,Hf)(在文中是13×13),原图像大小为(W,H),有如下公式:

Bx=bxWf×W=σ(tx)+cxWf×WBy=byHf×H=σ(ty)+cyHf×HBw=bwWf×W=pwetwWf×WBh=bhHf×H=phethHf×H
  • Bx,By,Bw,Bh 是原图像的大小下的预测框的 x,y,w,h

约束了边界框的位置预测值使得模型更容易稳定训练,结合聚类分析得到先验框与这种预测方法,YOLOv2的mAP值提升了约5%

Fine-Grained Features(利用细粒度特征)

在YOLOv2中,输入图片经过一系列卷积和池化操作后,得到 13×13 大小的特征图, 该特征图对检测大物体是足够的,但对于小物体则需要更精细的特征图。

为了解决这个问题,YOLOv2提出了一种Passthrough层,该层利用更精细的特征图来预测小物体。

Passthrough层

Passthrough层相当于特征重排层(不涉及到参数学习)。

Passthrough层将特征图前一层中26×26×512的特征图使用按行和按列隔行采样的方法,得到4个新的特征图,维度都是13×13×512, 堆叠后得到13×13×2048的特征图,并拼接到输出层。

multi-scale training(多尺度分辨率的输入)

由于YOLOv2只用到了卷积层和池化层,那么就可以进行动态调整(意味着可检测动态大小的图片)

为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔几次迭代(10 epochs)之后改变模型的输入图片大小。

YOLOv2使用的降采样参数为32,那么就使用32的倍数进行尺度池化 320,352,...,608, 最终最小的尺寸为320×320,最大的尺寸为608×608,接着按照输入尺寸调整网络进行训练。

这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务, 在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。

YOLOv2的优缺点

优点

  1. 更高的检测精度:相对于v1,YOLOv2在VOC数据集上的mAP(mean Average Precision)提高了约20%,达到了76.8%。这主要得益于一系列改进,包括使用更深的网络结构(Darknet-19)、引入批归一化(Batch Normalization)、使用高分辨率的图像进行训练等。
  2. 更快的检测速度:虽然YOLOv2相对于v1在结构上更复杂,但由于采用了更高效的计算方式,其检测速度仍然非常快。在GPU上,YOLOv2可以实现实时检测,处理速度达到每秒40帧以上。
  3. 更好的小目标检测能力:相对于v1,YOLOv2对于小目标的检测能力有了显著提升。这主要得益于多尺度输入和更深的网络结构,使得模型能够学习到更多的小目标特征。
  4. 更强的泛化能力:YOLOv2采用了多种数据增强方法,如随机裁剪、旋转、色调变换等,使得模型具有更强的泛化能力,能够适应各种复杂场景下的目标检测任务。

缺点

  1. 对于密集小目标的检测效果仍有待提升:虽然YOLOv2相对于v1在小目标检测方面有了显著提升,但在处理密集小目标时仍可能出现漏检或误检的情况。这主要是因为密集小目标之间的特征容易相互干扰,导致模型难以准确识别。
  2. 对于某些特殊形状的目标检测效果不佳:由于YOLOv2采用固定大小的网格进行目标检测,因此对于某些特殊形状的目标(如长条形或扁平形目标),可能会出现定位不准确或漏检的情况。
  3. 对于遮挡目标的处理有待改进:在处理遮挡目标时,YOLOv2可能会出现误检或漏检的情况。这主要是因为遮挡会导致目标的部分特征丢失或变形,使得模型难以准确识别。

总的来说,YOLOv2相对于v1在目标检测精度和速度上都有了显著提升,但仍然存在一些挑战和局限性。

YOLOv3解读 [3]

YOLOv3没有太多的创新,主要是借鉴一些好的方案融合到YOLO里面。 不过效果还是不错的,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力。

YOLOv3的表现图如下所示:

YOLOv3表现图
YOLOv3表现图

新的主干网络:Darknet-53

在基本的图像特征提取方面,YOLO3采用了新的Darknet-53的网络结构,Darknet-53吸取了Resnet中的残差结构设计,并且结构中没有任何池化层和全连接层, 必要缩放或降维操作是通过改变卷积核的步长实现的。

什么是残差结构?

残差结构的核心思想是引入了一条从输入到输出的直接路径,使得网络能够学习残差函数,即输入与输出之间的差值。 通过这种方式,ResNet可以更容易地训练深层网络,避免梯度消失和表示能力下降的问题。

残差计算公式:

H(x)=F(x)+x

关于梯度求导原理可以参考这篇文章open in new window

卷积核的步长与图像面积、边长的关系

在卷积核中,如果设置步长stride=(2,2),就等于将边长缩小到原来的12、图像面积缩小到原来的14

在YOLOv2中,要经历5次缩小,会将特征图缩小到原输入尺寸的(12)5=132。输入为416×416,则输出为13×13(416/32=13)

多尺度的特征检测

YOLOv2曾采用passthrough层结构来检测细粒度特征,在YOLOv3进一步采用了多尺度检测策略,通过不同尺度(最后3层)的特征图, 加强YOLO算法对小目标检测的精确度。YOLOv3的结构图如下:

YOLOv3结构图
YOLOv3结构图

YOLOv3输出了三个不同尺度的特征图(红色区域),这个改进借鉴了FPN采用多尺度来对不同尺寸的目标进行检测,越精细的网格就可以检测出越精细的物体。

三个特征图的尺度分别为:13×1326×2652×52,这分别对应着预测大体积、中体积和小体积的目标。

随着输出的特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。 YOLOv2已经开始采用K-means聚类得到先验框的尺寸,YOLOv3延续了这种方法,并为每种尺度设定3种先验框,总共聚类出9种尺寸的先验框。

下表展示了特征图及三个先验框的尺度:

输出的特征图尺度缩放比例先验框1先验框2先验框3
13×1332116×90156×198373×326
26×261630×6162×4559×119
52×52810×1316×3033×23

采用多尺度特征检测后,模型会有多个输出特征,特征维度分别为:

13×13×(num_anchors×(5+num_classes))26×26×(num_anchors×(5+num_classes))52×52×(num_anchors×(5+num_classes))

在YOLOv3中 num_anchors=3num_classes 根据不同数据集有不同的值。

提示

YOLOv3 边界框的位置预测方式 offsets 延续了YOLOv2的做法。

一些小的改动

类别预测方面

YOLOv3将原来用于单标签多分类的softmax层换成用于多标签多分类的逻辑回归层。简单来说,预测对象类别时不使用softmax,改成使用二元交叉熵来进行类别预测。

损失函数

YOLOv3的损失函数,相比于YOLOv1中简单的总方误差,有一些针对多分类的损失计算调整,原先softmax分类任务改为二值交叉熵。

YOLOv3总结

YOLOv3已经是各界首选的检测算法之一,精度高、速度快、易扩展等,是一种高效实用的目标检测算法。

参考网文&论文

  1. YOLOv1论文要点总结open in new window
  2. YOLOv2原理与实现open in new window
  3. YOLOv2简介open in new window
  4. YOLOv3详解open in new window
  5. YOLOv3深入理解open in new window
  6. YoloV3核心思想open in new window

  1. You Only Look Once: Unified, Real-Time Object Detectionopen in new window ↩︎

  2. YOLO9000: Better, Faster, Strongeropen in new window ↩︎

  3. YOLOv3: An Incremental Improvementopen in new window ↩︎

上次编辑于: