本文主要依据YOLO1论文翻译而来,论文可阅读自cvpr2016:
https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Redmon_You_Only_Look_CVPR_2016_paper.pdf
摘要
-将目标检测作为回归问题,得到边界框位置和类别置信度
-实现端到端的优化
-检测速度快,基础的YOLO检测帧率为45
-检测效果比DPM和R-CNN好
引言
-
人类的视觉系统能够快速有效地处理复杂的视觉任务,实时的目标检测的必要性
-
之前的检测系统,如DPM,产生滑框,然后分类器判别
-
R-CNN产生大量的候选区域,然后分类器判别,整个过程复杂性高,难以优化(每个单独的模块需分开训练)
-
YOLO直接利用图像像素点回归出边界框坐标和类别概率值(only look once),整体架构如图1所示
-
YOLO1的优点:
1, 非常快(extremely fast):Titan X GPU,45 帧每秒
2, 预测的时候使用全局推断,丰富的上下文信息,背景错误比Fast R-CNN少一半
3, 学习到的目标特征泛华能力强
YOLO的网络架构设计、训练、推断和局限性
-
统一检测(unified detection)
如图2所示,YOLO1模型描述如下:
1, 将输入图片划分为 S × S S\times S S×S个网格。如果目标的中心落在网格中,该网格负责检测这个目标;
2, 每个网格预测 B B B个边界框及其置信度得分。这些置信度得分反映了预测框是否包含目标以及准确性,形式上定义为: P r ( o b j e c t ) ∗ I O U p r e d t r u t h Pr(object)*IOU_{pred}^{truth} Pr(object)∗IOUpredtruth。如果网格中没有目标,则置信度得分为0,反之,我们希望置信度得分等于IOU值;
3, 每个边界框包含5个预测值: x , y , w , h x, y, w, h x,y,w,h和置信度;
4, 每个网格还预测出 C C C个条件类别概率值: P r ( C l a s s i ∣ O b j e c t ) Pr(Class_{i}|Object) Pr(Classi∣Object)。当网格包含目标时计算,无论 B B B值多少,每个网格只预测一组类别概率值;
5, 在测试阶段,将条件类别概率值与单个预测框置信度得分相乘,即:
P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C l a s s i ) ∗ I O U p r e d t r u t h Pr(Class_{i}|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_{i})*IOU_{pred}^{truth} Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
得到每个预测框的特定类别的置信度得分。这些得分编码了预测框中该类出现的概率以及预测框拟合目标的程度;
6, 在PASCAL VOC中,参数设置为 S = 7 , B = 2 S=7,B=2 S=7,B=2。最后的预测为 7 ∗ 7 ∗ ( 2 ∗ 5 + 20 ) 7*7*(2*5+20) 7∗7∗(2∗5+20)的张量。 -
网络设计
1,来源于GoogleNet,含有24个卷积层和2个全连接层,不同于Inception模块,使用 1 × 1 1\times 1 1×1和 3 × 3 3\times3 3×3卷积代替;网络如图3所示;
2,Fast YOLO使用了较少的卷积层(9个卷积层)和卷积核数目;
3,网络的输出为 7 ∗ 7 ∗ 30 7*7*30 7∗7∗30的张量。
-
训练过程
1,在ImageNet数据集上预训练,使用20个卷积层和1个全连接层的网络;
2,转换模型到检测任务中,增加卷积层和全连接层,输入图像大小为 448 × 448 448\times448 448×448;
3,最后一层预测类别概率值和边界框坐标;
4,使用平方和误差(sum-squared error)优化训练目标,位置误差和分类误差权重一样,存在不足。而且,许多网格不存在任何目标,导致置信度得分为0,超过了包含目标的网格的梯度,使模型训练不稳定。为了修正这些问题,引入了误差权重系数,即: λ c o o r d = 5 \lambda_{coord}=5 λcoord=5、 λ n o o b j = 0.5 \lambda_{noobj}=0.5 λnoobj=0.5;
5,平方和误差在大的和小的预测框中权重一样,其实小的预测框偏差更重要些,因此,我们预测边界框高度和宽度的平方根值;
6,YOLO1在每个网格中预测多个边界框,在训练阶段,我们只想要一个边界框负责每个目标。哪个预测框和真实值有最高的IOU值,分配其负责预测目标。这导致预测的边界框之间的特定性,每个预测框在预测特定大小,长宽比或者特定类别的目标时变得更好,提高了综合的召回率。
7,训练阶段的多部分损失函数(multi-part loss function)为:
其中, 1 i o b j 1_{i}^{obj} 1iobj表示网格 i i i中是否有目标, 1 i j o b j 1_{ij}^{obj} 1ijobj表示网格 i i i中第 j j j个边界框对该预测“负责”(responsible);
损失函数只惩罚网格中出现目标的分类误差;
损失函数只惩罚“负责”的预测框的坐标误差。
8,训练学习率及迭代次数设置:前75次,0.01,再30次为0.001,最后30次为0.0001;
9,避免过拟合:DropOut和数据增强。 -
推断过程
网格设计在边界框预测中增加了空间多样性。通常,一个目标落入一个网格只预测一个框,但是,一些大的目标或者在边界附近的目标会被多个网格预测,此时引入极大值抑制可以修复这些多个检测边界框。 -
YOLO1的局限性
1,空间局限性:一个网格只能预测2个边界框和一个类别,小目标检测效果差;
2,模型从数据预测边界框,具有新的或者不同寻常的长宽比的目标时,网络泛化能力值得考虑;
3,模型采用了下采样层,最后一层特征粗糙(coarse features);
4,损失函数将大目标和小目标的边界误差同等对待,其实小目标的误差影响更大,我们的主要错误就是不正确的边界框定位。