文章目录
简介
Yolo 于2015年出现之后,当时就成为了目标检测方面的新星,不但检测准确度提高了,而且在实时性方面的优势更大。但是Yolo一代还存在一些缺点。
在错误的分布方面,比如相对于Fast R-CNN来讲,Yolo的定位错误占总错误比重较高,如下图所示。
可以看到Yolo的定位错误高达19.0%,而Fast R-CNN的定位误差只有8.6%(虽然其它误差占比多)。另外和基于$region$-$proposal$的模型相比,Yolo的召回率也较低。
在Fast R-CNN 中使用了 region proposal network,在该网络中,会使用人工选择一些锚定框,网络会先判断锚定框中是否包含被检测对象,然后根据这个结果来决定是否进一步进行目标检测。而Yolo中并不会去预先定义好一些锚定框,框框大小、相对位置都是网络学习出来的。
对此,Yolo的创建者决定提出一个新的方案来在保持原有准确度的情况下解决上述两个问题,作者将其命名为Yolo2。Yolo2中使用了一些yolo中没有用到过的一些特性:
- 比如说缩放($multi$-$scale$)训练,用于提供一种在速度和准确率方面平衡的方法
- 同时他们提出了一种新的方法可以在模型上同时训练目标检测和图像分类数据集
在此yolo2基础上,作者还提出了另外一个模型 Yolo9000,它可以用来实时检测超过9000种目标。Yolo9000甚至可以标出在检测数据集中没有看到过的目标类别(在分类数据集中学习过),该模型在ImageNet的检测任务中给出了一个漂亮的结果。
方法介绍
作者为了解决yolo中存在的问题,在本文中引入了多个概念和技巧,下面我们分别介绍。
改进方法
Batch Normalization (BN)
BN大家在训练神经网络时应该经常使用。简单来讲,BN可以让层与层之间的学习过程独立。BN就是将前一激活层对于一个batch的输出$B=\{x_{1\ldots m}\}$减去整个训练用的batch的均值$u_B = mean(B)$再除以这个batch的标准差$\sigma_B^2$。这样,我们得到了一个中间值。$BN$还有两个参数,最终BN的输出为:
其中$\gamma,\beta$为参数,$\epsilon$是为了防止除0。
在Yolo中使用$BN$可以将mAP指标提高2%。
高分辨率的分类器
Yolo中使用分辨率为$224 \times 224$大小的图片来预训练它的卷积层,而后会使用分辨率为$448\times448$的图片来进行检测任务的训练。Yolo2中增加了一个步骤,在使用$224\times 224$的图片预训练完成之后,首先将图片缩放到$448*448$的分辨率对网络进行微调,然后在进行下一步检测任务的训练。这个中间新加的微调过程可以得到一个高分辨率的分类网络。最终yolo2添加这个过程之后大概可以提高4%的mAP。示意图如下:
使用锚定框
Yolo在CNN后面直接连接了一个全连接网络来输出预测框框的形状。而我们上文提到了Fast R-CNN中使用了一些手动选择的预先定义好的一些框框,这样带来了更高的召回率。这简化了问题,可以让网络更容易学习任务目标,模型的训练过程也更加稳定。Yolo2中借鉴了Fast R-CNN的优点,采取了如下措施:
- 不再使用全连接层来预测框框,也使用了锚定框的方法
- 输入大小由$448\times 448$改为$416\times 416$:被检测目标经常出现在图片的中心,因此在中心点处有一个网格(cell)是极好的。这就要求分网格时,每行、列网格的数量为奇数。由于yolo的下采样系数为32,因此,为了得到一个13*13的奇数行列的输出特征,将分辨率改为$416\times416$
- 对于一张图片,将其分为$S\times S$的网格,每个网格对应$5$个锚定框,每个框框会给出一个预测结果。一个预测结果由25个数据构成,其中4个用于预测框框的位置(x, y)和宽高(w, h),一个用于指示$objectness$(框框多大可能性包含一个对象),还有20个数据用于指示检测对象的类型(数据正好20类图像)。和yolo差不多,objectness 也使用并交比(IOU)来指定的(IOU)来指定的。(yolo中,每个网格给出了一个类别集合的预测而不是每个框框)
使用锚定框准确率从69.5%降低到了69.2%,但是召回率从81%提高到了88%。
使用聚类算法自动选择锚定框
在新版的yolo中,使用k-means方法对于训练集中的预先标定的对象框进行聚类,以得到最合适的锚定框,而不是人工去选择。
我们希望锚定框形状的选择与框的大小无关,yolo2中使用了如下指标衡量距离:
下图展示了在对聚类算法采用不同k的情况下,同一聚类簇中所有框到中心点框的IOU平均值的变化情况,最终作者选择了$K=5$作为在复杂度与召回率之间的一个平衡点。
上图展示了两个数据集VOC与COCO中的结果,可以发现在两个数据集中,最终的结果更偏向高高瘦瘦的框框;另外就是COCO数据集框框大小的方差更大。下表比较了锚定框不同选定方法的平均IOU情况(选定一个与原先标定的框最接近的锚定框来计算IOU):
可以看出使用IOU聚类方法,仅仅使用5个锚定框就可以达到Fast R-CNN中使用9个锚定框的IOU值。
位置预测
如果直接在yolo中使用锚定框的一个问题是模型训练也可能不太稳定。不稳定性来源于对象坐标(x, y)的预测,在region proposal网络中,使用如下方法计算(x, y)值:
其中$(x_a, y_a), (w_a, h_a)$为锚定框的位置与宽高。$t_x$每+1框的位置就右移一个$w_a$宽度,每-1就左移一个$w_a$宽度,显然对于所有的锚定框来说,都可以通过调整偏移量$t_x, t_y$来预测同一个目标对象,这就会导致训练时极不稳定。
为了解决这个问题,yolo2中使用了类似yolo中的方法,对于位置预测,采用了基于网格的相对位置的方法,假设网格的左上角坐标为$(c_x, c_y)$,那么预测框框中心点坐标为:
示意图如上图所示,蓝色为预测框,虚线为锚定框($p_w, p_h$为锚定框的宽高,$t_w, t_h$为网络给出的预测值)。
其中$(t_x, t_y)$为网络的预测,$\sigma(\cdot)$为$sigmoid$函数将值限制到$(0, 1)$之间。$(c_x, c_y)$使用了图片的宽高进行了归一化,也就是$c_x\in(0, 1), c_y\in(0,1)$。
笔者注:这里难道不是网格的预测还是可以往右下角移动吗?$\sigma$只限制了偏移不能往左上角移动。为啥不直接再乘以网格的宽高,这样就直接讲中心点限制在了网格中间,也就是:$b_x = \sigma(t_x) * c_w + c_x$,其中$c_w$为归一化后网格的宽度,$y$坐标也一样。
使用IOU聚类+位置预测方法,YOLO的性能相比于其它锚定框方法提高了5%。
细粒度的特征
对于较大的对象来说,卷积网络输出的$13*13$的特征矩阵工作的很好,但是对于一些小的对象的定位,细粒度的特征被证明更好用。Yolo2中为了得到更多的特征,添加了一个$passthrough$层用于将$1313$层前面的$2626$那一层的输出也直接用作最终预测的特征(类似残差网)。为了可以统一表示前面那一层的输出$2626 512$被reshape到$13132048$,这样加上原先输出层的$13131024$数据,最终的输出为$13133072$。
缩放训练
在移除了全连接层之后,网络中就都是卷积层了。此时,Yolo2可以用不同大小的图片作为输入。Yolo2网络的下采样率为32,因此,图片大小需要为32的倍数:$32\times 32, 352\times352, \ldots, 608\times608$等。对于每10个batch训练后,Yolo2会随机选择一个其他大小的图片进行训练。这可以看作是对图片进行了加强操作(数据增强),让网络可以适应不同大小的图片。此外,我们可以使用低分辨率的图像做目标检测,只是准确率会降低,但是可以带来速度上的提升。
- 在低分辨率时,Yolo2可以在弱GPU上以很高的速度处理图片,并且精度也可以达到Fast R-CNN的水准(Fast R-CNN速度仅为0.5 FPS [VOC 2007数据集])
- 在高分辨率时,Yolo2可以以40FPS的速度达到当时最高的mAP,具体对比可以看下面图
部分实验结果
应用了上面我们提到的一些改进后,yolo2的性能表现如下:
这里$new network$应该指的就是把全连接层换了。
和其他分类器对比:
可以看到$Yolo2$的速度表现依旧远超其他方法,而在处理速度为40FPS时的精度就可以超过其他的分类器了。
进一步改进速度
大多数检测框架都是用VGG16作为特征提取的工具。VGG16处理一张$244\times244$的图片需要进行306.9亿次浮点数运算,而GoogLeNet仅需85.2亿次。在Yolo框架中,我们将VGG16替换为定制的GoogLeNet,虽然改进了性能,但是在yolo在准确率上下降了2%(ImageNet数据集,使用VGG16准确率90%,使用GoogLeNet88%)。
DarkNet-19
本文提出了一个新的分类模型DarkNet作为Yolo2模型的基础。DarkNet将每次的浮点运算降低到了55.8亿次。使用了DarkNet之后,Yolo2在ImageNet上取得了72.9%的$top$-$1$精度以及91.2%的$top$-$5$准确率。DarkNet设计细节如下:
- 和VGG模型一样,使用了大量的$3\times3$的过滤器,在每一次池化操作后channel加倍
- 使用Network in Network中提出的全局平均池化$global\ average\ pooling$
- 在$3\times3$的卷积层之间使用$1\times 1$的过滤器来压缩特征维度(需要最终将每个锚定框特征维度压缩到125)
- 使用batch normalization
DarkNet-19具体网络结构如下:
进进一步加强
文中提出了一种可以联合训练检测数据集和分类数据集的方法。此方法使用检测数据集的标签来训练特定类别的框框的位置以及学习目标对象的分类;而使用分类数据集来扩展对象的类别。训练中,混合检测和分类的数据。网络看到一个检测数据时,就计算Yolo2的整个loss函数;而看到分类数据时,就只计算分类部分的loss。
这样做有一个问题就是,两类数据集的标签不对齐。两类数据集中的类别会存在交叉重叠,并且类别之间也可能存在包含关系。比如狗可以包含泰迪、牧羊犬、哈士奇等等。文中提出了一个层次分类的方法用于解决这个问题,具体方法如下。
类别分层
首先对于所有分类构建一个如上图所示的层级关系,构建方法如下:
- 从ImageNet中找到一个类别,在WordNet (图结构,有环,将有关系的物体间连接起来)中找到一条通往根结点的路径,加入到构建的WordTree中
- 对于只有一条路径的节点来说,直接加就行
- 对于WordNet中存在多条路径的选择短的
- 对于WordNet中没有的,人工加
那么如何进行分类训练呢?以1000类别的ImageNet为例,构建出上面的树形结构之后,由于中间类别的加入,整个类别多了369类,此时最终的类别为1369类。训练时,叶子结点到根结点上路过节点类别也相应置为True,比如泰迪是一条狗,那么狗的label为True,同时狗是动物,那么动物的标签也被置为True。进行预测时就计算条件概率就好了:
以上图为例,如果我们要计算dog的概率,我们首先使用$softmax$计算$animal,$$artifact,$$natural object,$$ phenomenon$这第二层四个类别各自的概率,这样得到了$Pr(animal)$ (Pr(对象存在)记为1,因为所有类别都要乘,此处忽略)。此时我们再转到animal的类别,对其下的各个类别$cat, dog, fish,\ldots$计算softmax,这样就有了$Pr(dog|animal)$,那么最后Pr(dog) = Pr(animal) * Pr(dog|animal)。文中给出的一个示意图图下:
同一颜色表示同一大类,首先计算各个大类的概率。然后再计算大类中各个子类的概率。
这样做的一个好处就是,如果现在出现了一种新型的狗,不知道类别,那么分类器至少可以将其分类为狗,而不会将其错误的将其分类其它同级的类别。
联合训练带来的另一个好处就是,如果我们给出了一种新型飞机的图片,虽然训练集中没有看到过,那么检测器可以将其当作一种飞机去检测对象,这样模型的泛化性增强了。
Yolo9000
Yolo9000将COCO数据集以及ImageNet中前9000个类别的图片混合起来训练,将检测类别扩大到了9000个,构建了一个9418个节点的WordTree。
在测试阶段,测试了一下那些仅知道如何分类,但是不知道如何框出对象的样本,也就是在COCO中没有出现过的样本。Yolo9000测试了ImageNet的目标检测数据集,它包含200个类别,其中44个类别在COCO中出现过。在剩余未出现过的156个类别上,Yolo9000取得了16.0的mAP(在整个200个类别上的mAP为19.7)。Yolo9000对于COCO中没有出现过的动物检测结果表现不错(将其泛化到了WordTree中的上层类别)。但是对一些从来没有在目标检测数据集中出现过的穿戴类别(比如:太阳镜)表现不佳。
其它
Yolov2使用分类数据和检测数据集进行混合训练,提出新一种基于WordNet的新的分层训练方法,加强了模型的泛化性;并且在yolo的基础上加了许多改进的技巧,提高了准确度;改进了网络结构(DarkNet-19)提升了速度。
引用
[1] Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271.
[2] Ren, Shaoqing, et al. "Faster r-cnn: Towards real-time object detection with region proposal networks." arXiv preprint arXiv:1506.01497 (2015).
更多推荐