You Only Look Once: Unified, Real-Time Object Detection 论文阅读

本文仅是对论文的解读,供个人学习使用,如果有侵权的地方,还请联系我删除博文

一、简述

Yolo方法是一种目标检测的方法。整个算法的框架其实是一个回归的过程。现在简单介绍一个下这个算法的运转流程。建立网络模型,输入图像,然后其输出结果记录了图像中的Bounding Box(后文简称bbox)和相关类别的概率,与真实结果进行误差比对,进而优化网络参数。具体的实现细节会在后文中给出。

二、Yolo模型的优势

  1. Yolo模型只需要扫描一遍图像(相当于在图像上运行一次Yolo)就能预测出现目标的位置。这带来了很高的时间效益。论文中也给出了Yolo运行时间的实验结果。这些结果记录在:http://pjreddie.com/yolo/
  2. 由于Fast-RNN是基于sliding window和region proposal的技术。但Yolo算法在训练初期和测试时看到的都是整个图像,一种很直观地感受就是Fast-RNN相对于Yolo更容易把背景块误当成检测目标。
  3. Yolo具有很高的泛化能力,可以应用于很多新的领域

 

三、统一检测

首先,将输入的图像分成 S \times S 的网格,如果一个目标的中心落入一个网格单元,那么这个单元就负责检测这个目标。

每个网格单元预测B个bbox 和 confidence score,这里的confidence score表示该单元对包含这个物体的置信度。

confidence \ score=Pr(Object) \times IOU^{truth}_{pred}

很显然的是,如果不包含某个目标,即Pr(object)=0,那这个目标对应的confidence score为0。如果不为0,则confidence score也就等于真实的bbox与预测的bbox的IOU值:

设真实的bbox面积为S1,预测的为S2,这里的IOU定义如下:

IOU=\frac{S1\cap S2}{S1\cup S2}

对于每个bbox,其包含了5种预测,简单书写成如下的形式方便理解:

\tilde{y}=\begin{bmatrix} x\\ y\\ w\\ h\\ p\\ \end{bmatrix}

其中x,y分别表示了bbox的中心相对于网格单元框的位置,可以简单的把网格单元框左上角的点当成(0,0),右下角的点当作(1,1),这样就能求得相对位置,x,y都是小于等于1的。

w,h表示了bbox的长和宽,这是相对于整张图片的比例,因为这个框可以超过网格单元的限制。p表示了IOU

每个网格单元还预测C个条件类别概率,而不管bbox数量B是多少个。

实际测试过程中,把每个网格单元预测出的类别概率与对应的bbox的confidence score也就是IOU进行相乘即:

Pr(Classi|Object) \times Pr(Object) \times IOU^{truth}_{pred}=Pr(Classi) \times IOU^{truth}_{pred}

这就得到了每个bbox具体类别的confidence score,这个式子的最前面是网格预测类别的概率,后面两项是每个bbox的IOU,二者结合反映了bbox是否含有目标对象和bbox预测的精准度。

论文中给出事例,将图像分成S×S的网格,并且每个网格单元预测B个边界框,这些边界框的置信度以及C个类别概率。这些预测被编码为S×S×(B×5+C)的张量

四、网络设计

Figure 3

Yolo的网络架构受GoogleNet图像分类模型启发,使用1×1卷积层降低特征空间,后面是3×3,但并没有使用Inception模块。另外还有一个快速版本的YOLO,这个网络规模较之前的24层,仅有9层网络。并且两个版本的训练测试参数都是相同的。

五、训练

预训练阶段,使用图3中的前20个卷积层,接着是平均池化层和全连接层。在ImageNet 2012验证集上获得了单一裁剪图像88%的top-5准确率。

检测过程中,又添加了四个卷积层和两个全连接层

为了能更精细化检测结果,将输入图像分辨率由224×224提升到448×448

最后一层使用线性激活函数,其他层使用Leaky Relu作为激活函数

所有预测结果归一到0~1

为了防止过拟合,第一个全连接层后面接了一个keep_prob=0.5的Dropout层

对原始图像做数据提升(翻转,缩放,高斯噪声等)

论文中在Pascal VOC2012上的训练过程中,使用了每个批次64大小,Adam优化算法,这里的Adam的动量参数为0.9,0.0005的衰减。对于学习率,在第一个epochs,将学习率从0.001提升到0.01,以0.01的学习率训练75个epochs,最后以0.001学习率训练30个epochs,最后用0.0001学习率训练30个epochs

对于数据增强,引入高达原始图像20%大小的随机缩放和转换。我们还在HSV色彩空间中使用高达1.5的因子来随机调整图像的曝光和饱和度。

六、损失函数

模型使用的损失函数如下图所示:

关于损失函数的选择,简单的想法是使用MSE损失函数,但这并不能达到最大化平均精度的目标,分类误差与定位误差同等重要,这可能带来不好的影响。

因此定义了如上图所示的损失函数,整个函数分成五个部分。

  • 1_{ij}^{obj}表示网格单元 i 中第 j 个bbox,通过赋予较大的权重\lambda_{coord},增加网络对这部分优化的侧重点,论文中提供的值是5
  • 对不同大小的bbox的预测,由之前IOU的定义,相对较小的bbox对IOU的影响更大,而较大的bbox影响较小。通过取平方根,进而减小这种差异
  • 这部分是对含有检测对象的网格单元的预测
  • 1_{ij}^{noobj}表示网格单元不含有检测对象,这里赋予较小的权重。因为训练初期的时候,很多网格单元并不包含任何对象,那么优化不包含任何对象的单元网格所带来的梯度效益将远大于包含对象的,这样的网络可能不稳定甚至发散。论文提供的值是0.5
  • 第一第二部分是对bbox的优化,第三第四部分是对网格单元的优化,那么最后一个部分就是对类别损失的优化。

七、非极大值抑制

YOLO算法中,可能会出现多个网格都检测出到同一目标的情况。论文中使用了NMS的算法,简述一下算法原理:

  • 对最后输出的网格单元的向量(参照上面提到的向量结构),设定阈值,过滤掉那些类别概率P低于阈值的,这样仍会有多个向量仍存在高概率。
  • 将这些向量按P进行排序,对P值最大的bbox,计算其他所有的bbox的与它的IOU,如果IOU超过给定的IOU,则直接删除这个bbox。
  • 对剩下的bbox再进行步骤2过程。直到剩余的bbox为空

八、Yolo的缺点

  1. 容易产生定位错误
  2. 对小物体的检测效果不好(一个网格单元就两个bbox)
  3. 与其他的目标检测系统相比例如faster-RNN,精度要低

猜你喜欢

转载自blog.csdn.net/adorkable_thief/article/details/84978025
今日推荐