本文主要参考了实时目标检测:YOLO、YOLOv2以及YOLOv3以及Real-time Object Detection with YOLO, YOLOv2 and now YOLOv3。
You only look once(YOLO)是一系列用于解决实时目标检测问题的算法。在本文中,将依次介绍YOLO、YOLOv2以及YOLOv3。在YOLO的官方网站上,作者提供了一些目标检测算法的性能和速度的对比,如下图所示。
在本文中,将以下述图片为例进行算法的讲解。
YOLO检测结果:
滑动窗口与CNN
在介绍Yolo算法之前,首先先介绍一下滑动窗口技术,这对我们理解Yolo算法是有帮助的。采用滑动窗口的目标检测算法思路非常简单,它将检测问题转化为了图像分类问题。其基本原理就是采用不同大小和比例(宽高比)的窗口在整张图片上以一定的步长进行滑动,然后对这些窗口对应的区域做图像分类,这样就可以实现对整张图片的检测了,如下图所示,如DPM就是采用这种思路。但是这个方法有致命的缺点,就是你并不知道要检测的目标大小是什么规模,所以你要设置不同大小和比例的窗口去滑动,而且还要选取合适的步长。但是这样会产生很多的子区域,并且都要经过分类器去做预测,这需要很大的计算量,所以你的分类器不能太复杂,因为要保证速度。解决思路之一就是减少要分类的子区域,这就是R-CNN的一个改进策略,其采用了selective search方法来找到最有可能包含目标的子区域(Region Proposal),其实可以看成采用启发式方法过滤掉很多子区域,这会提升效率。
如果你使用的是CNN分类器,那么滑动窗口然后输入到CNN分类器是非常耗时的。但是结合卷积运算的特点,我们可以使用CNN实现更高效的滑动窗口方法。这里要介绍的是一种全卷积(网络中用卷积层代替了全连接层)的方法,如下图所示。输入图片大小是16x16,经过一系列卷积操作,提取了2x2的特征图,但是这个2x2的图上每个元素都是和原图是一一对应的,如图上蓝色的格子对应蓝色的区域,这不就是相当于在原图上做大小为14x14的窗口滑动,且步长为2,共产生4个子区域。最终输出的通道数为4,可以看成4个类别的预测概率值,这样一次CNN计算就可以实现窗口滑动的所有子区域的分类预测。这其实是overfeat算法的思路。之所可以CNN可以实现这样的效果是因为卷积操作的特性,就是图片的空间位置信息的不变性,尽管卷积过程中图片大小减少,但是位置对应关系还是保存的。说点题外话,这个思路也被R-CNN借鉴,从而诞生了Fast R-cNN算法。
上面尽管可以减少滑动窗口的计算量,但是只是针对一个固定大小与步长的窗口,这是远远不够的。Yolo算法很好的解决了这个问题,它不再是窗口滑动了,而是直接将原始图片分割成互不重合的小方块,然后通过卷积最后生产这样大小的特征图,基于上面的分析,可以认为特征图的每个元素也是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方格内的目标,这就是Yolo算法的朴素思想。下面将详细介绍Yolo算法的设计理念。
Grid cell
为了方便讨论,我们裁减了原始图片。YOLO将输入图像划分为了$S\times S$个Grid。每一个grid cell只预测一个物体。例如,“person”(蓝色框)的中心(蓝色点)落在了黄色grid cell内,因而黄色grid cell负责对person进行预测。
关于“物体落在哪个cell,哪个cell就负责预测这个物体”要分两个阶段来看,包括训练和测试:
- 训练阶段:如果物体中心落在这个cell,那么就给这个cell打上这个物体的label(包括边界框坐标和类别)。也就是说我们是通过这种方式来设置训练过程中的truth label的。换言之,我们在训练阶段,就教会cell要预测图像中的哪个物体。
- 测试阶段:因为在训练阶段已经教会了cell去预测中心落在该cell中的物体,那么cell自然也会这么做。
每一个grid cell预测固定数量的边界框(boundary boxes)。在本例中,黄色的grid cell预测出两个边界框(蓝色的框)去定位人在哪。
但是,一个框只能预测一个目标的设定限制了所能预测的目标之间的距离,例如当有多个目标的中心落在同一个grid cell中时,YOLO只会负责预测其中的一个目标。如下图所示,在左下角有9个圣诞老人,而YOLO只能检测出5个。
对于每一个Grid cell:
- 预测$B$个边界框,每一个边界框有一个box置信度分数;
- 不管边界框的数目$B$有多少个,都只预测一个目标;
- 预测$C$个条件类别概率(目标属于各个类别的条件概率)
为了评估PASCAL VOC,YOLO使用$7 \times 7$个grids($S=7$),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)$。
这里需要重点理解输入和输出的映射关系,如下图所示,输入图像左上角的网格对应到输出张量中左上角的向量。。要注意的是,并不是说仅仅网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理,最后编码到那个30维向量中。
YOLO的核心思想就是使用一个卷积神经网络来预测一个大小为$(7,7,30)$的张量。首先,YOLO使用CNN来将特征图的空间大小降低为$7×7$,在特征图中的每一点处都有1024个通道;接着,YOLO使用两层全连接层来执行线性回归操作,最终的到$7×7×2$个边界框的预测(中间图片所示)。为了进行最终的预测,算法会将置信度分数大于阈值(大于0.25)的预测框留下,作为最终的预测(右侧图片所示)。
图中所预测出的每一个边界框的类别置信度分数的计算公式如下:
该分数同时对分类和定位(目标处在何处)的置信度进行度量。
我们很容易混淆那些得分和概率术语。以下是数学定义,供您参考。
网络设计
YOLO的网络结构由24个卷积层加2个全连接层构成。在一些卷积层,交替使用$1\times 1$大小的卷积核来降低特征图的深度。最后一层卷积层的输出特征图大小为$(7,7,1024)$。然后tensor被flattened。使用两个全连接层来进行线性回归,最终输出大小为$7\times 7\times 30$,接着reshape成$(7,7,30)$。即两个边界框预测每个定位。最后一个输出的含义如下所示:
也就是说,每个cell有两个predictor,每个predictor分别预测一个bounding box的xywh和相应的confidence。但分类部分的预测却是共享的。正因为这个,同个cell是没办法预测多个目标的。
现在考虑两个问题:
假设类别预测不是共享的,cell中两个predictor都有各自的类别预测,这样能否在一个cell中预测两个目标?
答:否定的。如果一个cell要预测两个目标,那么这两个predictor要怎么分工预测这两个目标?谁负责谁?不知道,所以没办法预测。而像faster rcnn这类算法,可以根据anchor与ground truth的IOU大小来安排anchor负责预测哪个物体,也就是说,anchor机制的好处是在训练过程中正负样本的确定是稳定的,
而YOLO这种采用预测出的box与gt匹配确定正负样本的方案,导致训练过程中正负样本可能会不断变化。若非要一个cell中预测两个目标,可能导致前面Predictor A还在朝着Ground Truth Box A 优化loss function,后面如果又要求其Ground Truth Box B优化loss function,不断调整更新的方向极易造成收敛问题,至少也有延长了收敛时间的问题。。所以后来yolo2也采用了anchor思想,同个cell才能预测多个目标。所以对于YOLO而言,一张图片最多检测出49个图像。
为什么要预测两个bounding box?
答:既然我们一个cell只能预测一个目标,为什么还要预测两个bounding box(或者更多)?这个还是要从训练阶段怎么给两个predictor安排训练目标来说。在训练的时候会在线地计算每个predictor预测的bounding box和ground truth的IOU,计算出来的IOU大的那个predictor,就会负责预测这个物体,另外一个则不预测。这么做有什么好处?我的理解是,这样做的话,实际上有两个predictor来一起进行预测,然后网络会在线选择预测得好的那个predictor(也就是IOU大)来进行预测。通俗一点说,就是我找一堆人来并行地干一件事,然后我选干的最好的那个。训练开始阶段,网络预测的bounding box可能都是乱来的,但总是选择IOU相对好一些的那个,随着训练的进行,每个bounding box会逐渐擅长对某些情况的预测(可能是对象大小、宽高比、不同类型的对象等)。所以,这是一种进化或者非监督学习的思想。
YOLO的bounding box并不是Faster RCNN的Anchor
Faster RCNN等一些算法采用每个grid中手工设置n个Anchor(先验框,预先设置好位置的bounding box)的设计,每个Anchor有不同的大小和宽高比。YOLO的bounding box看起来很像一个grid中2个Anchor,但它们不是。YOLO并没有预先设置2个bounding box的大小和形状,也没有对每个bounding box分别输出一个对象的预测。它的意思仅仅是对一个对象预测出2个bounding box,选择预测得相对比较准的那个。
YOLO还有一个快速但低精度的版本,被称为Fast YOLO,只使用了9个卷积层。
损失函数
对于每一个grid cell,YOLO会预测多个边界框。为了计算true positive的损失,我们只希望这些边界框中的一个来负责预测对应的目标。为此,我们选中这些边界框中与ground truth有着最大IoU的那个。这一策略使得在进行预测时,边界框变得专一化。每一个预测都擅长于预测特定的大小和长宽比的目标。
YOLO使用预测和ground truth之间的均方误差来计算损失,损失函数包含以下几部分:
- 分类损失
- 定位损失(预测的边界框和ground truth之间的误差)
- 置信度损失(边界框是否包含目标)
分类损失
当grid cell中有实际目标中心点落入时(即下面公式中$\mathbb {1_{ij}^{obj}}$的含义),则计算分类损失。每一个cell的分类误差的计算方式为:每一类的类条件概率的均方误差。
这里详细说明一下,物体类别是一个条件概率$P_r(Class_i/Object)$(意思是如果该网格存在一个对象Object,那么它是$C_i$类的概率)。这个可以分两个阶段理解:
对于训练阶段,也就是打label阶段,怎么打label呢?对于一个cell,如果物体的中心落在了这个cell,那么我们给它打上这个物体的类别label,并设置概率为1。换句话说,这个概率是存在一个条件的,这个条件就是cell存在物体。
对于测试阶段来说,网络直接输出$P_r(Class_i/Object)$ ,就已经可以代表有物体存在的条件下类别概率。但是在测试阶段,作者还把这个概率乘上了confidence。
论文中的公式为:
也就是说我们预测的条件概率还要乘以confidence。为什么这么做呢?举个例子,对于某个cell来说,在预测阶段,即使这个cell不存在物体(即confidence的值为0),也存在一种可能:输出的条件概率$P_r(Class_i/Object)=0.9$,但是confidence与$P_r(Class_i/Object)=0.9$乘起来就变成0了。这个是很合理的,因为你得确保cell中有物体(即confidence大),你算类别概率才有意义。
定位损失
定位损失度量预测出的边界框位置与尺寸的误差。我们只计算grid cell中负责对目标进行预测的那个边界框(要求有实际目标的中心点落入到grid cell中,并且与ground truth有着最大IoU,即下面公式中$\mathbb {1_{ij}^{obj}}$的含义)的定位损失:
我们不想对大框和小框的绝对误差进行同等加权(例如2个像素点的误差对大目标和小目标应该有着不同的影响,实际上较小的边界框的坐标误差应该要比较大的边界框要更敏感)。为此,YOLO预测边界框宽和高的均方根而不是直接预测宽和高。除此之外,为了将更多的注意力放在边界框准确率上,给定位损失乘以$\lambda_{coord}$,默认为5。
置信度损失
对于grid cell中负责预测对应目标的边界框(要求有实际目标的中心点落入到grid cell中,并且与ground truth有着最大IoU,即下面公式中$\mathbb {1_{ij}^{obj}}$的含义),则置信度损失为:
对于grid cell中不负责预测对应目标的边界框(要求没有实际目标的中心点落入到grid cell中,或者有实际目标的中心点落入到grid cell中但是与ground truth的IoU不是最大,即下面公式中$\mathbb {1_{ij}^{noobj}}$的含义),则置信度损失为:
大多数边框不包含任何目标,因而会导致类别不平衡问题(导致模型偏向于将边界框预测为背景类)。为了纠正这一问题,给不包含目标的边界框的类别损失乘以$\lambda_{noobj}$(默认为0.5)。
值得注意的是:
- 训练阶段,要给每个boundding box的置信度打label,如果一个物体中心没有落在cell之内,那么每个bounding box的$P_r(object)=0$,IOU就没有算的必要了。如果物体的中心落在了这个cell之内,这个时候$P_r(object)=1$,那么置信度的label就是$1*IOU_{pred}^{truth}$。注意这个IOU是在训练过程中不断计算出来的,网络在训练过程中预测的bounding box每次都不一样,所以和ground truth计算出来的IOU每次也会不一样。
- 预测阶段,网络只输出一个confidence值,它实际上隐含地包含了$P_r(object) \cdot IOU_{pred}^{truth}$。并不需要分别计算$P_r(object)$和$IOU_{pred}^{truth}$(也没办法算)。为什么?因为你在训练阶段你给置信度打label的时候,给的是$P_r(object) \cdot IOU_{pred}^{truth}$,网络吐出来的也是对这个乘积的预测。
Loss
将定位损失、置信度损失、分类损失加到一块,得到最终的Loss:
需要注意的是,并不是网络的输出都算loss,具体地说:
- 有实际物体中心落入的cell,需要计算分类损失,两个predictor都要计算置信度损失,预测的bounding box与ground truth IOU比较大的那个predictor需要计算定位损失
- 没有物体中心落入的cell,只需要计算置信度损失
另外,我们发现每一项loss的计算都是L2 loss,即使是分类问题也是。所以说yolo是把分类问题转为了回归问题。
推理:Non-maximal suppression
对于同一个目标,YOLO可能预测出多个预测框。为了解决这个问题,YOLO使用非极大抑制算法来移除低置信度的重复预测。使用非极大抑制可以提升$2−3\%$的mAP。
NMS的核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。
YOLO的NMS计算方法如下:
网络输出的$7\times 7\times 30$的张量,在每一个网格中,对象$C_i$位于第$j$个bounding box的得分:
它代表着某个对象$C_i$存在于第$j$个bounding box的可能性。
每个网格有:20个对象的概率*2个bounding box的置信度,共40个得分(候选对象)。49个网格共1960个得分。Andrew Ng建议每种类别分别进行NMS,那么每种类别有 1960/20=98 个得分。
NMS步骤如下:
1)设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)
2)遍历每一个类别
2.1)遍历该类别的98个得分
2.1.1)找到Score最大的那个对象及其bounding box,添加到输出列表
2.1.2)对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的bounding box的IOU
2.1.3)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)
2.1.4)如果所有bounding box要么在输出列表中,要么Score=0,则该类别的NMS完成,返回步骤2处理下一个类别
3)输出列表即为预测的对象
YOLO的优缺点
优点
快速,实时处理
预测(目标定位和分类)从一个单网络中得到。能够端到端训练提高精度
YOLO更加通用。当从自然图像扩展到其他领域(如艺术作品)时,它的性能优于其他方法
基于区域建议的方法将分类器限定在特定的区域。而YOLO在进行预测时利用的是整幅图的信息。因而,由于利用了额外的背景信息,YOLO预测出的背景区域的false positives样本更少
每一个grid预测一个目标,在进行预测时,提升了空间稀疏度
缺点
- Yolo各个单元格仅仅预测两个边界框,而且属于一个类别
- 若多个目标中心点落在同一个cell,则只能预测出一个。整个网络最多可以预测49个目标
- 对于小物体,Yolo的表现会不如人意
- 定位误差更高,召回率低
YOLOv2
相比于YOLO,SSD有着更高的精度。与基于区域的检测方法相比,YOLO的定位误差更高,且召回率(度量定位所有的目标的能力)更低。YOLOv2是YOLO的第二个版本,目标在于提升速度的同时,获得更高的精度。
提升精度
Batch normalization
在卷积层之后添加了BN层,因而可以去除dropout层,mAP提升2%。
High-resolution classifier
YOLO的训练过程包含两步。首先,训练一个类似于VGG16的分类网络;接着,使用卷积层替换全连接层并针对目标检测进行端到端的训练。在训练分类器时使用的分辨率为$224×224$,而在训练目标检测时使用的分辨率为$448×448$。YOLOV2首先使用$224 \times 224$的图片训练分类器,然后在$448 \times 448$的分辨率上对分类器微调几个Epoch。这会使得目标检测部分训练更加简单,mAP提升4%。
使用带Anchor Boxes的卷积
正如在YOLO paper中所说的那样,训练的起始阶段梯度很不稳定。刚开始,YOLO对边界框进行随意的猜测,导致在一些目标上表现不错,而在一些目标上变现很差,因而导致很剧烈的梯度改变。在训练的早期,预测框都在寻找其应该专注的目标框的形状。
而在现实世界中,边界框并不是任意的。汽车有着很相似的形状,而行人的宽长比接近0.41。
因为我们只需要正确的猜测,因此如果有一个适用于现实世界目标的多种多样的初始形状猜测,刚开始的训练将变得比较稳定。
例如,创建如下大小的5个anchor boxes。
在预测过程中,不会直接预测5个任意的边界框,而是预测相对于上述5个anchor boxes的偏移值(offsets ,R-CNN中为regression coefficients)。如果对偏移值进行限制,就可以维持预测的多样性并使得每一个预测集中在特定的形状。因而,初始训练阶段将更加平稳。
在文章中,anchors也被称为priors。
对网络结构的改变如下所示:
移除负责预测边界框的全连接层;
将类别预测从cell级移动到边界框级(每一个边界框都进行类别预测)。因而,每一个预测包含边界框的四个参数、一个表示是否存在目标的置信度分数(objectness)和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×448$转换为$416×416$。该大小将产生大小为奇数的特征图($7 \times 7$ v.s. $8 \times 8$ grid cell)。因为一般来说,大目标的中心点会落在图片的中心。当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数目的增加,准确率平缓上升。anchors数目负责多越高,经过平衡后,YOLO选取了5种anchors。在右侧,表示的是5个anchor的形状。蓝色略带紫色矩形框表示COCO数据,黑色矩形框表示VOC2007数据。在两种数据集中,anchors大多表现为瘦和高,这一现象也表明了现实中的边界框不是任意的。
除非特意声明,下文中的YOLO都表示YOLOv2。
直接预测定位
我们预测的是相对于anchors的偏移量,但是,如果不进行限制的话,预测值将会变得随机。YOLO会预测5个参数$tx,ty,tw,th$和$to$,并使用sigma函数来限制可能的偏移范围。
可视化如下所示:其中,蓝框表示转换后得到的最终预测出的边界框,点框表示anchor。
通过使用k-均值和上述的改进,mAP提升5%左右。
细粒度特征(Fine-Grained Features)
卷积层逐渐减小特征图的空间维度。随着分辨率的降低,检测小目标的难度将逐渐增大。其他目标检测算法,诸如SSD,使用多尺度的特征图进行目标检测。因而每一层特征图专注于不同尺度的目标。YOLO使用了一种不同的策略(称为passthrough)。它将大小为$26×26×512$的特征图reshape为$13×13×2048$,接着将该特征图与原始输出的$13×13×1024$的特征图进行拼接。最后,在拼接得到的$13 × 13 × 3072$大小的特征图上进行检测。
多尺度训练
在移除全连接层后,YOLO可以输入不同大小尺寸的图片。如果图片的长和宽都加倍,就会预测的grid的数目就会变为原来的4倍,预测量也变为原来的4倍。因为YOLO网络对输入图片的下采样倍数为32,所以输入的长和宽必须是32的倍数。在训练过程中,YOLO接受$320×320,352×352,…,608×608$大小的特征图(步长为32)。每10个batches,YOLOv2随机从上述尺度中选取一个尺度用于训练。
这一做法有着数据增强的作用,使得网络对不同大小的输入图片都有着不错的预测能力。因而,可以依据要求的不同选择不同大小的输入图片。需要更高的速度则选择较小的输入图片,需要更高的准确度则选择较大的图片。在$288 \times 288$大小,YOLO能够跑到90FPS,而性能和Fast R-CNN差不多。在输入为高分辨率图像时,YOLO在VOC 2017数据集上实现了78.6的mAP。
精度
使用上述改进方法后,性能如下:
不同目标检测算法的性能比较:
速度提升
对于一张大小为$224×224$的图片,VGG16在一次前向传播中需要30.69 billion次浮点操作,自定义的GoogLeNet需要8.52 billion次。因而可以将VGG16替换为GoogLeNet,但是会导致在ImageNet上的top-5准确率从90.0%下降到88.0%。
DarkNet
可以进一步对使用的backbone CNN进行简化。Darknet只需要5.58billion次浮点操作。在Darknet中,大量使用$3×3$卷积提取特征,$1×1$卷积降低输出通道数。并使用全局平均池化来进行预测。网络结构如下(下表的网络结构用于分类任务):
为了将Darknet用于目标检测,将最后的分类层的结构替换为三个$3\times 3$大小的卷积层,每一个卷积层输出1024个通道。接着使用$1 \times 1$卷积将$7\times 7 \times 1024$转换为$7\times 7\times 125$(每1个grid预测5个边界框,每1个边界框预测4个位置参数,1个置信度分数和20个条件类别概率)。
训练
首先使用ImageNet的1000类分类数据集对YOLO训练160个epochs:使用随机梯度下降法,初始学习率为0.1,多项式速率衰减的幂为4,权重衰减系数为0.0005以及动量为0.9。在初始训练阶段,使用大小为$224×224$的分辨率,接着使用$448×448$大小的分辨率,初始学习率为10-3,微调10个epoch。在训练完成后,top-1正确率为76.5%,top-5学习率为93.3%。
接着,移除全连接层和最后一层卷积层。添加三个大小为$3×3$,输出通道为1024的卷积层,后接大小为$1×1$,输出通道数为125(预测5个box,每一个box为25个参数)的卷积层。同时添加passthrough层。使用初始学习率10-3,分别在第60和90个epoch将学习率衰减10倍,权重衰减为0.0005和动量0.9训练160个epochs。
分类
与分类任务相比,检测任务的类别数目相对较少。为了拓展可以检测的类别数目,YOLO提出了一种在训练过程中,对分类和目标检测数据集进行融合的方法。在使用目标检测样本训练端到端网络的同时,将来自分类样本的分类损失反向传播到分类支路。该方法需要解决如下的问题:
- 如何将不同数据集的类标进行合并?目标检测数据集和不同的分类数据集有着不同的类标。
- 合并的类别之间并不是相互独立的。例如,ImageNet中的Norfolk terrier 和COCO中的dog。由于它不是互斥的,无法使用softmax来计算概率
层次分类(Hierarchical classification)
不谈细节,YOLO将不同数据集中的标签组合在一起,形成了一个树形结构的单词树。子节点与父节点之间形成一个is-a关系,就像双翼飞机是一个飞机一样。但合并后的标签现在并不相互排斥。
以1000类的ImageNet为例。并非直接预测1000个类别,而是创建了一个有1000个原始标签结点,369个父类结点的树形结构。最初,YOLO预测biplane的类别分数。但是在WordTree中,预测给定airplane的情况下是biplane的分数。
因为:
因而可以使用softmax函数来计算概率值:
不同之处在于,并不是只执行了一次softmax操作,而是对每一个父结点的孩子都执行softmax操作。
接着通过对树的结点进行遍历,便可以得到YOLO预测出的类别概率:
在进行分类时,假设目标已经被检测到,因而$P_r(physical object)=1$。
层次分类的一个好处是,当YOLO不能区分plane的类型时,它会给plane一个高分,而不是强迫它分到某个子类别。
当YOLO在执行分类任务时,只会反向传播分类损失来训练分类器。YOLO关注那些对某一类预测出的分数最高的bounding box,同时也计算该类的父结点的分类损失(如果一个bounding box被打上biplane的标签,同时也会被打上airplane 、air、vehicle…)。这一做法鼓励模型提取出这些类别的公共特征。因此,即使我们从未在目标检测中训练过某种特定目标类,我们仍然可以通过将泛化与其相关对象的预测来进行此类的预测。
在目标检测中,将$\rm P_r(physical\ object)$设置为表征box是否含有目标的box confidence得分。YOLO沿着树向下走时,在每次拆分时都采用最高的置信度路径,直到达到某个阈值,YOLO将预测该对象类。
YOLO9000
YOLO9000使用有9418个结点的wordtree进行层次分类来检测超过9000类的目标。它将COCO样本和ImageNet中的前9000个类别进行结合。对于每一个COCO数据,YOLO从ImageNet中采样出4个数据。它学习使用COCO的检测数据进行定位,使用ImageNet中的数据进行分类。
在评估过程中,YOLO拿它已知的但没有直接用于训练定位器的类别进行测试,即COCO中不存在的类别。YOLO9000从ImageNet目标检测数据集(200个类别)中评估它的结果。它与COCO共享约44个类别。因此,测试数据集包含156个类别,这些类别从未直接参与定位训练。YOLO为相关目标类型提取类似的特性。因此,我们可以通过简单的特征值来检测这156个类别。
YOLO9000总体mAP为19.7,而这156个类别mAP为16.0。YOLO9000在COCO中没有出现的新动物类别中表现很好,因为它们的形状可以很容易地从它们的父类中概括出来。然而,COCO并没有任何衣服种类的bounding box labels,所以这类数据侧重于预测成“sunglasses”。
YOLO V3
预测类别
大多数分类器都假设各个类别之间是互不相关的。因而,YOLO在预测类别时使用softmax函数,softmax函数的输出之和为1。但在YOLOv3中使用multi-label分类,一个目标可能同时属于多个类别(例如输出类标可以W为“pedestrian”和“child”,这不是互斥的)。YOLOv3将softmax函数替换为独立的logistic函数,以计算输入属于某个特定标签的概率。除此之外,YOLOv3未使用均方误差来计算分类损失,而是针对每一个类别使用二分类交叉熵损失。这一做法同时降低了由softmax函数带来的计算复杂度。
边界框预测和损失函数计算
YOLOv3使用logistic回归预测每一个边界框的目标分数,并改变了计算损失函数的方式。如果一个bounding box prior(即anchor)与某个ground truth的重合率高于其它的(??),那么该anchor对应的置信度得分(objectness score)为1。对于剩余的重合度超过预设阈值(default 0.5)的anchors,将不计入损失计算。每一个ground truth只与一个anchor匹配。如果某个anchor未匹配上ground truth,那么它将不被计算分类损失和定位损失,只计算置信度得分。我们使用$t_x$和$t_y$(而不是$b_x$和$b_y$)来计算损失:
Feature Pyramid Networks (FPN)
对于每一个位置,YOLOv3会给出三个预测,每一个预测包含一个边界框、一个置信度得分和80个类别分数($N × N × [3 × (4 + 1 + 80) ]$)。
YOLOv3在三个尺度的特征图上进行预测(类似于FPN):
- 在最后一层特征图进行预测;
- 将特征图上采样两倍,并退回两层。将具有更高分辨率的特征图与上采样后得到的特征图按照元素相加的方式进行融合。在融合后得到的特征图上卷积并进行第二次预测;
- 重复第二步,最终得到的特征图具有较好的高层的语义(结构)信息和用于定位的较好的空间分辨率信息。
为了确定anchor,YOLOv3使用k-均值聚类,并选择了9个聚类中心。对于COCO,anchors的宽和高依次为: $(10×13),(16×30),(33×23),(30×61),(62×45),(59× 119),(116 × 90),(156 × 198),(373 × 326)$。依据尺度将这9个anchor划分为3个不同的组。每一组被分配给特定的特征图。
特征提取
使用Darknet-53结构,该网络结构主要由$3×3$、$1×1$卷积和类似于resnet中的skip connections构成。与ResNet-152相比,Darknet-53有着更小的BFLOP(billion floating point operations),相同精度下,速度为之前的2倍。
性能
在COCO上,YOLOv3的AP值与SSD持平,但快3倍。但AP仍旧低于RetinaNet。特别的,在AP@IoU=.75时,与RetinaNet相比,性能下降明显表明YOLOv3有着较高的定位误差。在检测小目标的性能上,YOLOv3提升很大。
在快速目标检测算法中,YOLOv3具有较高的性能。
参考
实时目标检测:YOLO、YOLOv2以及YOLOv3
Real-time Object Detection with YOLO, YOLOv2 and now YOLOv3
你真的读懂yolo了吗?
<机器爱学习>YOLO v1深入理解
目标检测|YOLO原理与实现