Update 第八章_目标检测

This commit is contained in:
amusi 2018-11-18 23:21:29 +08:00
parent 50f6f4b02c
commit 7ff0c3bed8
23 changed files with 135 additions and 210 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

@ -23,4 +23,7 @@ modify_log---->用来记录修改日志
2. 新增目标检测基本概念 2. 新增目标检测基本概念
3. 修改R-CNN、Fast R-CNN、RetinaNet 3. 修改R-CNN、Fast R-CNN、RetinaNet
4. 新增待完善论文FPN、RefineDet、RFBNet 4. 新增待完善论文FPN、RefineDet、RFBNet
5. 新增所有论文链接 5. 新增所有论文链接
<----lp-2018-11-18---->
1.修改SSD和YOLO系列

View File

@ -2,10 +2,12 @@
**更新日志:** **更新日志:**
2018.11.18 陈方杰修改第八章目标检测目录新增目标检测基本概念修改R-CNN、Fast R-CNN、RetinaNet新增待完善论文FPN、RefineDet、RFBNet以及新增所有论文链接。 2018.11.18(陈方杰)修改第八章目标检测目录新增目标检测基本概念修改R-CNN、Fast R-CNN、RetinaNet新增待完善论文FPN、RefineDet、RFBNet以及新增所有论文链接。
2018.11.18 新增人脸检测部分修改ssd-yolo系列 2018.11.18 新增人脸检测部分修改ssd-yolo系列
2018.11.18刘鹏修改SSD和YOLO系列
# 第八章 目标检测 # 第八章 目标检测
**目标检测负责人:** **目标检测负责人:**
@ -437,71 +439,33 @@ ResNet-101+R-FCN83.6% in PASCAL VOC 2007 test datasets
- arXivhttps://arxiv.org/abs/1512.02325 - arXivhttps://arxiv.org/abs/1512.02325
- github(Official)https://github.com/weiliu89/caffe/tree/ssd - github(Official)https://github.com/weiliu89/caffe/tree/ssd
``` 不同于前面的RCNN系列SSD属于one-stage方法。SSD使用 VGG16 网络作为特征提取器(和 Faster R-CNN 中使用的 CNN 一样),将后面的全连接层替换成卷积层并在之后添加自定义卷积层并在最后直接采用卷积进行检测。在多个特征图上设置不同缩放比例和不同宽高比的default boxes先验框以融合多尺度特征图进行检测靠前的大尺度特征图可以捕捉到小物体的信息而靠后的小尺度特征图能捕捉到大物体的信息从而提高检测的准确性和定位的准确性。如下图是SSD的网络结构图。
Faster R-CNN中在分类器之后有一个专用的候选区域网络。
```
![](./img/ch8/8.3.1.png) ![](./img/ch8/SSD-01.png)
``` **1. 怎样设置default boxes**
图8.3.1 Faster R-CNN工作流 SSD中default box的概念有点类似于Faster R-CNN中的anchor。不同于Faster R-CNN只在最后一个特征层取anchor, SSD在多个特征层上取default box可以得到不同尺度的default box。在特征图的每个单元上取不同宽高比的default box,一般宽高比在{1,2,3,1/2,1/3}中选取有时还会额外增加一个宽高比为1但具有特殊尺度的box。如下图所示在8x8的feature map和4x4的feature map上的每个单元取4个不同的default box。原文对于300x300的输入分别在conv4_3, conv7,conv8_2,conv9_2,conv10_2,conv11_2的特征图上的每个单元取4,6,6,6,4,4个default box. 由于以上特征图的大小分别是38x38,19x19,10x10,5x5,3x3,1x1所以一共得到38x38x4+19x19x6+10x10x6+5x5x6+
基于区域的检测器是很准确的但需要付出代价。Faster R-CNN在PASCAL VOC 2007测试集上每秒处理7帧的图像7FPS。和R-FCN类似研究者通过减少每个ROI的工作量来精简流程。 3x3x4+1x1x4=8732个default box.对一张300x300的图片输入网络将会针对这8732个default box预测8732个边界框。
作为替代,我们是否需要一个分离的候选区域步骤?我们可以直接在一个步骤内得到边界框和类别吗?
```
``` ![](./img/ch8/SSD-02.png)
让我们再看一下滑动窗口检测器。我们可以通过在特征图上滑动窗口来检测目标。对于不同的目标类型,我们使用不同的窗口类型。以前的滑动窗口方法的致命错误在于使用窗口作为最终的边界框,这就需要非常多的形状来覆盖大部分目标。更有效的方法是将窗口当作初始猜想,这样我们就得到了从当前滑动窗口同时预测类别和边界框的检测器。
```
![](./img/ch8/8.3.2.png) **2. 怎样对先验框进行匹配?**
SSD在训练的时候只需要输入图像和图像中每个目标对应的ground truth. 先验框与ground truth 的匹配遵循两个原则:
``` 1对图片中的每个ground truth, 在先验框中找到与其IOU最大的先验框则该先验框对应的预测边界框与ground truth 匹配。
图8.3.2
基于滑动窗口进行预测这个概念和Faster R-CNN中的锚点很相似。然而单次检测器会同时预测边界框和类别。例如我们有一个8×8特征图并在每个位置做出k个预测即总共有8×8×k个预测结果。
```
![](./img/ch8/8.3.3.png) 2对于1中每个剩下的没有与任何ground truth匹配到的先验框找到与其IOU最大的ground truth若其与该ground truth的IOU值大于某个阈值一般设为0.5则该先验框对应的预测边界框与该ground truth匹配。
``` 按照这两个原则进行匹配匹配到ground truth的先验框对应的预测边界框作为正样本没有匹配到ground truth的先验框对应的预测边界框作为负样本。尽管一个ground truth可以与多个先验框匹配但是ground truth的数量相对先验框还是很少按照上面的原则进行匹配还是会造成负样本远多于正样本的情况。为了使正负样本尽量均衡一般保证正负样本比例约为13SSD采用hard negative mining, 即对负样本按照其预测背景类的置信度进行降序排列选取置信度较小的top-k作为训练的负样本。
图8.3.3 64个位置
在每个位置我们有k个锚点锚点是固定的初始边界框猜想一个锚点对应一个特定位置。我们使用相同的锚点形状仔细地选择锚点和每个位置。
```
![](./img/ch8/8.3.4.png) **3. 怎样得到预测的检测结果?**
``` 最后分别在所选的特征层上使用3x3卷积核预测不同default boxes所属的类别分数及其预测的边界框location。由于对于每个box需要预测该box属于每个类别的置信度假设有c类包括背景和该box对应的预测边界框的location(包含4个值即该box的中心坐标和宽高)则每个box需要预测c+4个值。所以对于某个所选的特征层该层的卷积核个数为c+4x该层的default box个数.最后将每个层得到的卷积结果进行拼接。对于得到的每个预测框取其类别置信度的最大值若该最大值大于置信度阈值则最大值所对应的类别即为该预测框的类别否则过滤掉此框。对于保留的预测框根据它对应的先验框进行解码得到其真实的位置参数这里还需注意要防止预测框位置超出图片然后根据所属类别置信度进行降序排列取top-k个预测框最后进行NMS过滤掉重叠度较大的预测框最后得到检测结果。
图8.3.4 使用4个锚点在每个位置做出4个预测
以下是4个锚点绿色和4个对应预测蓝色每个预测对应一个特定锚点。在Faster R-CNN中我们使用卷积核来做5个参数的预测4个参数对应某个锚点的预测边框1个参数对应objectness置信度得分。因此3×3×D×5卷积核将特征图从8×8×D转换8×8×5。
```
![](./img/ch8/8.3.5.png)
``` SSD优势是速度比较快整个过程只需要一步首先在图片不同位置按照不同尺度和宽高比进行密集抽样然后利用CNN提取特征后直接进行分类与回归所以速度比较快但均匀密集采样会造成正负样本不均衡的情况使得训练比较困难导致模型准确度有所降低。另外SSD对小目标的检测没有大目标好因为随着网络的加深在高层特征图中小目标的信息丢失掉了适当增大输入图片的尺寸可以提升小目标的检测效果。
图8.3.5 4个预测每个预测对应一个锚点
```
![](./img/ch8/8.3.6.png)
```
图8.3.6 使用3×3卷积核计算预测
在单次检测器中卷积核还预测C个类别概率以执行分类每个概率对应一个类别。因此我们应用一个3×3×D×25卷积核将特征图从8×8×D转换为8×8×25C=20
```
![](./img/ch8/8.3.7.png)
```
图8.3.7 每个位置做出k个预测每个预测有25个参数
单次检测器通常需要在准确率和实时处理速度之间进行权衡。它们在检测太近距离或太小的目标时容易出现问题。
```
SSD是使用VGG19网络作为特征提取器和Faster R-CNN中使用的CNN一样的单次检测器。我们在该网络之后添加自定义卷积层蓝色并使用卷积核绿色执行预测。
![](./img/ch8/8.3.8.png)
图8.3.8 同时对类别和位置执行单次预测
然而,卷积层降低了空间维度和分辨率。因此上述模型仅可以检测较大的目标。为了解决该问题,我们从多个特征图上执行独立的目标检测。
![](./img/ch8/8.3.9.png)
图8.3.9 使用多尺度特征图用于检测
### 8.3.2 DSSD ### 8.3.2 DSSD
**标题《DSSD : Deconvolutional Single Shot Detector》** **标题《DSSD : Deconvolutional Single Shot Detector》**
@ -549,85 +513,69 @@ Faster R-CNN中在分类器之后有一个专用的候选区域网络。
- arXivhttp://arxiv.org/abs/1506.02640 - arXivhttp://arxiv.org/abs/1506.02640
- github(Official)https://github.com/pjreddie/darknet - github(Official)https://github.com/pjreddie/darknet
YOLO之前的物体检测系统使用分类器来完成物体检测任务。为了检测一个物体这些物体检测系统要在一张测试图的不同位置和不同尺寸的bounding box上使用该物体的分类器去评估是否有该物体。如DPM系统要使用一个滑窗sliding window在整张图像上均匀滑动用分类器评估是否有物体。 **YOLOv1介绍**
在DPM之后提出的其他方法如R-CNN方法使用region proposal来生成整张图像中可能包含待检测物体的potential bounding boxes然后用分类器来评估这些boxes接着通过post-processing来改善bounding boxes消除重复的检测目标并基于整个场景中的其他物体重新对boxes进行打分。整个流程执行下来很慢而且因为这些环节都是分开训练的检测性能很难进行优化。
作者设计了YOLOYou Only Look Once: Unified, Real-Time Object Detection将物体检测任务当作回归问题regression problem来处理直接通过整张图片的所有像素得到bounding box的坐标、box中包含物体的置信度和class probabilities。通过YOLO每张图像只需要看一眼就能得出图像中都有哪些物体和这些物体的位置。
图7.4.1 YOLOYou Only Look Once: Unified, Real-Time Object Detection是one-stage detection的开山之作。之前的物体检测方法首先需要产生大量可能包含待检测物体的先验框, 然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区再检测的方法虽然有相对较高的检测准确率,但运行速度较慢。
如图所示使用YOLO来检测物体其流程是非常简单明了的1将图像resize到448×448作为神经网络的输入2运行神经网络得到一些bounding box坐标、box中包含物体的置信度和class probabilities3进行非极大值抑制筛选Boxes。下图是各物体检测系统的检测流程对比
图7.4.2 YOLO创造性的将物体检测任务直接当作回归问题regression problem来处理将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。下图展示了各物体检测系统的流程图。
**1Unified Detection**
YOLO将输入图像划分为S×S的栅格每个栅格负责检测中心落在该栅格中的物体,如下图所示: ![](./img/ch8/YOLOv1-01.png)
图7.4.3 事实上YOLO也并没有真正的去掉候选区而是直接将输入图片划分成7x7=49个网格每个网格预测两个边界框一共预测49x2=98个边界框。可以近似理解为在输入图片上粗略的选取98个候选区这98个候选区覆盖了图片的整个区域进而用回归预测这98个候选框对应的边界框。
每一个栅格预测B个bounding boxes以及这些bounding boxes的confidence scores。这个confidence scores反映了模型对于这个栅格的预测该栅格是否含有物体以及这个box的坐标预测的有多准。如果这个栅格中不存在一个object则confidence score应该为0否则的话confidence score则为predicted bounding box与ground truth box之间的IOUintersection over union。YOLO对每个bounding box有5个predictionsx, y, w, h, and confidence。坐标x,y代表了预测的bounding box的中心与栅格边界的相对值。坐标w,h代表了预测的bounding box的width、height相对于整幅图像width,height的比例。confidence就是预测的bounding box和ground truth box的IOU值。
图7.4.4 **下面以问答的形式展示YOLO中的一些实现细节**
图7.4.5 **1. 网络结构是怎样的?**
每一个栅格还要预测C个conditional class probability条件类别概率Pr(Classi|Object)。即在一个栅格包含一个Object的前提下它属于某个类的概率。只为每个栅格预测一组C个类概率而不考虑框B的数量。
图7.4.6 YOLO网络借鉴了GoogleNet分类网络结构不同的是YOLO使用1x1卷积层和3x3卷积层替代inception module。如下图所示整个检测网络包括24个卷积层和2个全连接层。其中卷积层用来提取图像特征全连接层用来预测图像位置和类别概率值。
注意conditional class probability信息是针对每个网格的。confidence信息是针对每个bounding box的。在测试阶段将每个栅格的conditional class probabilities与每个bounding box的confidence相乘。这样既可得到每个bounding box的具体类别的confidence score。这乘积既包含了bounding box中预测的class的probability信息也反映了bounding box是否含有Object和bounding box坐标的准确度。
图7.4.7 ![](./img/ch8/YOLOv1-02.png)
将YOLO用于PASCAL VOC数据集时论文使用的S=7即将一张图像分为7×7=49个栅格每一个栅格预测B=2个boxes每个box有x, y, w, h, confidence5个预测值同时C=20PASCAL数据集中有20个类别。因此最后的prediction是7×7×30{即S×S×(B×5+C)}的Tensor。
图7.4.8 **2. YOLO的输入、输出、损失函数分别是什么**
图7.4.9 前面说到YOLO将输入图像分成7x7的网格最后输出是7x7xk的张量。YOLO网络最后接了两个全连接层全连接层要求输入是固定大小的所以YOLO要求输入图像有固定大小论文中作者设计的输入尺寸是448x448。
图7.4.10 YOLO将输入图像分成7x7的网格每个网格预测2个边界框。若某物体的ground truth的中心落在该网格则该网格中与这个ground truth IOU最大的边界框负责预测该物体。对每个边界框会预测5个值分别是边界框的中心x,y相对于所属网格的边界边界框的宽高w,h相对于原始输入图像的宽高的比例以及这些边界框的confidencescores边界框与ground truth box的IOU值。同时每个网格还需要预测c个类条件概率 是一个c维向量表示某个物体object在这个网格中且该object分别属于各个类别的概率这里的c类物体不包含背景。论文中的c=20则每个网格需要预测2x5+20=30个值这些值被映射到一个30维的向量。
为了让边界框坐标损失、分类损失达到很好的平衡,损失函数设计如下图所示。
**2Network Design** ![](./img/ch8/YOLOv1-03.png)
YOLO检测网络包括24个卷积层和2个全连接层,如图所示: 如上图所示损失函数分为坐标预测蓝色框、含有物体的边界框的confidence预测红色框、不含有物体的边界框的confidence预测黄色框、分类预测紫色框四个部分。
图7.4.11
图7.4.12
其中卷积层用来提取图像特征全连接层用来预测图像位置和类别概率值。YOLO网络借鉴了GoogLeNet分类网络结构。不同的是YOLO未使用inception module而是使用1×1卷积层此处1x1卷积层的存在是为了跨通道信息整合3×3卷积层进行简单替代。
**3Training** 由于不同大小的边界框对预测偏差的敏感度不同小的边界框对预测偏差的敏感度更大。为了均衡不同尺寸边界框对预测偏差的敏感度的差异。作者巧妙的对边界框的w,h取均值再求L2 loss. YOLO中更重视坐标预测赋予坐标损失更大的权重记为 coord在pascal voc训练中coodd=5 classification error部分的权重取1。
首先利用ImageNet 1000-class的分类任务数据集Pretrain卷积层。使用上述网络中的前20个卷积层加上一个average-pooling layer最后加一个全连接层作为Pretrain的网络。训练大约一周的时间使得在ImageNet 2012的验证数据集Top-5的精度达到88%这个结果跟GoogleNet的效果相当。将Pretrain的结果的前20层卷积层应用到Detection中并加入剩下的4个卷积层及2个全连接。同时为了获取更精细化的结果将输入图像的分辨率由224×224提升到448×448。将所有的预测结果都归一化到0-1,使用Leaky RELU作为激活函数。为了防止过拟合在第一个全连接层后面接了一个ratio=0.5的Dropout层。为了提高精度对原始图像做数据提升。 某边界框的置信度定义为某边界框的confidence = 该边界框存在某类对象的概率pr(object)*该边界框与该对象的ground truth的IOU值 若该边界框存在某个对象pr(object)=1 否则pr(object)=0 。由于一幅图中大部分网格中是没有物体的这些网格中的边界框的confidence置为0相比于有物体的网格这些不包含物体的网格更多对梯度更新的贡献更大会导致网络不稳定。为了平衡上述问题YOLO损失函数中对没有物体的边界框的confidence error赋予较小的权重记为 noobj对有物体的边界框的confidence error赋予较大的权重。在pascal VOC训练中noobj=0.5 有物体的边界框的confidence error的权重设为1.
**4损失函数**
损失函数的设计目标就是让坐标x,y,w,hconfidenceclassification这个三个方面达到很好的平衡。简单的全部采用了sum-squared error loss来做这件事会有以下不足18维的localization error和20维的classification error同等重要显然是不合理的2如果一些栅格中没有object一幅图中这种栅格很多那么就会将这些栅格中的bounding box的confidence置为0相比于较少的有object的栅格这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献这会导致网络不稳定甚至发散。 **3. YOLO怎样预测**
图7.4.13
解决方案如下更重视8维的坐标预测给这些损失前面赋予更大的loss weight,记为λcoord,在pascal VOC训练中取5上图蓝色框。对没有object的bbox的confidence loss赋予小的loss weight记为λnoobj在pascal VOC训练中取0.5上图橙色框。有object的bbox的confidence loss(上图红色框)和类别的loss上图紫色框的loss weight正常取1。
对不同大小的bbox预测中相比于大bbox预测偏一点小box预测偏相同的尺寸对IOU的影响更大。而sum-square error loss中对同样的偏移loss是一样。为了缓和这个问题作者用了一个巧妙的办法就是将box的width和height取平方根代替原本的height和width。在YOLO中每个栅格预测多个bounding box但在网络模型的训练中希望每一个物体最后由一个bounding box predictor来负责预测。因此当前哪一个predictor预测的bounding box与ground truth box的IOU最大这个predictor就负责predict object。这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行每一个predictor对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。
YOLO最后采用非极大值抑制NMS算法从输出结果中提取最有可能的对象和其对应的边界框。
图7.4.14神经网络输出后的检测流程 输入一张图片到YOLO网络将输出一个7*7*30的张量表示图片中每个网格对应的可能的两个边界框以及每个边界框的置信度和包含的对象属于各个类别的概率。由此可以计算某对象i属于类别 同时在第j个边界框中的得分
图7.4.15
**5非极大值抑制**
![](./img/ch8/YOLOv1-04.png)
图7.4.16 每个网格有20个类条件概率2个边界框置信度相当于每个网格有40个得分7x7个网格有1960个得分每类对象有1960/20=98个得分即98个候选框。
**6获取Object Detect结果**
图7.4.17 **NMS步骤如下**
**YOLOv1模型优缺点**
1YOLO检测物体非常快。 1.设置一个Score的阈值一个IOU的阈值
因为没有复杂的检测流程只需要将图像输入到神经网络就可以得到检测结果YOLO可以非常快的完成物体检测任务。标准版本的YOLO在TitanX的GPU上能达到45FPS。更快的Fast YOLO检测速度可以达到155FPS。而且YOLO的mAP是之前其他实时物体检测系统的两倍以上。 2.对于每类对象,遍历属于该类的所有候选框,
2YOLO可以很好的避免背景错误产生false positives。
不像其他物体检测系统使用了滑窗或region proposal分类器只能得到图像的局部信息。YOLO在训练和测试时都能够看到一整张图像的信息因此YOLO在检测物体时能很好的利用上下文信息从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比YOLO的背景错误不到Fast-R-CNN的一半。 ①过滤掉Score低于Score阈值的候选框
3YOLO可以学到物体的泛化特征。
②找到剩下的候选框中最大Score对应的候选框添加到输出列表
③进一步计算剩下的候选框与②中输出列表中每个候选框的IOU若该IOU大于设置的IOU阈值将该候选框过滤掉否则加入输出列表中
④最后输出列表中的候选框即为图片中该类对象预测的所有边界框
3.返回步骤2继续处理下一类对象。
YOLO将识别与定位合二为一结构简便检测速度快更快的Fast YOLO可以达到155FPS。相对于RNN系列, YOLO的整个流程中都能看到整张图像的信息因此它在检测物体时能很好的利用上下文信息从而不容易在背景上预测出错误的物体信息。同时YOLO可以学习到高度泛化的特征能将一个域上学到的特征迁移到不同但相关的域上如在自然图像上做训练的YOLO在艺术图片上可以得到较好的测试结果。
由于YOLO网格设置比较稀疏且每个网格只预测2个边界框其总体预测精度不高略低于Fast RCNN。其对小物体的检测效果较差尤其是对密集的小物体表现比较差。
当YOLO在自然图像上做训练在艺术作品上做测试时YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征从而迁移到其他领域。
尽管YOLO有这些优点它也有一些缺点1YOLO的物体检测精度低于其他state-of-the-art的物体检测系统2YOLO容易产生物体的定位错误3YOLO对小物体的检测效果不好尤其是密集的小物体因为一个栅格只能预测2个物体
下图是各物体检测系统的检测性能对比:
图7.4.18
### 8.3.5 YOLOv2 ### 8.3.5 YOLOv2
**标题《YOLO9000: Better, Faster, Stronger》** **标题《YOLO9000: Better, Faster, Stronger》**
@ -641,90 +589,93 @@ Faster R-CNN中在分类器之后有一个专用的候选区域网络。
- arXivhttps://arxiv.org/abs/1612.08242 - arXivhttps://arxiv.org/abs/1612.08242
- github(Official)https://pjreddie.com/darknet/yolov2/ - github(Official)https://pjreddie.com/darknet/yolov2/
YOLOv2相比YOLOv1做了很多方面的改进这也使得YOLOv2的mAP有显著的提升并且YOLOv2的速度依然很快保持着自己作为one-stage方法的优势YOLOv2和Faster R-CNN,SSD等模型的对比如图7.4.19所示。 YOLOv1虽然检测速度快但在定位方面不够准确并且召回率较低。为了提升定位准确度改善召回率YOLOv2在YOLOv1的基础上提出了几种改进策略如下图所示可以看到一些改进方法能有效提高模型的mAP.
图7.4.19 YOLOv2与其它模型在VOC 2007数据集上的效果对比 ![](./img/ch8/YOLOv2-01.png)
YOLOv1虽然检测速度很快但是在检测精度上却不如R-CNN系检测方法YOLOv1在物体定位方面localization不够准确并且召回率recall较低。YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率从而提高mAPYOLOv2在改进中遵循一个原则保持检测速度这也是YOLO模型的一大优势。YOLOv2的改进策略如图7.4.20所示可以看出大部分的改进方法都可以比较显著提升模型的mAP。
**YOLOv2改进策略**
图7.4.20 YOLOv2相比YOLOv1的改进策略 **YOLOv2 介绍**
1Batch Normalization
Batch Normalization可以提升模型收敛速度而且可以起到一定正则化效果降低模型的过拟合。在YOLOv2中每个卷积层后面都添加了Batch Normalization层并且不再使用droput。使用Batch Normalization后YOLOv2的mAP提升了2.4%。 **1Batch Normalization**
2High Resolution Classifier
目前的目标检测方法中基本上都会使用ImageNet预训练过的模型classifier来提取特征如果用的是AlexNet网络那么输入图片会被resize到不足256×256导致分辨率不够高给检测带来困难。为此新的YOLO网络把分辨率直接提升到了448×448这也意味之原有的网络模型必须进行某种调整以适应新的分辨率输入 YOLOv2中在每个卷积层后加Batch Normalization(BN)层去掉dropout. BN层可以起到一定的正则化效果能提升模型收敛速度防止模型过拟合。YOLOv2通过使用BN层使得mAP提高了2%
对于YOLOv2作者首先对分类网络自定义的darknet进行了fine tune分辨率改成448×448在ImageNet数据集上训练10轮10epochs训练后的网络就可以适应高分辨率的输入了。然后作者对检测网络部分也就是后半部分也进行fine tune。这样通过提升输入的分辨率mAP获得了4%的提升。 **2High Resolution Classifier**
3Convolutional With Anchor Boxes 目前的大部分检测模型都会使用主流分类网络如vgg、resnet在ImageNet上的预训练模型作为特征提取器,
而这些分类网络大部分都是以小于256x256的图片作为输入进行训练的低分辨率会影响模型检测能力。YOLOv2将输入图片的分辨率提升至448x448为了使网络适应新的分辨率YOLOv2先在ImageNet上以448x448的分辨率对网络进行10个epoch的微调让网络适应高分辨率的输入。通过使用高分辨率的输入YOLOv2的mAP提升了约4%。
之前的YOLO利用全连接层的数据完成边框的预测导致丢失较多的空间信息定位不准。作者在这一版本中借鉴了Faster R-CNN中的anchor思想回顾一下anchor是RNP网络中的一个关键步骤说的是在卷积特征图上进行滑窗操作每一个中心可以预测9种不同大小的建议框。 **3Convolutional With Anchor Boxes**
图7.4.21
为了引入anchor boxes来预测bounding boxes作者在网络中果断去掉了全连接层。剩下的具体怎么操作呢
首先作者去掉了后面的一个池化层以确保输出的卷积特征图有更高的分辨率。然后通过缩减网络让图片输入分辨率为416×416这一步的目的是为了让后面产生的卷积特征图宽高都为奇数这样就可以产生一个center cell。作者观察到大物体通常占据了图像的中间位置就可以只用中心的一个cell来预测这些物体的位置否则就要用中间的4个cell来进行预测这个技巧可稍稍提升效率。最后YOLOv2使用了卷积层降采样factor为32使得输入卷积网络的416×416图片最终得到13×13的卷积特征图416/32=13。加入了anchor boxes后可以预料到的结果是召回率上升准确率下降。我们来计算一下假设每个cell预测9个建议框那么总共会预测13×13×9=1521个boxes而之前的网络仅仅预测7×7×2=98个boxes。具体数据为没有anchor boxes模型recall为81%mAP为69.5%加入anchor boxes模型recall为88%mAP为69.2%。这样看来准确率只有小幅度的下降而召回率则提升了7%,说明可以通过进一步的工作来加强准确率,的确有改进空间。
4Dimension Clusters维度聚类 YOLOv1利用全连接层直接对边界框进行预测导致丢失较多空间信息定位不准。YOLOv2去掉了YOLOv1中的全连接层使用Anchor Boxes预测边界框同时为了得到更高分辨率的特征图YOLOv2还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置若特征图恰好有一个中心位置利用这个中心位置预测中心点落入该位置的物体对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLOv2通过缩减网络使用416x416的输入模型下采样的总步长为32最后得到13x13的特征图然后对13x13的特征图的每个cell预测5个anchor boxes对每个anchor box预测边界框的位置信息、置信度和一套分类概率值。使用anchor
boxes之后YOLOv2可以预测13x13x5=845个边界框模型的召回率由原来的81%提升到88%mAP由原来的69.5%降低到69.2%.召回率提升了7%准确率下降了0.3%。
作者在使用anchor的时候遇到了两个问题第一个是anchor boxes的宽高维度往往是精选的先验框hand-picked priors虽说在训练过程中网络也会学习调整boxes的宽高维度最终得到准确的bounding boxes。但是如果一开始就选择了更好的、更有代表性的先验boxes维度那么网络就更容易学到准确的预测位置。和以前的精选boxes维度不同作者使用了K-means聚类方法类训练bounding boxes可以自动找到更好的boxes宽高维度。传统的K-means聚类方法使用的是欧氏距离函数也就意味着较大的boxes会比较小的boxes产生更多的error聚类结果可能会偏离。为此作者采用的评判标准是IOU得分也就是boxes之间的交集除以并集这样的话error就和box的尺度无关了最终的距离函数为 **4Dimension Clusters**
作者通过改进的K-means对训练集中的boxes进行了聚类判别标准是平均IOU得分聚类结果如下图
图7.4.22数据集VOC和COCO上的边界框聚类分析结果
可以看到平衡复杂度和IOU之后最终得到k值为5意味着作者选择了5种大小的box维度来进行定位预测这与手动精选的box维度不同。结果中扁长的框较少而瘦高的框更多这符合行人的特征这种结论如不通过聚类实验恐怕是发现不了的。当然作者也做了实验来对比两种策略的优劣如下图使用聚类方法仅仅5种boxes的召回率就和Faster R-CNN的9种相当。说明K-means方法的引入使得生成的boxes更具有代表性为后面的检测任务提供了便利。
表7.4.1
5New NetworkDarknet-19 在Faster R-CNN和SSD中先验框都是手动设定的带有一定的主观性。YOLOv2采用k-means聚类算法对训练集中的边界框做了聚类分析选用boxes之间的IOU值作为聚类指标。综合考虑模型复杂度和召回率最终选择5个聚类中心得到5个先验框发现其中中扁长的框较少而瘦高的框更多更符合行人特征。通过对比实验发现用聚类分析得到的先验框比手动选择的先验框有更高的平均IOU值这使得模型更容易训练学习。
YOLOv2采用了一个新的基础模型特征提取器称为Darknet-19包括19个卷积层和5个maxpooling层如图4所示。Darknet-19与VGG16模型设计原则是一致的主要采用3*3卷积采用2*2的maxpooling层之后特征图维度降低2倍而同时将特征图的channles增加两倍。与NIN(Network in Network)类似Darknet-19最终采用global avgpooling做预测并且在3*3卷积之间使用1*1卷积来压缩特征图channles以降低模型计算量和参数。Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度降低模型过拟合。在ImageNet分类数据集上Darknet-19的top-1准确度为72.9%top-5准确度为91.2%但是模型参数相对小一些。使用Darknet-19之后YOLOv2的mAP值没有显著提升但是计算量却可以减少约33%。 **5New NetworkDarknet-19**
表7.4.2
6Direct location prediction YOLOv2采用Darknet-19其网络结构如下图所示包括19个卷积层和5个max pooling层主要采用3x3卷积和1x1卷积这里1x1卷积可以压缩特征图通道数以降低模型计算量和参数每个卷积层后使用BN层以加快模型收敛同时防止过拟合。最终采用global avg pool 做预测。采用YOLOv2模型的mAP值没有显著提升但计算量减少了。
前面讲到YOLOv2借鉴RPN网络使用anchor boxes来预测边界框相对先验框的offsets。边界框的实际中心位置 ,需要根据预测的坐标偏移值 ,先验框的尺度 以及中心坐标 (特征图每个位置的中心点)来计算: ![](./img/ch8/YOLOv2-02.png)
但是上面的公式是无约束的,预测的边界框很容易向任何方向偏移,如当 时边界框将向右偏移先验框的一个宽度大小,而当 时边界框将向左偏移先验框的一个宽度大小因此每个位置预测的边界框可以落在图片任何位置这导致模型的不稳定性在训练时需要很长时间来预测出正确的offsets。所以YOLOv2弃用了这种预测方式而是沿用YOLOv1的方法就是预测边界框中心点相对于对应cell左上角位置的相对偏移值为了将边界框中心点约束在当前cell中使用sigmoid函数处理偏移值这样预测的偏移值在(0,1)范围内每个cell的尺度看做1。总结来看根据边界框预测的4个offsets ,可以按如下公式计算出边界框实际位置和大小:
其中为 为cell的左上角坐标如图5所示在计算时每个cell的尺度为1所以当前cell的左上角坐标为(1,1)。由于sigmoid函数的处理边界框的中心位置会约束在当前cell内部防止偏移过多。而 和 是先验框的宽度与长度前面说过它们的值也是相对于特征图大小的在特征图中每个cell的长和宽均为1。这里记特征图的大小为 (在文中是(13,13))这样我们可以将边界框相对于整张图片的位置和大小计算出来4个值均在0和1之间
如果再将上面的4个值分别乘以图片的宽度和长度像素点值就可以得到边界框的最终位置和大小了。这就是YOLOv2边界框的整个解码过程。约束了边界框的位置预测值使得模型更容易稳定训练结合聚类分析得到先验框与这种预测方法YOLOv2的mAP值提升了约5%。
图7.4.23边界框位置与大小的计算示例图
7Fine-Grained Features
YOLOv2的输入图片大小为416*416经过5次maxpooling之后得到13*13大小的特征图并以此特征图采用卷积做预测。13*13大小的特征图对检测大物体是足够了但是对于小物体还需要更精细的特征图Fine-Grained Features。因此SSD使用了多尺度的特征图来分别检测不同大小的物体前面更精细的特征图可以用来预测小物体。YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是26*26大小的特征图最后一个maxpooling层的输入对于Darknet-19模型来说就是大小为26*26*512的特征图。passthrough层与ResNet网络的shortcut类似以前面更高分辨率的特征图为输入然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍passthrough层抽取前面层的每个2*2的局部区域然后将其转化为channel维度对于26*26*512的特征图经passthrough层处理之后就变成了13*13*2048的新特征图特征图大小降低4倍而channles增加4倍图6为一个实例这样就可以与后面的13*13*1024特征图连接在一起形成13*13*3072的特征图然后在此特征图基础上卷积做预测。在YOLO的C源码中passthrough层称为reorg layer。 **6Direct location prediction**
另外作者在后期的实现中借鉴了ResNet网络不是直接对高分辨特征图处理而是增加了一个中间卷积层先采用64个1*1卷积核进行卷积然后再进行passthrough处理这样26*26*512的特征图得到13*13*256的特征图。这算是实现上的一个小细节。使用Fine-Grained Features之后YOLOv2的性能有1%的提升。
8Multi-Scale Training Faster R-CNN使用anchor boxes预测边界框相对先验框的偏移量由于没有对偏移量进行约束每个位置预测的边界框可以落在图片任何位置会导致模型不稳定加长训练时间。YOLOv2沿用YOLOv1的方法根据所在网格单元的位置来预测坐标,则Ground Truth的值介于0到1之间。网络中将得到的网络预测结果再输入sigmoid函数中让输出结果介于0到1之间。设一个网格相对于图片左上角的偏移量是cxcy。先验框的宽度和高度分别是pw和ph则预测的边界框相对于特征图的中心坐标(bxby)和宽高bw、bh的计算公式如下图所示。
由于YOLOv2模型中只有卷积层和池化层所以YOLOv2的输入可以不限于416*416大小的图片。为了增强模型的鲁棒性YOLOv2采用了多尺度输入训练策略具体来说就是在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。由于YOLOv2的下采样总步长为32输入图片大小选择一系列为32倍数的值输入图片最小为320*320此时对应的特征图大小为10*10不是奇数了确实有点尴尬而输入图片最大为608*608,对应的特征图大小为19*19,在训练过程每隔10个iterations随机选择一种输入图片大小然后只需要修改对最后检测层的处理就可以重新训练。 ![](./img/ch8/YOLOv2-03.png)
图7.4.24 Multi-Scale Training
采用Multi-Scale Training策略YOLOv2可以适应不同大小的图片并且预测出很好的结果。在测试时YOLOv2可以采用不同大小的图片作为输入在VOC 2007数据集上的效果如下图所示。可以看到采用较小分辨率时YOLOv2的mAP值略低但是速度更快而采用高分辨输入时mAP值更高但是速度略有下降对于544*544,mAP高达78.6%。注意这只是测试时输入图片大小不同而实际上用的是同一个模型采用Multi-Scale Training训练
图7.4.25 YOLOv2在VOC 2007数据集上的性能对比
总结来看虽然YOLOv2做了很多改进但是大部分都是借鉴其它论文的一些技巧如Faster R-CNN的anchor boxesYOLOv2采用anchor boxes和卷积做预测这基本上与SSD模型单尺度特征图的SSD非常类似了而且SSD也是借鉴了Faster R-CNN的RPN网络。从某种意义上来说YOLOv2和SSD这两个one-stage模型与RPN网络本质上无异只不过RPN不做类别的预测只是简单地区分物体与背景。在two-stage方法中RPN起到的作用是给出region proposals其实就是作出粗糙的检测所以另外增加了一个stage即采用R-CNN网络来进一步提升检测的准确度包括给出类别预测。而对于one-stage方法它们想要一步到位直接采用“RPN”网络作出精确的预测要因此要在网络设计上做很多的tricks。YOLOv2的一大创新是采用Multi-Scale Training策略这样同一个模型其实就可以适应多种大小的图片了。
YOLOv2的训练 YOLOv2结合Dimention Clusters, 通过对边界框的位置预测进行约束使模型更容易稳定训练这种方式使得模型的mAP值提升了约5%。
YOLOv2的训练主要包括三个阶段。 **7Fine-Grained Features**
第一阶段先在ImageNet分类数据集上预训练Darknet-19此时模型输入为224*224,共训练160个epochs。
第二阶段将网络的输入调整为448*448,继续在ImageNet数据集上finetune分类模型训练10个epochs此时分类模型的top-1准确度为76.5%而top-5准确度为93.3%。 YOLOv2借鉴SSD使用多尺度的特征图做检测提出pass through层将高分辨率的特征图与低分辨率的特征图联系在一起从而实现多尺度检测。YOLOv2提取Darknet-19最后一个max pool层的输入得到26x26x512的特征图。经过1x1x64的卷积以降低特征图的维度得到26x26x64的特征图然后经过pass through层的处理变成13x13x256的特征图抽取原特征图每个2x2的局部区域组成新的channel即原特征图大小降低4倍channel增加4倍再与13x13x1024大小的特征图连接变成13x13x1280的特征图最后在这些特征图上做预测。使用Fine-Grained FeaturesYOLOv2的性能提升了1%.
第三个阶段修改Darknet-19分类模型为检测模型并在检测数据集上继续finetune网络。
网络修改包括网路结构可视化移除最后一个卷积层、global avgpooling层以及softmax层并且新增了三个3*3*2014卷积层同时增加了一个passthrough层最后使用1*1卷积层输出预测结果。 **8Multi-Scale Training**
YOLOv2中使用的Darknet-19网络结构中只有卷积层和池化层所以其对输入图片的大小没有限制。YOLOv2采用多尺度输入的方式训练在训练过程中每隔10个batches,重新随机选择输入图片的尺寸由于Darknet-19下采样总步长为32输入图片的尺寸一般选择32的倍数{320,352,…,608}。采用Multi-Scale Training, 可以适应不同大小的图片输入当采用低分辨率的图片输入时mAP值略有下降但速度更快当采用高分辨率的图片输入时能得到较高mAP值但速度有所下降。
YOLOv2借鉴了很多其它目标检测方法的一些技巧如Faster R-CNN的anchor boxes, SSD中的多尺度检测。除此之外YOLOv2在网络设计上做了很多tricks,使它能在保证速度的同时提高检测准确率Multi-Scale Training更使得同一个模型适应不同大小的输入从而可以在速度和精度上进行自由权衡。
**YOLOv2的训练**
YOLOv2的训练主要包括三个阶段。
第一阶段先在ImageNet分类数据集上预训练Darknet-19此时模型输入为224*224,共训练160个epochs。
第二阶段将网络的输入调整为448*448,继续在ImageNet数据集上finetune分类模型训练10个epochs此时分类模型的top-1准确度为76.5%而top-5准确度为93.3%。
第三个阶段修改Darknet-19分类模型为检测模型并在检测数据集上继续finetune网络。
网络修改包括网路结构可视化移除最后一个卷积层、global avgpooling层以及softmax层并且新增了三个3*3*2014卷积层同时增加了一个passthrough层最后使用1*1卷积层输出预测结果。
### 8.3.6 YOLO9000 ### 8.3.6 YOLO9000
githubhttp://pjreddie.com/yolo9000/ githubhttp://pjreddie.com/yolo9000/
YOLO9000是在YOLOv2的基础上提出的一种可以检测超过9000个类别的模型其主要贡献点在于提出了一种分类和检测的联合训练策略。众多周知检测数据集的标注要比分类数据集打标签繁琐的多所以ImageNet分类数据集比VOC等检测数据集高出几个数量级。在YOLO中边界框的预测其实并不依赖于物体的标签所以YOLO可以实现在分类和检测数据集上的联合训练。对于检测数据集可以用来学习预测物体的边界框、置信度以及为物体分类而对于分类数据集可以仅用来学习分类但是其可以大大扩充模型所能检测的物体种类。 作者选择在COCO和ImageNet数据集上进行联合训练但是遇到的第一问题是两者的类别并不是完全互斥的比如"Norfolk terrier"明显属于"dog"所以作者提出了一种层级分类方法Hierarchical classification主要思路是根据各个类别之间的从属关系根据WordNet建立一种树结构WordTree结合COCO和ImageNet建立的WordTree如下图所示 YOLO9000是在YOLOv2的基础上提出的一种联合训练方法可以检测超过9000个类别的模型。YOLOv2混合目标检测数据集和分类数据集用目标检测数据集及其类别标记信息和位置标注信息训练模型学习预测目标定位和分类用分类数据集及其类别标记信息进一步扩充模型所能识别的物体类别同时能增强模型鲁棒性。
图7.4.26 基于COCO和ImageNet数据集建立的WordTree **1. YOLO9000是怎么组织数据的**
WordTree中的根节点为"physical object"每个节点的子节点都属于同一子类可以对它们进行softmax处理。在给出某个类别的预测概率时需要找到其所在的位置遍历这个path然后计算path上各个节点的概率之积。
YOLO9000根据各个类别之间的从属关系建立一种树结WordTree, 将COCO数据集和ImageNet数据集组织起来。
图7.4.27 ImageNet与WordTree预测的对比
在训练时如果是检测样本按照YOLOv2的loss计算误差而对于分类样本只计算分类误差。在预测时YOLOv2给出的置信度就是Pr(physicalobject)同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径当达到某一个阈值时停止就用当前节点表示预测的类别。通过联合训练策略YOLO9000可以快速检测出超过9000个类别的物体总体mAP值为19,7%。我觉得这是作者在这篇论文作出的最大的贡献因为YOLOv2的改进策略亮点并不是很突出但是YOLO9000算是开创之举。 WordTree的生成方式如下
①首先遍历ImageNet中的类别名词。
②对每个名词在WordNet(一种结构化概念及概念之间关系的语言数据库)上找到从它所在位置到根节点设根节点为实体对象physical object的最短路径由于在WordNet中大多数同义词只有一个路径所以先把将该路径上的词全都加到树中。
③迭代地检查剩下的名词,取它到根节点的最短路径,将该最短路径上的还没出现在层次树中的词加入到树中。
混合后的数据集形成一个有9418类的WordTree.生成的WordTree模型如下图所示。另外考虑到COCO数据集相对于ImageNet数据集数据量太少了为了平衡两个数据集作者进一步对COCO数据集过采样使COCO数据集与ImageNet数据集的数据量比例接近14。
![](./img/ch8/YOLOv2-04.png)
对于物体的标签采用one-hot编码的形式数据集中的每个物体的类别标签被组织成1个长度为9418的向量向量中除在WordTree中从该物体对应的名词到根节点的路径上出现的词对应的类别标号处为1其余位置为0。
**2. YOLO9000是怎么进行联合训练的**
YOLO9000采用YOLOv2的结构anchorbox由原来的5调整到3对每个anchorbox预测其对应的边界框的位置信息x,y,w,h和置信度以及所包含的物体分别属于9418类的概率所以每个anchorbox需要预测4+1+9418=9423个值。每个网格需要预测3x9423=28269个值。在训练的过程中当网络遇到来自检测数据集的图片时用完整的YOLOv2loss进行反向传播计算当网络遇到来自分类数据集的图片时只用分类部分的loss进行反向传播。
**3. YOLO9000是怎么预测的**
WordTree中每个节点的子节点都属于同一个子类分层次的对每个子类中的节点进行一次softmax处理以得到同义词集合中的每个词的下义词的概率。当需要预测属于某个类别的概率时需要预测该类别节点的条件概率。即在WordTree上找到该类别名词到根节点的路径计算路径上每个节点的概率之积。预测时YOLOv2得到置信度同时会给出边界框位置以及一个树状概率图沿着根节点向下沿着置信度最高的分支向下直到达到某个阈值最后到达的节点类别即为预测物体的类别。
YOLO9000使用WordTree混合目标检测数据集和分类数据集并在其上进行联合训练使之能实时检测出超过9000个类别的物体其强大令人赞叹不已。YOLO9000尤其对动物的识别效果很好但是对衣服或者设备等类别的识别效果不是很好可能的原因是与目标检测数据集中的数据偏向有关。
### 8.3.7 YOLOv3 ### 8.3.7 YOLOv3
@ -739,54 +690,25 @@ githubhttp://pjreddie.com/yolo9000/
- arXivhttps://arxiv.org/abs/1804.02767 - arXivhttps://arxiv.org/abs/1804.02767
- github(Official)https://github.com/pjreddie/darknet - github(Official)https://github.com/pjreddie/darknet
YOLOv3在Pascal TitanX上处理608x608图像速度达到20FPS在COCO test-dev上mAP@0.5达到57.9%与RetinaNetFocalLoss论文所提出的单阶段网络的结果相近并且速度快4倍。YOLOv3的模型比之前的模型复杂了不少可以通过改变模型结构的大小来权衡速度与精度。速度对比如下 YOLOv3总结了自己在YOLOv2的基础上做的一些尝试性改进有的尝试取得了成功而有的尝试并没有提升模型性能。其中有两个值得一提的亮点一个是使用残差模型进一步加深了网络结构另一个是使用FPN架构实现多尺度检测。
图7.4.28 性能对比图 **1. YOLOv3对网络结构做了哪些改进**
YOLOv3在实现相同准确度下要显著地比其它检测方法快。时间都是在采用M40或TitanX等相同GPU下测量的。
简而言之YOLOv3的先验检测Prior detection系统将分类器或定位器重新用于执行检测任务。他们将模型应用于图像的多个位置和尺度。而那些评分较高的区域就可以视为检测结果。此外相对于其它目标检测方法我们使用了完全不同的方法。我们将一个单神经网络应用于整张图像该网络将图像划分为不同的区域因而预测每一块区域的边界框和概率这些边界框会通过预测的概率加权。我们的模型相比于基于分类器的系统有一些优势。它在测试时会查看整个图像所以它的预测利用了图像中的全局信息。与需要数千张单一目标图像的R-CNN不同它通过单一网络评估进行预测。这令YOLOv3非常快一般它比R-CNN快1000倍、比Fast R-CNN快100倍。
**YOLOv3改进** YOLOv3在之前Darknet-19的基础上引入了残差块并进一步加深了网络改进后的网络有53个卷积层取名为Darknet-53网络结构如下图所示以256*256的输入为例
1多尺度预测类FPN ![](./img/ch8/YOLOv3-01.png)
每种尺度预测3个box, anchor的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给3中尺度。 为了比较Darknet-53与其它网络结构的性能作者在TitanX上采用相同的实验设置将256x256的图片分别输入以Darknet-19ResNet-101ResNet-152和Darknet-53为基础网络的分类模型中实验得到的结果如下图所示。可以看到Darknet-53比ResNet-101的性能更好而且速度是其1.5倍Darknet-53与ResNet-152性能相似但速度几乎是其2倍。注意到Darknet-53相比于其它网络结构实现了每秒最高的浮点计算量说明其网络结构能更好的利用GPU。
尺度1:在基础网络之后添加一些卷积层再输出box信息。
尺度2:从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息.相比尺度1变大两倍。
尺度3:与尺度2类似,使用了32x32大小的特征图。
2更好的基础分类网络类ResNet和分类器darknet-53,见下图。 ![](./img/ch8/YOLOv3-02.png)
图7.4.29 基础网络Darknet-53 **2.YOLOv3中怎样实现多尺度检测**
3分类器-类别预测:
YOLOv3不使用Softmax对每个框进行分类主要考虑因素有两个1Softmax使得每个框分配一个类别score最大的一个而对于Open Images这种数据集目标可能有重叠的类别标签因此Softmax不适用于多标签分类。2Softmax可被独立的多个logistic分类器替代且准确率不会下降。分类损失采用binary cross-entropy loss。仿ResNet, 与ResNet-101或ResNet-152准确率接近,但速度更快.对比如下准确率top-1 误差、top-5 误差)、运算次数(/十亿)、每秒浮点数运算次数(/十亿),以及 FPS 值。): YOLOv3借鉴了FPN的思想从不同尺度提取特征。相比YOLOv2YOLOv3提取最后3层特征图不仅在每个特征图上分别独立做预测同时通过将小特征图上采样到与大的特征图相同大小然后与大的特征图拼接做进一步预测。用维度聚类的思想聚类出9种尺度的anchor box将9种尺度的anchor box均匀的分配给3种尺度的特征图.如下图是在网络结构图的基础上加上多尺度特征提取部分的示意图以在COCO数据集(80类)上256x256的输入为例
表7.4.3主干架构的性能对比
检测结构如下:
图7.4.30
图7.4.31
从中看出YOLOv3表现得不错。RetinaNet需要大约3.8倍的时间来处理一张图像YOLOv3相比SSD变体要好得多并在AP_50指标上和当前最佳模型有得一拼。YOLOv3在mAP@0.5及小目标APs上具有不错的结果,但随着IOU的增大,性能下降,说明YOLOv3不能很好地与ground truth切合。
边框预测:
图7.4.32带有维度先验和定位预测的边界框。我们边界框的宽和高以作为离聚类中心的位移并使用Sigmoid函数预测边界框相对于滤波器应用位置的中心坐标。仍采用之前的logis其中cx,cy是网格的坐标偏移量,pw,ph是预设的anchor box的边长.最终得到的边框坐标值是b*,而网络学习目标是t*用sigmod函数、指数转换。
YOLOv3模型优缺点 ![](./img/ch8/YOLOv3-03.png)
1优点 从YOLOv1到YOLOv2再到YOLO9000、YOLOv3, YOLO经历三代变革在保持速度优势的同时不断改进网络结构同时汲取其它优秀的目标检测算法的各种trick先后引入anchor box机制、引入FPN实现多尺度检测等。
a) 快速,pipline简单
b) 背景误检率低;
c) 通用性强。
YOLO对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。
2缺点
但相比RCNN系列物体检测方法YOLO具有以下缺点
a) 识别物体位置精准性差。
b) 召回率低。
在每个网格中预测两个box这种约束方式减少了对同一目标的多次检测(R-CNN使用的region proposal方式重叠较多),相比R-CNN使用Selective Search产生2000个proposalRCNN测试时每张超过40秒yolo仅使用7x7x2个。
### 8.3.8 RetinaNet ### 8.3.8 RetinaNet