文章目录
- 1、YOLOv1
- 1.1、概述
- 1.2、实现方案
- 1)整体思路
- 2)网络结构
- 3)损失函数
- 4)推理/预测过程
- 5)优缺点
- 2、YOLOv2
- 2.1、概述/改进整体思路
- 2.2、YOLOv2的改进点/tricks
- 1)Multi-Scale Training
- 2)High resolution classifier
- 3)backbone的改进
- 4)passthrough layer
- 5)Convolution with anchor boxes
- 6)Dimension Clusters
- 7)Direct location prediction
- 3、Yolov3
- 3.1、Backbone
- 3.2、损失函数
1、YOLOv1
1.1、概述
1、YOLOv1的核心思想就是:网络将整张图像作为输入,并直接在输出层回归得到bounding box的位置和类别,即one-stage的思想;
2、而Faster RCNN的思想:先通过RPN网络提取proposals,再通过两个分支进行bbox回归和bbox分类,即two-stage的思想;
1.2、实现方案
1)整体思路
由于是one-stage的思想,但是又需要去预测出bbox和对应类别,因此使用了划分为S
×
\times
×S个网格grid的方式,每个grid负责预测B个bounding box,还要预测B个对应的置信度分数confidence,以及每个grid对应的C个类别概率。因此每个网格预测得到的向量维度为4
×
\times
×B+B+C,最终得到的预测特征图应该为S
×
\times
×S
×
\times
×(5B+C)。
-
B个bounding box(使用[x, y, w, h]四个值表示即可):需要注意的是,[x, y, w, h]需要归一化到0-1之间,坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。例如,输入图像的宽和高为width和height,该网格grid cell的坐标为(x0, y0),则预测出的bbox的坐标应进行如下归一化:
-
confidence可以用来表示grid cell / 预测出的bbox是否含有object,以及预测的object有多准确两个信息,Pr(object)表示的是grid cell是否包含object,如果包含为1,否则为0。因此,如果包含object,confidence的值就是预测的bbox和GT之间的IoU值
-
注意预测的C个类别信息是针对每个grid cell的,而confidence信息是针对每个bounding box的。
2)网络结构
-
网络包含24个卷积层和2个全连接层,YOLOv1的最后一层采用了线性激活函数 ϕ ( x ) \phi(x) ϕ(x),其它层采用了Leaky ReLU。两个全连接层:第一个全连接层将输入特征图展平,输出通道数为4096;第二个全连接层输入通道数4096,输出通道数为7 × \times × 7 × \times × 30=1470。
-
网络的输入为448 × \times × 448(注意:由于该网络中全连接层已经固定,因此输入只能为448 × \times × 448)。
3)损失函数
损失函数由三部分组成:位置损失、置信度损失、分类损失,都采用sum-squared error计算
- 位置损失/坐标预测损失
a)预测出的bbox由四个值就可以表示:(x, y, w, h),于是我们可以通过计算预测值与GT之间的误差平方和作为损失函数。
b)但是需要注意的是,不是所有的bbox都要参与loss的计算,只有第i个网格内包含object且该网格中预测的B个bbox中与GT bbox具有最大的IoU的第j个bbox才会参与loss的计算。则其余的bbox不参与loss的计算。损失函数中
1
i
j
o
b
j
1_{ij}^{obj}
1ijobj就表示这个意思。
c)对不同大小的bbox预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。因此损失函数中的w和h的两项采用了
w
\sqrt{w}
w和
h
\sqrt{h}
h来计算。可以看出,同样的偏移,小bbox对应的损失会更大,会使网络更关注于小bbox。
- 置信度损失
a)首先对于所有的grid cell的所有bbox都要计算预测的confidence与GT之间的损失
b)对于包含object的grid cell来说,置信度分数的ground truth为
C
i
=
1
×
I
O
U
p
r
e
d
t
r
u
t
h
C_i = 1 \times {IOU}_{pred}^{truth}
Ci=1×IOUpredtruth ,也就是说由于预测出的bbox是变化的,所以训练过程中GT是需要不断地进行计算的
c)对于没有object的grid cell来说,置信度分数
C
i
=
0
C_i=0
Ci=0,也需要进行损失函数的计算
- 分类损失
分类损失是只针对包含object的grid cell进行计算,因此GT值就是该object的类别
4)推理/预测过程
推理和预测过程中,输入图像得到预测结果,进行后处理:
- 首先计算每个bbox的class specific confidence score:预测得到的类别概率与每个bbox对应的confidence相乘
- 然后设置阈值,过滤掉低于阈值的bbox,再对其余的bbox进行排序,并进行NMS,得到最终的bbox
- NMS:非极大值抑制,主要用于去除重叠的bbox,主要过程如下:
对于C个类别中的每个类别,进行如下操作:
a)计算该类别的每个bbox的class specific confidence score,低于设定的阈值的bbox,将其score设为0,即删除掉该bbox
b)对其余的bbox进行score的排序,从高到低选择bbox,进行如下操作:首先将该bbox添加到输出列表;然后遍历其余bbox(score为非0且不在输出列表的)并计算二者之间的IoU值;最后,根据IoU阈值,高于阈值的bbox的score设为0
c)执行b操作直到所有的bbox要么在输出列表,要么score为0时,该类别的NMS结束
遍历完C个类别,NMS最终的结果就是输出列表中的bbox
5)优缺点
优点:
- pipeline简单且快速
缺点:
- 预测/推理阶段的输入图像的分辨率受限制:由于全连接层固定,因此在检测时,YOLO训练模型只支持与训练图像相同分辨率的输入图片。
- 群体检测困难:每个grid cell预测的B个bbox中,最终只选择IoU最大的一个bbox作为输出,即每个grid最多只预测出一个object。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
- 小目标检测困难 :损失函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。
2、YOLOv2
2.1、概述/改进整体思路
- 分析YOLOv1显示,YOLOv1出现了大量定位错误,而且召回率相对较低
- 因此,YOLOv2主要关注的是在保持分类精度的同时,提高召回率和定位准确度。此外,还希望保持快速的检测速度
- 于是,YOLOv2并没有扩大网络,而是提出了许多tricks来改进网络,提高性能
2.2、YOLOv2的改进点/tricks
1)Multi-Scale Training
- 引入多尺度训练的目的:可以使网络适应不同尺寸的输入图像
- 实现过程:模型每训练一定的epoch,改变输入图像的尺寸,以使模型可以对不同输入尺寸的图像更鲁棒,提高模型在不同尺寸图像上的泛化性能
- 论文中使用的尺寸是以32为倍数,包括320、352、384、416、448、480、512、544、576、608这10种尺寸。
- 需要注意的是,YOLOv2可以引入多尺度输入的前提是:对backbone和head都做了网络结构的调整,移除了全连接层(参数量太大,容易过拟合,训练慢),因此可以输入不同分辨率的图像。
2)High resolution classifier
- 简单来说,就是YOLOv1采用了在ImageNet上预训练的模型,但是其输入是224 × \times × 224,是很小的,而YOLO系列模型的输入是448 × \times × 448,不一致的分辨率输入可能会有一些影响。
- 因此,在224 × \times × 224的输入图像上预训练以后,再采用448 × \times × 448的高分辨率图像做一些微调,最后再作为YOLO的backbone,这样可以使网络适应448 × \times × 448的高分辨率输入,缓解输入分辨率不一致造成的影响
3)backbone的改进
- YOLOv1的backbone采用的是GoogleNet,YOLOv2新引入了Darknet19,包含19个卷积层和5个max pooling层,因此计算量比YOLOv1要更少。
- 此外,需要注意的是:与YOLOv1(类别的预测是针对每个grid cell)不同,最后预测出的结果中,类别的预测是针对每个bbox的(主要是因为YOLOv2采用了anchor box的方式),例如416 × \times × 416的输入,经过32的下采样(5个max pooling)以后,得到的特征图为13 × \times × 13,因此预测出B个bbox,C个类别,最后的维度应为13 × \times × 13 × \times × [(5 + C) × \times × B]
- 以下网络为用于分类的网络,在检测时,YOLOv2对网络结构做了微调:移除最后一个卷积层、global avgpooling层和softmax;移除后增加了3个3x3x1024的卷积层和一个passthrough layer;增加一个1×1个卷积层作为网络输出层。输出的channel数为(5 + C)
×
\times
× B
- 此外,在每个卷积层后面增加了BN层(Batch Normalization),回顾BN层:
BN层的作用:在训练过程中,网络每层输入的分布一直在改变, 会使训练难度加大,对网络的每一层的输入(每个卷积层后)都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会更快。
4)passthrough layer
- YOLOv1的其中一个缺点就是小目标检测较差,于是YOLOv2从另一个方面改进了这一点:将最后一个maxpooling层的输入特征图划分为四部分,再与maxpooling层之后的特征图连接到一起(沿通道维度)
- 例如:416
×
\times
× 416的输入,经过5个max pooling层之后的输出为13
×
\times
× 13,那对于一些小目标来说,其特征有可能是不充足的,因此将26
×
\times
× 26的特征图通过passthrough layer保留一部分细节信息。
- 需要注意的是,划分的过程不是直接一分为四,而是需要按对应位置进行选择,例如下面4
×
\times
× 4的特征图划分为四个2
×
\times
× 2的特征图
5)Convolution with anchor boxes
- YOLOv1在预测bbox时,是直接回归出(x, y, w, h)的,x和y是相对于grid cell做归一化,w和h是相对于整个图像做归一化。但是,由于各个图片中存在不同尺度和长宽比的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的(学习比较困难可能是由于没有先验),这也导致YOLOv1在精确定位方面表现较差。
- 基于此,YOLOv2采用了anchor box作为先验,预测(x, y, w, h)的偏移量的方式
- 另外,论文中采用的输入为416 × \times × 416,是因为最终输出的特征图为13 × \times × 13,这样做的原因:特征图中有奇数个位置,所以只有一个中心单元格。物体往往占据图像的中心,所以最好在中心有一个单独的位置来预测这些物体,而不是在附近的四个位置。
6)Dimension Clusters
- 使用anchor box作为先验,存在的第一个问题:anchor box的尺寸和长宽比是手动预先设定的,对于具体的数据和任务来说,不一定是最优的。
- 因此,YOLOv2提出了Dimension Clusters,对训练集上的bbox做k-means聚类,以找到K个更好的先验anchor box。有了更好的先验anchor box,可以使网络更容易预测到更好的结果
- 回顾k-means聚类算法:
1.选择K个样本作为初始聚类中心
2.对于数据集中每个样本,计算它到K个聚类中心的距离,并将其分到距离最小的聚类中心所对应的簇中
3.对于K个聚类后的簇,重新计算它的聚类中心
4.重复上面的步骤2和3,直到达到某个终止条件(迭代次数、最小误差变化)
- 使用k-means聚类,其距离度量不采用欧氏距离,我们主要想获得先验anchor与GT是要有最大的IoU,因此采用如下距离度量:
d(box, centroid) = 1 − IOU(box, centroid)(box:其他框, centroid:聚类中心框)
- YOLOv2给出的聚类分析结果如下图所示,最终在model复杂性(K越大,anchor越多,模型复杂度也就越大)与high recall之间权衡之后,选择聚类分类数K=5。
7)Direct location prediction
- 使用anchor box作为先验,预测box的位置时,会存在第二个问题:模型的不稳定性,特别是在早期迭代期间。大多数不稳定性来自于对边框(x, y)位置的预测。
- 原因可能是:如果采用预测相对于anchor box的偏移,那么在随机初始化的情况下,模型需要很长时间才能稳定到预测合理的偏移量。
- YOLOv2采用的计算方式:grid cell相对于图像左上角的偏移量是cx,cy。anchor box的宽度和高度分别是pw和ph,对于每个grid cell预测的B个bbox中,每个bbox预测5个值(tx, ty, tw, th, to),表示预测出的bbox相对于grid cell左上角的相对偏移值(使用sigmoid函数 σ(⋅)将值约束在 [0,1] 之间,这使得模型训练更稳定)。
- 则预测的边界框相对于特征图的中心坐标(bx,by)和宽高(bw、bh)为
3、Yolov3
- Yolov3的改变主要是在Backbone和损失函数上
3.1、Backbone
- Yolov3的Backbone主要是采用了DarkNet53和多尺度特征融合的思想。
- 网络结构如下:
- Yolov3采用了DarkNet53的前52层,去除掉了全连接层和softmax层(损失函数中修改为了sigmoid,也就是说一个bbox不一定为一个类别,如果使用softmax层,概率和为1,类别之间互斥;使用sigmoid激活函数,类别之间互不影响)
- 检测分支共有三个:分别在32倍、16倍、8倍下采样率的情况下进行检测,同时16倍和8倍下采样率的分支中进行了上采样并concat的操作以获取多尺度的信息。图中检测的三个分支的尺寸之比为1:2:4(13:26:52),通道数都是255,按照coco的80个类别,是这样计算的:(80+5) × \times × 3 = 255
- Yolov3和v2一样都采用了kmenas聚类的方式计算得到了三个尺度下的anchor bbox的尺寸为:
- 32倍降采样的感受野最大,适合检测大的目标,所以在输入为416×416时,每个cell的三个anchor box为(116 ,90); (156 ,198); (373 ,326)。16倍适合一般大小的物体,anchor box为(30,61); (62,45); (59,119)。8倍的感受野最小,适合检测小目标,因此anchor box为(10,13); (16,30); (33,23)。所以当输入为416×416时,实际总共有(52×52+26×26+13×13)×3=10647个anchor box。
3.2、损失函数
- Yolov3是将v1和v2使用的预测类别的softmax层更改为了sigmoid激活函数,并使用了交叉熵损失函数预测。
- Yolov3将softmax变为sigmoid是基于这样一个事实:一个bbox内可能不止有一个类别。而softmax和sigmoid之间应用于多分类又有这样的区别:
softmax:1)用于单标签的多分类问题,即从多个分类中选取一个正确答案。 Softmax 综合了所有输出值的归一化,因此得到的是不同概率之间的相互关联 。2)各类别概率之和为1 ,也就是说我们加大某一类别的概率必然导致其他类别减小——各类别之间相互关联,是互斥的。
sigmoid:1)用于多标签的多分类问题,可以选取多个标签作为正确答案,它是将任意实数值归一化映射到[0-1]之间,2)各类别概率之和则不一定为1 ,各个输出值依次独立的经过激活函数的映射,某一个类别概率增大可能也伴随另一个类别概率增大——各类别之间相互独立,不互斥。
例如:
多标签问题:一部电影即是剧情片又是爱情片,各类别之间不互斥——sigmoid;
多分类问题:一个动物图谱只能是一类动物,各类别之间互斥——softmax;
- 因此,Yolov3将用于单标签分类的Softmax分类器改成多个独立的用于多标签分类的Logistic分类器(sigmoid),取消了类别之间的互斥,可以使网络更加灵活。
- 因此损失函数做了一些修改,置信度分数和分类损失都为交叉熵损失,并在坐标损失中乘以
(
2
−
b
w
b
h
)
(2-b_wb_h)
(2−bwbh),使得小目标的权重大,大目标的权重小。如下:
参考链接:
YOLO学习笔记——第一篇YOLOv1
【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)
YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5、YOLOv6、YOLOv7