Press "Enter" to skip to content

Object Detection-深入理解YOLO v1

论文链接

 

You Only Look Once: Unified, Real-Time Object Detection

 

https://arxiv.org/abs/1506.02640

 

1.Object Detection

 

Object Detection目标是,输入一张图片,输出图片中包含的所有对象以及每个对象的位置(包围该对象的矩形框)。

在YOLO之前,RCNN系列(RCNN/Fast RCNN/Faster RCNN)都是采用两阶段的处理模式,先提出候选区(Region Proposals),再识别候选区中的对象。YOLO创造性的将候选区(Region Proposals)选择和对象检测两个阶段合二为一,看一眼图片就可以知道对象是什幺以及它们的位置。

 

2.YOLO的实现方案

 

YOLO中没有了直接提取候选区(Region Proposal)的步骤,取而代之的是将图片划分成S x S 个网格(Grid Cell),论文中S = 7;每个Grid Cell负责预测Object中心点落在该Cell内的Object;每个Cell生成B个Bounding Box,论文中B=2。

图片来源【1】

没有候选区(Region Proposal)之后,YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。

粗略的说,YOLO的整个结构就是将大小为448*448*3的输入图片经过神经网络的变换得到一个大小为7*7*30的输出张量(Tensor),7*7是输入图片的划分网格数,30维向量包含的信息如下:

图片来源【1】

20个对象分类的概率

 

$P(C_1 | Object), P(C_2 | Object), …, P(C_{20} | Object)$,之所以是20是由于YOLO V1支持识别20种不同的对象(人、鸟、猫、汽车、椅子等)。

 

2个Bounding Box的位置

 

YOLO中使用(x, y, w, h)来表示一个Bounding Box,(x, y)表示BBox的中心,(w, h)表示BBox的宽高。

 

注意,(x,y) 是相对于 cell 左上角坐标的偏移量,并使用 cell 大小做归一化;(w,h) 是相对于整个图片的宽和高的比例;这样 (x,y,w,h) 的大小都在 [0,1]范围内。如下图:

图片来源【1】

2个bounding box的置信度

 

Bounding Box的置信度 = Bounding Box中存在对象的概率 * Bounding Box与对象实际Bounding Box的IOU。

 

$$\text{Confidence} = \text{Pr}(\text{Object}) * \text{IOU}_{\text{pred}}^{\text{truth}}$$

 

IOU是在训练阶段计算的,因为在Inference阶段并不知道真实对象在哪里,只能完全依赖于网络的输出,这时已经不需要也无法计算IOU了。

 

Bounding Box的置信度Confidence表示它是否包含对象且位置准确的程度。置信度高表示这里存在一个对象且位置比较准确;置信度低表示可能没有对象或者即便有对象也存在较大的位置偏差。

 

3. 损失函数

 

损失函数的设计是Yolo 算法的核心。

图片来源【1】

公式中:

 

$1_{ij}^{obj}$:i 表示第 i 个Grid Cell,j 表示第 j 个 bbox,obj 表示存在目标,即目标的中心点在 cell 中。它用于判断第i个Grid Cell的第j个bbox是否负责这个Object,与Object的Ground Truth BBox的IOU最大的bbox负责该Object。

 

$1_{i}^{obj}$:表示Grid Cell中存在Object。

 

$1_{ij}^{noobj}$:表示第i个Grid Cell的第j个bbox不负责任何Object。

图片来源【1】

类别损失:$1_{i}^{obj}$表示只有包含Object的Grid Cell才计入误差计算;

 

位置损失:$1_{ij}^{obj}$表示只有负责(IOU比较大)预测的那个Bounding Box的数据才会计入误差。同时为了解决Object大小不同导致的差异,对w和h进行了平方根处理。

 

置信度损失:$1_{ij}^{obj}$表示只有”负责”(IOU比较大)预测的那个bounding box的数据才会计入误差。不存在对象的bounding box应该输出尽量低的置信度。

 

4.YOLO训练

 

YOLO先把前20层卷积网络层+平均池化层(Average-pooling Layer)+全连接层(Fully Connected Layer)在ImageNet数据集上进行预训练。

 

YOLO的最后一层采用线性激活函数(Linear Activation Function),其它层都是Leaky ReLU。

 

$$

 

\phi(x) =

 

\begin{cases}

 

x, \text{x > 0} \\

 

0.1x, \text{otherwise}

 

\end{cases}

 

$$

 

除此之外,训练中还采用了Drop Out和数据增强(Data Augmentation)来防止过拟合(Overfit)。更多细节请参考原论文。

 

5. YOLO预测(inference)

 

训练好的YOLO网络,输入一张图片,输出一个7x7x30的张量(tensor)来表示图片中所有网格(Grid Cell)包含Object的概率以及该Object可能的2个Bounding Box位置和其置信度。为了从中提取出最有可能的Object和Bounding Box,YOLO采用NMS(Non-maximal suppression,非极大值抑制)算法。

 

NMS(非极大值抑制)

 

NMS算法的核心思想是:选择得分(Score)最高的作为输出,与该输出重叠比较大的Inference Objects去掉,不断重复这一过程直到所有Inference Objects处理完。

 

它的步骤如下:

 

1)根据置信度得分进行排序;YOLO的Score计算方法如下:

 

$\text{Score}_{ij} = P(C_i | \text{Object}) * \text{Confidence}_j$

 

设置一个阈值,过滤掉Score低于阈值的候选对象;

 

2)遍历每一类Object,找到该类内Score最大的Object及其Bounding Box,并添加到输出列表。

 

3)计算其它Object的Bounding Box与Score最大的Object的Bounding Box的IOU,根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉。

 

4)重复上述步骤,直至所有分类的Object都处理完毕。

 

最后输出列表中的就是YOLO检测出的Objects。

 

参考材料

 

1. https://www.cnblogs.com/yanshw/p/12294233.html

 

2. https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.p

 

3. https://blog.csdn.net/qq_30815237/article/details/91949543

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注