YOLO算法(论文部分翻译+一些总结)

论文题目是《You Only Look Once: Unified, Real-Time Object Detection》


前言

在之前的目标检测问题中,为了检测一个目标,要在一个测试图像上的不同位置和不同大小的边界框中使用该目标的分类器,判断边界框中是否有该目标,这种方法其实将目标检测当成一种分类问题。如DPM在一整个图像上使用一个均匀滑动的窗口,用分类器在每次滑动的窗口中判断是否有要检测的目标。在R-CNN中做出了一些改进,即用候选区域的方法生成最有可能包含目标的候选框,然后对这些候选框进行分类处理。本文将目标检测看成是回归问题,即输出的是分离的边界框以及每个边界框属于某个类的概率。在本文所使用的方法中,只使用一个单一的神经网络就可以从图像中预测边界框,以及边界框属于某个类的概率。

用YOLO处理图像非常简单,如下图:
在这里插入图片描述
首先,将输入图像的大小调整为448 × 448;
然后,用一个单一神经网络同时预测多个边界框和这些边界框属于每一类的概率;
最后,通过模型的置信度来threshold检测结果。

YOLO与传统的目标检测算法相比有几个优点
1. YOLO非常快。由于将目标检测视为回归问题,只要在测试时简单的在一个新图像上运行神经网络,就可以预测检测目标。在不经过批处理的情况下,基础网络可以在Titan X上到达每秒45帧的效率,而一个经过改进的版本甚至超过每秒150帧。这意味着在处理实时的影像时,延迟将低于25微秒。更重要的是,与其他实时检测系统相比,YOLO的mAP(mean average precision)是它们的两倍。
2.YOLO在预测时会根据图像进行全局推理。 与滑动窗口和候选区域不同,YOLO在训练和测试时“看到”了一整个图像,因此它可以对类别和其外观的上下文信息进行隐式编码。例如,如果要检测图像中的汽车,通常在汽车旁边的对象(如人、道路或其他汽车)可能会为目标检测提供有用的线索。在Fast R-CNN中,经常会将背景误认为是某个目标,这就是由于Fast R-CNN“看不到”整个图像的上下文信息。YOLO产生的背景错误比Fast R-CNN少一半。
3.YOLO学到的目标表示更具有泛化性。在一般自然的图像上训练后,在艺术作品上来测试,YOLO比DPM和R-CNN的表现都要好。当将YOLO应用于新领域或者输入一些乱七八糟的内容,YOLO也不会崩。

那么YOLO有什么缺点呢? YOLO与其他检测系统相比,在精度上略有不足。它虽然能在图像中快速地识别目标,但它对于一些目标的精确定位做的不是太好,尤其是一些比较小的目标。


YOLO的实现

将输入图像划分为S × S的网格,如果一个目标的中心点落入一个网格单元中,那么该网格单元负责检测该目标。每个网格单元要预测B个边界框(bounding box)以及每个边界框的置信度(confidence score),置信度包括两个方面,一是边界框包含目标的可能性大小,二是边界框的准确度。置信度被定义为:
在这里插入图片描述
第一项表示边界框中是否包含有目标,有为1,没有为0。第二项表示边界框与真实框(ground truth box)的IoU(intersection over union)。也就是说,当边界框中包含目标时,置信度就表示边界框与真实框的IoU。每个边界框包含5个值:x,y,w,h和置信度。(x,y)表示边界框的中心点相对于对应网格左上角位置的偏移值,w和h分别表示边界框相对于整个图像的宽和高。这样这四个值的大小应该在[0,1]区间内。
每个网格单元也要预测C个类别条件概率(conditional calss probabilities):
在这里插入图片描述
这些概率表示网格单元中的目标属于某一类的概率。对于每个网格单元来说,只预测一组类别(C个)的概率,无论有多少个边界框(B个)。
也就是说,置信度属于边界框,而类别条件概率属于网格单元

在测试时将类别条件概率与边界框的置信度相乘:
在这里插入图片描述
上式表示每个边界框特定于某个类的置信度。该置信度包含两个方面,一是边界框中的目标属于某类的可能性大小,二是边界框匹配目标的好坏。
在这里插入图片描述
上图说明了YOLO实现的大致流程,首先将图像划分为S×S个网格,每个网格单元包含B个边界框,而每个边界框包含x,y,w,h和置信度共5个值。对于每个网格单元,计算C个类别条件概率,最后完成检测。在这一过程中,最后的预测值为
S × S × (B ∗ 5 +C) 的张量。
论文在PASCAL VOC上进行实验,S=7,B=2,PASCAL VOC有20个类别标记,因此C=20。最后预测值为7 × 7 × 30的张量。


YOLO的网络结构设计

整个网络由24个卷积层和其后的两个全连接层组成,卷积层负责从图像中提取特征,全连接层预测输出的概率和坐标。该网络结构受到了GooLeNet模型的启发,但和它不同的是,YOLO没有用GooLeNet中的inception modules,而是使用了1×1的卷积层,后面跟着3×3的卷积层。整个网络结构如下图,可以看到交替的1×1卷积层减少了前一层的特征空间。最后输出的预测值为7 × 7 × 30的张量。
在这里插入图片描述
作者也训练了一个更快的Fast YOLO,它只有9个卷积层,并且每个卷积层中有更少的滤波器。除了网络大小不同,YOLO和Fast YOLO在训练和测试时的参数都是一样的。


