实时目标检测:YOLO、YOLOv2以及YOLOv3
本文翻译自:Real-time Object Detection with YOLO, YOLOv2 and now YOLOv3
You only look once(YOLO)是一系列用于解决实时目标检测问题的算法。在本文中,将依次介绍YOLO、YOLOv2以及YOLOv3。在YOLO的官方网站上,作者提供了一些目标检测算法的性能和速度的对比,如下图所示。
从上图中可以看出,YOLOv3在性能、速度的平衡上超过了其他的目标检测算法。
在本文中,将以下述图片为例进行算法的讲解。
使用YOLO进行检测得到的结果:
YOLOv1
Grid Cell
在YOLOv1版本中,将待检测图片划分为$S\times S$大小的grid。每一个grid只负责预测一个目标。例如,在下图中,preson(蓝色边框)的中心落在了黄色grid内,因而黄色grid负责对person进行预测。
每一个grid cell预测固定数目的边界框。在下述例子中,黄色grid cell使用两个边界框(蓝色框)来定位人的位置。
但是,一个框只能预测一个目标的设定限制了所能预测的目标之间的距离,例如当有多个目标的中心落在同一个grid cell中时,YOLO只会负责预测其中的一个目标。如下图所示,在左下角有9个圣诞老人,而YOLO只能检测出5个。
对于每一个grid cell:
- 预测$B$个边界框,每一个边界框有一个box置信度分数;
- 只预测一个目标,而不是边界框的数目$B$;
- 预测$C$个条件类别概率。
为了评估PASCAL VOC,YOLO使用$7\times 7$大小的grids($S\times S$),每一个grid预测2($B$)个边界框和20($C$)个类别。
每一个边界框包含5个元素:$(x,y,w,h)$以及一个边界框置信度分数(box confidence score)。置信度分数表明了当前边界框包含目标的置信度和边界框的准确度。
对于边界框,使用图片的宽和高对其宽$w$和高$h$进行归一化。$x,y$的值为相对于cell左上角的偏移量。因而,$(x,y,w,h)$的值都被限定在$[0,1]$之间。每一个cell都包含20个条件类别概率。条件类别概率的含义为:所检测出的目标属于特定类别的概率。因而,YOLO的预测的形状为$(S,S,B\times 5+C)=(7,7,2\times 5+20)=(7,7,30)$。
YOLO的核心思想就是使用一个卷积神经网络来预测一个大小为$(7,7,30)$的张量。首先,YOLO使用CNN来将特征图的空间大小降低为$7\times 7$,在特征图中的每一点处都有1024个通道;接着,YOLO使用两层全连接层来执行线性回归操作,最终的到$7\times 7 \times 2$个边界框的预测(中间图片所示)。为了进行最终的预测,算法会将置信度分数大于阈值(大于0.25)的预测框留下,作为最终的预测(右侧图片所示)。
图中所预测出的每一个边界框的类别置信度分数的计算公式如下:
该分数同时对分类和定位(目标处在何处)进行度量。
上述计算公式的数学推导式如下:
网络设计
YOLO的网络结构由24个卷基层加2个全连接层构成。在一些卷积层,交替使用$1\times 1$大小的卷积核来降低特征图的深度。最后一层卷积层的输出特征图大小为$(7,7,1024)$。接着,该特征图将被拉开,然后使用2个全连接层来进行线性回归操作,输出的特征图大小为$7\times 7\times 30$。
YOLO还有一个快速但低精度的版本,被称为Fast YOLO,只使用了9个卷积层。
损失函数
对于每一个grid cell,YOLO会预测多个边界框。为了计算true positive的损失,我们只希望这些边界框中的一个来负责预测对应的目标。为此,我们选中这些边界框中与ground truth有着最大IoU的那个。这一策略使得在进行预测时,边界框变得专一化。每一个预测都擅长于预测特定的大小和长宽比的目标。
YOLO使用预测和ground truth之间的均方误差来计算损失,损失函数包含以下几部分:
- 分类损失;
- 定位损失(预测的边界框和ground truth之间的误差);
- 置信度损失(边界框是否包含目标)。
分类损失
如果检测到了目标,每一个cell的类别误差的计算方式为:每一类的类条件概率的均方误差。
定位损失
定位损失分为位置和大小两个方面来计算损失。只计算负责对目标进行预测的那个边界框的定位损失:
对于大目标和小目标,两者的损失应该不同(对于大目标和小目标来说,两个像素的偏移有着不同的影响)。为此,YOLO预测边界框宽和高的均方根而不是直接预测宽和高。除此之外,为了将更多的注意力放在边界框准确率上,给定位损失乘以$\lambda_{coord}$,默认为5.
置信度损失
如果边界框负责预测某个目标,那么置信度损失的计算方式如下:
如果边界框未负责预测某个目标,那么置信度损失的计算方式如下:
大多数边框不包含任何目标,因而会导致类别不平衡问题(导致模型偏向于将边界框预测为背景类)。为了纠正这一问题,给不包含目标的边界框的类别损失乘以$\lambda_{noobj}$(默认0.5)。
损失
最终的损失函数的形式为:
前向推理:非极大抑制(Non-maximal suppression)
对于同一个目标,YOLO可能预测出多个预测框。为了解决这个问题,YOLO使用非极大抑制算法来移除重复的预测。使用非极大抑制可以提升$2-3\%$的mAP。
非极大抑制的实现方法之一如下:
- 依据置信度分数对预测框进行排序;
- 从最高的分数开始,如果发现任何前面的预测与当前预测的类别相同且IoU大于0.5,则忽略当前预测;
- 重复步骤2知道所有预测都被检查过。
YOLO的优点
快速;
可端到端训练;
更通用;
基于区域建议的方法将分类器限定在特定的区域。而YOLO在进行预测时利用的是整幅图的信息。因而,由于利用了额外的背景信息,YOLO预测出的背景区域的假正样本更少;
每一个grid预测一个目标,在进行预测时,提升了空间稀疏度。
YOLOv2
相比于YOLO,SSD有着更高的精度。与基于区域的检测方法相比,YOLO的定位误差更高,且召回率(度量定位所有的目标的能力)更低。YOLOv2是YOLO的第二个版本,目标在于提升速度的同时,获得更高的精度。
提升精度
Batch normalization
在卷积层之后添加了BN层,因而可以去除dropout层,mAP提升2%.
更高分辨率的分类器
YOLO的训练过程包含两步。首先,训练一个类似于VGG16的分类网络;接着,使用卷积层替换全连接层并针对目标检测进行端到端的训练。在训练分类器时使用的分辨率为$224\times 224$,而在训练目标检测时使用的分辨率为$448\times 448$。
使用带Anchor Boxes的卷积
在YOLO中,训练的起始阶段梯度很不稳定。刚开始,YOLO对边界框进行随意的猜测,导致在一些目标上表现不错,而在一些目标上变现很差,因而导致很剧烈的梯度改变。在训练的早期,预测框都在寻找其应该专注的目标框的形状。
而在现实世界中,边界框并不是任意的。汽车有着很相似的形状,而行人的长宽比接近0.41。
因为我们只需要正确的猜测,因此如果有一个适用于现实世界目标的多种多样的初始形状猜测,刚开始的训练将变得比较稳定。
例如,创建如下大小的5个anchor boxes。
在预测过程中,不会直接预测5个任意的边界框,而是预测相对于上述5个anchor boxes的偏移值。如果对偏移值进行限制,就可以维持预测的多样性并使得每一个预测集中在特定的形状。因而,初始训练阶段将更加平稳。
在本文中,anchors又被称作priors。
对网络结构的改变如下所示:
移除负责预测边界框的全连接层;
将类别预测从cell级移动到边界框级(每一个边界框都进行类别预测)。因而,每一个预测包含边界框的四个参数、一个表示是否存在目标的置信度分数和20个类别概率。那么,5个边界框就有125个参数。与YOLO相同,objectness prediction仍旧表示ground truth和预测框的IOU。
为了产生大小为$7\times 7 \times 125$大小的特征图,将最后一层卷积层替换为三个$3\times 3$大小的卷积层,每一个卷积层输出1024个通道。接着,使用最后的一层大小为$1\times 1$的卷积层将$7\times 7\times 1024$大小的输出转换为$7\times 7 \times 125$大小。
将输入图片的大小从$448\times 448$转换为$416\times 416$。该大小将产生大小为奇数的特征图。因为图片的中心一般都被一个大目标所占据。当grid cell的大小为奇数时,将更容易确定该大目标的位置。
移除一层池化层,将网络输出的大小变为$13\times 13$。
引入anchor boxes后,mAP从69.5降低到69.2,但recall从81%提升到88%。也就是说,即使准确率下降但是提升了检测到所有ground truth目标的概率。
维度聚类
在很多问题领域,其目标的边界框都是有一定的模式的。例如,在自动驾驶领域,常见的模式为不同距离的行人和车辆。为了找出前K个尽可能覆盖训练数据的边界框,我们使用K-均值来聚类得出训练数据的边界框的前K个聚类中心。
因为关注的是边界框而非点,所以不能使用常规的空间距离来度量数据点的距离。自然而然,使用IoU进行度量。
在左侧,我们画出了在使用不同数目的聚类中心(anchors)的情况下,anchors和ground truth之间的平均IoU。随着anchors数目的增加,准确率平缓上升。最终,选取了5。在右侧,表示的是5个anchor。蓝色矩形框表示COCO数据,黑色矩形框表示VOC2007数据。在两种数据集中,anchors大多表现为瘦和高,这一现象也表明了现实中的边界框不是任意的。
除非特意声明,下文中的YOLO都表示YOLOv2。
直接预测定位
我们预测的是相对于anchors的偏移量,但是,如果不进行限制的话,预测值将会变得随机。对于体育每一个预测框,YOLO会预测5个参数($tx,ty,tw,th$和$to$),并使用sigma函数来限制可能的偏移范围。
可视化如下所示:其中,蓝框表示预测的边界框,点框表示anchor。
通过使用k-均值和上述的改进,mAP提升5%左右。
细粒度特征
卷积层逐渐减小特征图的空间维度。随着分辨率的降低,检测小目标的难度将逐渐增大。其他目标检测算法,诸如SSD,使用多尺度的特征图进行目标检测。因而每一层特征图专注于不同尺度的目标。YOLO使用了一种不同的策略(passthrough)。它将大小为$26\times \times 26\times 512$的特征图reshape为$13\times 13 \times 2048$,接着将该特征图与原始的$13\times 13 \times 1024$的特征图进行拼接。最后,在拼接得到的特征图上进行检测。
多尺度训练
在移除全连接层后,YOLO可以输入不同大小尺寸的图片。如果图片的长和宽都加倍,就会预测的grid的数目就会变为原来的4倍。因为YOLO网络对输入图片的下采样倍数为32,所以输入的长和宽必须是32的倍数。在训练过程中,YOLO接受$320\times 320,352\times 352,…$和$608\times 608$大小的特征图。每10个batches,YOLOv2随机从上述尺度中选取一个尺度用于训练。
这一做法有着数据增强的作用,使得网络对不同大小的输入图片都有着不错的预测能力。因而,可以依据要求的不同选择不同大小的输入图片。需要更高的速度则选择较小的输入图片,需要更高的准确度则选择较大的图片。
准确度
使用上述改进方法后,性能如下:
不同目标检测算法的性能比较:
速度提升
对于一张大小为$224\times 224$的图片,VGG16在一次前向传播中需要30.69 billion次浮点操作,自定义的GoogLeNet需要8.52 billion次。因而可以将VGG16替换为GoogLeNet,但是会导致在ImageNet上的top-5准确率从90.0%下降到88.0%。
DarkNet
可以进一步对使用的backbone进行简化。Darknet只需要5.58 billion次浮点操作。在Darknet中,大量使用$3\times 3$卷积提取特征,$1\times 1$卷积降低输出通道数。并使用全局平均池化来进行预测。网络结构如下(下表的网络结构用于分类任务):
为了将Darknet用于目标检测,将最后的分类层的结构替换为三个$3\times 3$大小的卷积层,每一个卷积层输出1024个通道。接着使用$1\times 1$卷积将$7\times \times 7 \times 1024$转换为$7\times 7\times 125$(每一个grid预测5个边界框,每一个边界框预测4个位置参数,一个置信度分数和20个条件类别概率)。
训练
首先使用ImageNet的1000类分类数据集对YOLO训练160个epochs:使用随机梯度下降法,初始学习率为0.1,指数衰减的次数为4,权重衰减系数为0.0005以及动量为0.9。在初始训练阶段,使用大小为$224\times 224$的分辨率,接着使用$448\times 448$大小的分辨率,初始学习率为10-3,微调10个epoch。在训练完成后,top-1正确率为76.5%,top-5学习率为93.3%。
接着,移除全连接层和最后一层卷积层。添加三个大小为$3\times 3$,输出通道为1024的卷积层,后接大小为$1\times1$,输出通道数为125的卷积层。同时添加passthrough层。使用初始学习率10-3,分别在第60和90个epoch将学习率衰减10倍,权重衰减为0.0005和动量0.9训练160个epochs。
分类
与分类任务相比,检测任务的类别数目相对较少。为了拓展可以检测的类别数目,YOLO提出了一种在训练过程中,对分类和目标检测数据集进行融合的方法。在使用目标检测样本训练端到端网络的同时,将来自分类样本的分类损失反向传播到分类支路。该方法需要解决如下的问题:
- 如何将不同数据集的类标进行合并?目标检测数据集和不同的分类数据集有着不同的类标。
- 合并的类别之间并不是相互独立的。例如,ImageNet中的Norfolk terrier 和COCO中的dog。因而无法使用softmax来计算概率(softmax只会将单一的样本判定为单一的类别)。
层次分类
YOLO将不同的数据集结合起来组成一棵树型的WordTree。
以1000类的ImageNet为例。并非直接预测1000个类别,而是创建了一个有着1000个结点,369个父类结点的树形结构。原始情况下,YOLO预测biplane的类别分数。但是在WordTree中,预测给定airplane的情况下是biplane的分数。
因为:
因而可以使用softmax函数来计算概率值:
不同之处在于,并不是只执行了一次softmax操作,而是对每一个父结点的孩子都执行softmax操作。
接着通过对树的结点进行遍历,便可以得到类别概率:
在进行分类时,假设目标已经被检测到,因而$Pr(physical\ object)=1$。
当YOLO在执行分类任务时,只会反向传播分类损失来训练分类器。YOLO关注那些对某一类预测出的分数最高的bounding box,同时也计算该类的父结点的分类损失(如果一个bounding box被打上biplane的标签,同时也会被打上airplane 、air、vehicle…)。这一做法鼓励模型提取出这些类别的公共特征。
在目标检测中,将$Pr(physical\ object)$设置为box confidence分数。YOLO对树进行遍历,取出其中有着最高分数的一条支路,同时执行阈值操作得到最终的预测。
YOLO9000
YOLO9000使用有9418个结点的wordtree来检测超过9000类的目标。它将COCO的样本和ImageNet中的前9000个类别进行结合。对于每一个COCO数据,YOLO从ImageNet中采样出4个数据。它学习使用COCO的检测数据进行定位,使用ImageNet中的数据进行分类。
YOLOv3
预测类别
大多数分类器都假设各个类别之间是互不相关的。因而,YOLO在预测类别时使用softmax函数,softmax函数的输出之和为1。但在YOLOv3中使用multi-label分类,一个目标可能同时属于多个类别。YOLOv3将softmax函数替换为独立的logistic分类器。除此之外,YOLOv3未使用均方误差来计算损失函数,而是针对每一个类别使用二维交叉熵损失。这一做法同时降低了计算复杂度。
边界框预测和损失函数计算
YOLOv3使用logistic回归预测每一个边界框的目标分数。并改变了计算损失函数的方式。如果一个先验边界框与某个ground truth的重合率高于其它先验框,那么该先验边界框的目标分数为1。对于剩余的重合率超过预设阈值的先验框,将不计入损失计算。每一个ground truth只与一个先验框匹配。如果某个先验框未匹配上ground truth,那么该先验框将不被计算分类损失和定位损失,只计算是否包含目标的损失。将坐标值和长宽使用公式进行转换后计算损失:
Feature Pyramid Networks (FPN)
对于每一个位置,YOLOv3预测三个边界框,每一个预测包含一个边界框、一个目标分数和80个类别分数(N × N × [3 × (4 + 1 + 80) ])。
YOLOv3在三个尺度的特征图上进行预测(类似于FPN):
- 在最后一层特征图进行预测;
- 退回两层,并将特征图上采样2倍。将具有更高分辨率的特征图与上采样后得到的特征图按照元素相加的方式进行融合。在融合后得到的特征图上进行第二次预测。
- 重复上一步,最终得到的特征图具有高层次的语义(结构)信息和较高的空间分辨率。
为了确定先验框,YOLOv3使用k-均值聚类。对于COCO,anchors的宽和高依次为: (10×13),(16×30),(33×23),(30×61),(62×45),(59× 119),(116 × 90),(156 × 198),(373 × 326)。依据尺度将这9个先验框划分为3个不同的组。每一组被分配给特定的特征图。
特征提取
使用Darknet-53结构,该网络结构主要由$3\times 3$和$1\times 1$卷积、跳层链接构成。与ResNet-152相比,Darknet-53有着更小的运算消耗,但精度更高,速度更快。
性能
在COCO上,YOLOv3的AP值与SSD持平,但快3倍。但仍旧低于RetinaNet,表明YOLOv3有着较高的定位误差。在检测小目标的性能上,YOLOv3有所提升。
在快速目标检测算法中,YOLOv3具有较高的性能。