深度学习之物体检测——YOLO(一)_介绍

时间:2024-04-03 13:42:48

##YOLO网络结构

YOLO把检测问题看成是端到端的回归问题。把输入图片划分成一个个的小格子,让物体中心点所在的格子负责检测到该物体。
YOLO采用的是GoogLeNet结构,但是用1*1和3*3的卷积层来替代GoogLeNet的inception层。网络结构如下:

深度学习之物体检测——YOLO(一)_介绍

每个卷积层后面都会跟着leaky ReLu非线性层。第一个全连接层后面也跟着leaky ReLU非线性层。对于一张图片,输出的维度是7*7*30(YOLO为每个格子为每个格子预测一个概率分布,并且预测2个box以及每个box的置信度):

深度学习之物体检测——YOLO(一)_介绍

输出的box是(x_center, y_center, width, height),x_center和y_center是相对于格子的位移并且用格子的长宽进行归一化,width和height用448进行归一化,所以这四个值的范围是[0,1]。

训练

卷积层预训练

取YOLO的前20个卷积层,然后加上一个平均池化层和一个全连接层,在ImageNet 1000-class数据上进行训练。作者讲他训练了大约一周的时间。

损失函数

YOLO会为每个格子预测多个box,但我们希望训练时只有一个box为每个物体负责。责任box是和物体的真实box的IOU最大的box。
训练误差包含下面三种误差:

  • 坐标误差:表示对物体负责的格子中的责任box和真实box标记之间的误差

  • 置信度误差:表示每个预测box的置信度和真实置信度之间的误差。
    目标置信度的表达式如下:

    C^=Pr(Object)IOUtruthpred={0boxboxIOUtruthpredboxbox(1)

置信度不仅给出预测的box是否包含物体的信息,而且还给出了预测的box的准确度。作者在文中提到大多数的格子中是不包含物体的,这些格子中的box置信度应该向0趋近,这个目标带来的梯度有可能会比包含物体的格子带来的梯度更大。所以在损失函数中增加box的坐标预测损失,减少不包含物体的box的置信度预测损失,即在公式(2)中引入的系数λcoord=5λnoobj=0.5

  • 类别误差:表示为责任格子预测的类别概率分布和真实的概率分布之间的误差

误差表达式

λcoordi=0S2j=0B1objij[(xix^i)2+(yiy^i)2+(wiw^i)2+(hih^i)2]+i=0S2j=0B1objij(CiC^i)2+λnoobji=0S2j=0B1noobjij(CiC^i)2+i=0S21objicclasses(pi(c)p^i(c))2(2)

1obji表示是否为责任格子;1objij表示是否为责任格子中的责任box;1noobjij表示其他box。

注意:宽和高的预测误差采用的是平方根之间的误差,这是因为大box和小的box误差权重是不一样的,小box上的些微变动应该比大box上的些微变动更重要。但是预测box的宽和高的平方根并没有完全解决这个问题。

测试

现在给定一张图片和训练好的YOLO网络,通过以下步骤来检测图片中的物体:

  • 首先通过网络的一次前向过程得到输出
  • 然后通过判断每个预测box的最大类别置信度是否超过指定的阈值,如果没有的话则舍弃该box:
    每个box的类别置信度是用预测的类别概率和置信度相乘得到。类别置信度给出了该类别出现在box中的概率以及预测的box的准确度。
  • 利用non-maximal supression过滤剩下的box

现在剩下的box就是YOLO最终检测的结果,其最大类别置信度对应的类别就是物体所属分类。

YOLO的优点和缺点

优点

  • 速度快:在Titan X GPU上可以达到45fps,YOLO的快速版本可以达到150fps。

缺点

  • YOLO只能处理一个格子中至多有一个物体的情况:这是因为由于每个格子只会给出一个概率分布预测,而且选择的是概率最大的那个类别。

参考

[1] YOLO. Joseph Redmon, Santosh Divvala, Ross Girshick , Ali Farhadi. CVPR 2016.