训练过程

1.预训练

在所有训练和推断过程中使用的是Darknet框架。首先在ImageNet上进行预训练,ImageNet是一个由1000个类别的数据集。在预训练时,用了上图中的前20个卷积层,其后有一个平均池化层和一个全连接层,输入图像的分辨率为224 × 224。

2.检测

在预训练之后,要让模型开始执行检测功能。根据Ren等人的结论,在预训练网络中添加卷积层和全连接层可以提高性能,因此作者增加了四个卷积层和两个全连接层,它们都是以随机权重初始化的。由于检测时需要更加精细的图像,因此输入图像的分辨率为448 × 448,即是预训练时的两倍。
最后一层输出的是类别概率和边界框的坐标。用图像的宽度和高度对边界框的wh进行归一化,使它们在[0,1]区间内。将边界框的xy坐标参数化为特定网格单元位置的偏移值,因此它们也在[0,1]区间内。
最后一层用一个线性激活函数,所有的其它层使用如下的leakey ReLU激活函数
在这里插入图片描述

3.损失函数

因为论文将目标检测看成是回归问题,因此在训练时,对模型输出的平方和误差进行优化,也就是均方差损失函数。但是这种方法有一个不足之处——使用平方和误差会使定位误差和分类误差等同。并且有些图像的许多网格单元中不包含任何目标,这些网格单元的置信度将被置为0,会超过其他包含目标的网格单元的梯度。这会导致模型的不稳定以及训练的过早发散。
为了解决这个问题,要采用不同的权重值。对于定位误差,也就是边界框坐标预测误差,使用 λ c o o r d λ_{coord} =5。对于不包含目标的边界框的置信度误差,使用 λ n o o b j λ_{noobj} =0.5。
另外,平方和误差同等对待大小不同的边界框,但是一些小的偏差给较小边界框带来的影响要大于较大边界框,因此将边界框宽度与高度的的预测改为对其平方根的预测
YOLO会在每个网格单元中预测多个边界框,但在训练时,每个目标只用一个边界框来预测,因此选择与真实框有最大IoU的边界框来预测网格单元中的目标。这样做可以让边界框预测不同大小、不同长宽比、不同类别的目标,提高性能。
损失函数如下:
在这里插入图片描述
其中 1 i o b j 1_{i}^{obj} 表示网格单元i中是否有目标; 1 i j o b j 1_{ij}^{obj} 表示如果网格单元i中有目标,那么由第j个边界框预测该目标。
可以看到,只有当目标中心点落入网格单元中,才计算该目标的类别误差,也就是上式的最后一项;只有当网格单元i中的第j个边界框与目标的ground truth box的IoU最大时,即由第j个边界框负责预测该目标,才计算边界框的坐标误差,也就是上式的第一项和第二项。其中第一项是边界框中心点坐标的误差,第二项是边界框宽度与高度的误差。第三项是包含目标的边界框的置信度误差,第四项是不包含目标的边界框的置信度误差

下图来源于https://blog.csdn.net/shuiyixin/article/details/82533849
在这里插入图片描述

4.训练过程的一些细节

训练使用的有效数据集来自PASCAL VOC 2007和2012。训练大致经过135个轮次。在第一个轮次中,缓慢地将学习率从 1 0 3 10^{-3} 提升为 1 0 2 10^{-2} 。如果刚开始的学习率很高,那么梯度会不稳定,从而导致模型发散。然后继续以 1 0 2 10^{-2} 的学习率训练75个轮次,然后以 1 0 3 10^{-3} 的学习率训练30个轮次,最后以 1 0 4 10^{-4} 的学习率训练30个轮次。
为了避免过拟合,使用dropout和大范围数据增强的方法。对于dropout,在第一个全连接层之后用0.5的丢弃率避免层之间的相互影响。对于数据增强,对高达20%原始的图像进行引入随机缩放和平移;在HSV颜色空间中,还将图像的曝光和饱和度随机调整至1.5倍。
一些较大的目标,或者一些位于许多网格单元的交界处的目标,它的中心点可能会落入多个网格单元中,因此可能会有多个边界框预测该目标。在检测时可以用NMS(non-maximal suppression)来去除重复的边界框。具体来说就是,选择预测该目标的置信度最高的那个边界框,计算它与另一个边界框的IoU值,如果该值大于一定阈值,就剔除另一个边界框。对其余预测该目标的边界框重复此过程。


YOLO的局限性

1.当两个目标离得很近时检测效果很不好,因为每个网格单元只有两个边界框并且它们属于同一类。当有一组较小的目标聚集在一起时,检测效果也不是很好。
2.对于具有新的或不同寻常的宽高比或配置的对象的泛化能力较弱。
3.在一个较小边界框中的小误差对IoU带来的影响,比较大边界框中的小误差带来的影响要大得多,但损失函数同等对待这两种误差,因此定位误差是主要的误差来源。

发布了39 篇原创文章 · 获赞 1 · 访问量 1227

猜你喜欢

转载自blog.csdn.net/qq_30146937/article/details/104198561