基本思路

YOLO(You Only Look Once)是一种目标检测系统,其特点是将物品识别和物品分类融合,使用一个深度学习模型直接计算出物体的位置和类型。基本思路如下所示:

首先图片被分为$S \times S$个框,如最左边的图所示。对于每个框,若一个物体的中心落在该框中,则这个框负责该物体的类型和位置预测。对于每个框,需要计算以下数据:

  • B个Bounding boxes的数据,共$B \times 5$个。每个框对应5个数据,分别是:
    • x:物体中心x的位置
    • y:物体中心y的位置
    • w:物体水平长度
    • h:物品垂直长度
    • conf:物品置信度,即有多大的概率这个框包含了物体,定义$conf =P(object) \times IOU_{pred}^{truth}$,即该指标同时考虑物品的存在可能性和对应Bounding boxes与真实物体重叠的面积。
  • 所属类别:共C个,分别对应物品的种类,用于标记这个框的属于哪一个物体。

在VOC数据集中,共有20类物品,即C=20。取S = 7,B = 2,因此最后数据共$7 \times 7 \times (20 + 5 \times 2) = 7 \times 7 \times 30$个,表示为维度为[7,7,30]。

网络设计

网络结构的设计如下:

网络的设计取材与GoogLeNet,其中将Inception结构简单的换成了1x1卷积和3x3卷积的串联。同时需要注意的是激活函数使用的leaky常数为0.1的leaky relu函数。

除此之外,上文所提到的x,y,w,h参数均被归一化——中心位置x,y使用框的尺寸归一化,w,h使用图片尺寸归一化。如此操作后,x,y,w,h均归一化到0~1。

训练与预测

预训练

该模型首先在ImageNet进行了预训练,Top-5准确率达到88%。训练开始前保留前20层卷积的参数。

正式训练

训练的代价函数分为五个部分,如下所示:

其中,$l{i}^{obj}$用于标记是否有物体出现在i框中,若有为1,否则为0;$l{ij}^{obj}$用于标记是否有物体出现框i中的第j个Bounding box中,若有为1,否则为0。由于一个框会产生多个Bounding Box,这里取与真实区域IOU最高的Bounding Box负责该物体的预测。$\lambda{noobj}$和$\lambda{coord}$为格点包括物体和不包括物体的两种情况区分对考虑,有$\lambda{noobj} = 0.5$和$\lambda{coord} = 5$。

$Loss{xy}$和$Loss{wh}$是针对物品位置的代价项,$Loss{obj}$和$Loss{noobj}$是针对物品存在置信度的代价项。$Lossc$则是针对物品类别的代价项。假设一个网络输出了一个[7x7x(20+2X5)]的输出向量。假设仅在位于$a,b$的网格中有一个物体。则$l{i=a \times b}^{obj} = 1,l{i \neq a \times b}^{obj} = 0$,则有$Loss_c = \sum\limits{c \in classes}(p{a \times b}(c) - p’{a \times b}(c))^2$。对于该网格,有B个Bounding Box,假如标号为k的Bounding Box与该物体的IOU最高,则$l^{obj}{i = a \times b,j = k} = 1,l^{obj}{i \neq a \times b,j \neq k} = 0$,即计算Loss时仅考虑k号Bounding Box的损失,k号Bounding Box被指定负责该物品的检测。

测试

测试时,每测试一张图片,都会获得$S \times S \times B$个Bounding Box,根据个人理解,每个格点有唯一的归属,因此可以对每个格点的B个Bounding Box取置信度最高的一个,即有$S \times S$个Bounding Box。在这些Bounding Box中,可以设置一个阈值,筛去置信度低的格点。对于最后的格点,进行非最大值抑制:即对IOU超过一定阈值且属于同一类的Bounding Box比较置信度,选择置信度最高的Bounding Box。