最近做一些关于Faster R-CNN、SSD和YOLO模型选择和优化的项目,之前只了解Faster R-CNN系列目标检测方法,于是抽空梳理一下这几个检测模型。先上两张简单的精确度和运算量的对比图,有个粗略的了解,虽然图中缺了YOLO,参考价值仍然很大:
下面开始分别详述吧~
Faster R-CNN架构
传统目标检测方法大致分为如下三步:
深度学习特别是CNN的出现使得上述第二三步可以合并在一起做。Faster R-CNN步骤:
(1)由输入图片产生的区域候选
(2)最后一层卷积输出的所有通道
(2)最后一层卷积输出的所有通道
pooling=>
+
(3)ROI pooling
候选区的产生
RPN的核心思想是使用卷积神经网络直接产生region proposal,使用的方法本质上就是滑动窗口。RPN的设计比较巧妙,RPN只需在最后的卷积层上滑动一遍,因为anchor机制和边框回归可以得到多尺度、多长宽比的region proposal,3*3滑窗对应的每个特征区域同时预测输入图像3种尺度(128,256,512),3种长宽比(1:1,1:2,2:1)的region proposal,这种映射的机制称为anchor:
RPN利用基网络对图像用一系列的卷积和池化操作进行特征提取,得到原始的feature maps(灰色区域),然后在原始的feature maps后面再接一个con+relu层,得到将要用于生成region proposal的feature maps。将feature maps中的每个点映射回原图回原图中心,得到一个基准点。根据设置好的尺度大小和长宽比,并围绕基准点,生成k个anchors。Feature maps的每个点都有关于k个anchors的输出,包括是否有目标,以及回归k个region proposal的坐标值。
平移不变anchors:在feature maps上的每个点都可以预测得到k个region proposal。具体操作:将feature maps上的每个点映射到原图,得到一个基准点,然后围绕该基准点,通过设置好的固定的尺度大小和长宽比,生成k个anchors。在论文中,使用了3种尺度和3种长宽比的anchors,所以k=3*3=9,对于一个大小为W*H的feature map,将会产生W*H*k个anchors。而通过这种不同尺度和不同长宽比的设置,同样实现了anchors的平移不变性。
RPN的损失函数:在训练RPN的时候,先需要对得到的W*H*k个anchors进行正负样本的划分。将与gt box具有最大IOU的anchor以及与任何一个gt box的IOU大于0.7的anchor作为正样本,将剩余的与gt box的IOU小于0.3的anchor作为负样本,其余anchors均被忽略。对于每个anchor,后面会再接上一个用于二分类的softmax与用于bbox回归器。二分类softmax用于判断anchor是否为目标概率,bbox回归器用于调整anchor的4个坐标值。因此RPN的损失函数可定义为:
不带*为预测值,带*为真实值,其中,
其中x,y,h,w分别表示box的中心坐标,高度与宽度。
ROI 池化:因为 Fast R-CNN 使用全连接层,所以我们应用 ROI 池化将不同大小的 ROI 转换为固定大小。简洁示例,我们先将8×8特征图转换为预定义的 2×2 大小。
下图左上角:特征图。
右上角:将 ROI(蓝色区域)与特征图重叠。
左下角:将 ROI 拆分为目标维度。例如,对于 2×2 目标,我们将 ROI 分割为 4 个大小相似或相等的部分。
右下角:找到每个部分的最大值,得到变换后的特征图。
按上述步骤得到一个 2×2 的特征图块,可以馈送至分类器和边界框回归器中。
Train
整个Faster RCNN训练过程可分为4步:
第一步:用在ImageNet数据集上训练好的model初始化模型,训练一个RPN网络;
第二步:用在ImageNet数据集上训练好的model初始化模型,同时用第一步中训练好的RPN网络生成的region proposal作为输入,训练一个Fast RCNN;
第三步:用第二步训练好的Fast RCNN的网络参数初始化RPN网络,但是将RPN与Fast RCNN共享的网络层的learning rate设置为0,仅微调RPN独有的网络层。
第四步:固定共享的网络层,仅微调Fast RCNN所独有的fc层。
SSD架构
SSD使用VGG-16-Atrous作为基础网络,其中黄色部分为在VGG-16基础网络上填加的特征提取层。SSD与yolo不同之处是除了在最终特征图上做目标检测之外,还在之前选取的5个特特征图上进行预测。可以看出,检测过程不仅在填加特征图(conv8_2, conv9_2, conv_10_2, pool_11)上进行,为了保证网络对小目标有很好检测效果,检测过程也在基础网络特征图(conv4_3, conv_7)上进行。
SSD 方法的核心就是 predict object(物体),以及其归属类别的 score(得分);同时,在feature map上使用小的卷积核去 predict 一系列 bounding boxes 的 box offsets,为了得到高精度的检测结果,在不同层次的 feature maps 上去 predict object、box offsets,同时,还得到不同 aspect ratio 的 predictions。
相对于那些需要 object proposals 的检测模型,SSD 方法完全取消了 proposals generation、pixel resampling 或者 feature resampling 这些阶段,为了处理相同物体的不同尺寸的情况,SSD 结合了不同分辨率的 feature maps 的 predictions,SSD将输出一系列离散化(discretization) 的 bounding boxes,这些 bounding boxes是在不同层次(layers)上的feature maps上生成的,并且有着不同的 aspect ratio。需要计算出每一个 default box 中的物体其属于每个类别的可能性,即score,得分,如对于一个数据集,总共有20类,则需要得出每一个 bounding box中物体属于这20个类别的每一种的可能性,同时,要对这些 bounding boxes 的shape进行微调,以使得其符合物体的外接矩形。
先弄清楚 default map cell以及 feature box是什么:
1、feature map cell就是将feature map切分成n*n的格子。
2、default box就是每一个格子上,生成一系列固定大小的 box,即图中虚线所形成的一系列 boxes。
3、和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点,以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box),每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。
Training
在训练时,SSD与那些用region proposals + pooling方法的区别是,SSD训练图像中的 groundtruth 需要赋予到那些固定输出的 boxes 上,在前面也已经提到了,SSD输出的是事先定义好的,一系列固定大小的 bounding boxes。如下图中,狗狗的groundtruth是红色的bounding boxes,但进行label标注的时候,要将红色的groundtruth box赋予图(c)中一系列固定输出的 boxes 中的一个,即 图(c)中的红色虚线框。
像这样定义的groundtruth boxes不止在SSD中用到。在 YOLO中、 Faster R-CNN中的 region proposal阶段,以及在 MultiBox中都用到了,当这种将训练图像中的groundtruth与固定输出的boxes对应之后,就可以end-to-end的进行loss function的计算以及back-propagation的计算更新了。
损失函数
SSD训练的目标函数(training objective)源自于 MultiBox 的目标函数,但是又将其拓展,使其可以处理多个目标类别。总的目标损失函数(objective loss function)就由localization loss(loc)与 confidence loss(conf)的加权求和,其中:localization loss(loc)是 Fast R-CNN中 Smooth L1 Loss,用在 predict box,confidence loss(conf)是Softmax Loss,输入为每一类的置信度。SSD的损失函数由每个默认框的定位损失与分类损失构成(每个默认框的位置为(x, y, w, h)四个值):
训练中会遇到一些问题:
1、如何将 groundtruth boxes 与 default boxes 进行配对,以组成 label 呢?
在开始的时候,用MultiBox中的best jaccard overlap 来匹配每一个ground truth box与default box,这样就能保证每一个groundtruth box与唯一的一个default box 对应起来。但是又不同于 MultiBox ,SSD后面又将default box与任何的 groundtruth box配对,只要两者之间的jaccard overlap 大于一个阈值,这里的阈值一般设置为0.5。
2、多尺寸feature map上进行目标检测
每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到多尺度检测的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。在yolo v1中,只在最后一个卷积层上做目标位置和类别的训练和预测,这是SSD相对于yolo能提高准确率的一个关键所在。SSD在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。
3、Choosing scales and aspect ratios for default boxes
大部分 CNN 网络在越深的层,feature map的尺寸(size)会越来越小。这样做不仅仅是为了减少计算与内存的需求,还有个好处就是,最后提取的 feature map 就会有某种程度上的平移与尺度不变性。同时为了处理不同尺度的物体,一些文章将图像转换成不同的尺度,将这些图像独立的通过CNN网络处理,再将这些不同尺度的图像结果进行综合,但是其实,如果使用同一个网络中的、不同层上的feature maps,也可以达到相同的效果,同时在所有物体尺度中共享参数,可以用 CNN前面的layers来提高图像分割的效果,因为越底层的layers保留的图像细节越多。因此,SSD同时使用lower feature maps、upper feature maps 来predict detections,上图展示了SSD中使用的两种不同尺度的feature map。
一般来说,一个CNN网络中不同的layers有着不同尺寸的感受野(receptive fields)。这里的感受野指的是输出的feature map上的一个节点,其对应输入图像上尺寸的大小。所幸的是,SSD结构中default boxes不必要与每一层layer的 receptive fields 对应,而是采用feature map中特定的位置来负责图像中特定的区域以及物体特定的尺寸,设置每一个default box的中心结合在feature maps上,所有不同尺度、不同aspect ratios的default boxes在进行预测 predictions 之后,我们得到许多个predictions,包含了物体的不同尺寸、形状。
4、Hard negative mining
训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本,然后在剩下的default box中选择任意一个与真实box IOU大于0.5的,作为正样本,而其他的则作为负样本。在生成一系列的predictions之后,会产生很多个符合ground truth box的predictions boxes,但同时,不符合ground truth boxes也很多,而且negative boxes远多于 positive boxes,这会造成negative boxes、positive boxes之间的不均衡,训练时难以收敛,因此,SSD先将每一个物体位置上对应 predictions(default boxes)是negative的boxes进行排序,按照default boxes的confidence的大小选择最高的几个出来,SSD将正负样本比例定位为1:3,这样可以更快的优化,训练也更稳定。
5、既想利用已经训练好的模型进行fine-tuning,又想改变网络结构得到更加 dense的score map。
这个解决办法就是采用 Hole 算法。如下图 (a) (b) 所示,在以往的卷积或者 pooling中,一个filter中相邻的权重作用在feature map上的位置都是物理上连续的。如下图 (c) 所示,为了保证感受野不发生变化,某一层的 stride 由 2 变为 1 以后,后面的层需要采用 hole 算法,具体来讲就是将连续的连接关系是根据 hole size 大小变成 skip 连接的(图 (c) 为了显示方便直接画在本层上了)。不要被(c)中的padding为2吓着了,其实2个 padding不会同时和一个 filter 相连。pool4的stride由2变为1,则紧接着的conv5_1、conv5_2 和 conv5_3中hole size 为2。接着pool5由2变为1 ,则后面的fc6中 hole size 为4。
6、SSD使用的VGG-16作为基础网络,VGG-16虽然精度与darknet-19相当,但运算速度慢。
Result
SSD模型对bounding box的size非常的敏感。也就是说,SSD对小物体目标较为敏感,在检测小物体目标上表现较差。其实这也算情理之中,因为对于小目标而言,经过多层卷积之后,就没剩多少信息了。虽然提高输入图像的size可以提高对小目标的检测效果,但是对于小目标检测问题,还是有很多提升空间的,同时,积极的看,SSD 对大目标检测效果非常好,SSD对小目标检测效果不好,但也比YOLO要好。另外,因为SSD使用了不同aspect ratios的default boxes,SSD 对于不同aspect ratios的物体检测效果也很好,使用更多的 default boxes,结果也越好。Atrous使得SSD又好又快 ,通常卷积过程中为了使特征图尺寸保持不变,都会在边缘打padding,但人为加入的padding值会引入噪声,而使用atrous卷积能够在保持感受野不变的条件下,减少padding噪声,SSD训练过程中并没有使用atrous卷积,但预训练过程使用的模型为VGG-16-atrous,意味着作者给的预训练模型是使用atrous卷积训练出来的。使用atrous版本VGG-16作为预训模型比较普通VGG-16要提高0.7%mAP。
因为 COCO 数据集中的检测目标更小,我们在所有的layers上,使用更小的default boxes。SSD一开始会生成大量的bounding boxes,所以有必要用 Non-maximum suppression(NMS)来去除大量重复的 boxes。
YOLO架构
YOLO之前的物体检测方法主要是通过region proposal产生大量的可能包含待检测物体的potential bounding box,再用分类器去判断每个bounding box里是否包含有物体,以及物体所属类别的probability或者confidence,通过post-processing来改善bounding boxes,消除重复的检测目标,如R-CNN,Fast-R-CNN,Faster-R-CNN等,YOLO不同于这些物体检测方法,它将物体检测任务当做一个regression问题来处理,使用一个神经网络,直接从一整张图像来预测出bounding box的坐标、box中包含物体的置信度和类别probabilities,由于YOLO的物体检测流程是在一个神经网络里完成的,所以可以end to end来优化物体检测性能。不像其他物体检测系统使用了滑窗或region proposal,分类器只能得到图像的局部信息,YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息,和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。虽然相较于其他的state-of-the-art 物体检测系统,YOLO在物体定位时更容易出错,但是在背景上预测出不存在的物体(false positives)的情况会少一些。而且,YOLO比DPM、R-CNN等物体检测系统能够学到更加抽象的物体的特征,这使得YOLO可以从真实图像领域迁移到其他领域,如艺术。YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体),由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。
使用YOLO来检测物体,其流程是非常简单明了的,主要分为三个部分:卷积层,目标检测层,NMS筛选层:
1、将图像resize到448 * 448作为神经网络的输入
2、运行神经网络,得到一些bounding box坐标、box中包含物体的置信度和class probabilities
3、进行非极大值抑制,筛选Boxes
YOLO网络结构由24个卷积层与2个全连接层构成,网络入口为448x448(v2为416x416),图片进入网络先经过resize,网络的输出结果为一个张量,维度为:
其中,S为划分网格数,B为每个网格负责目标个数,C为类别个数。该表达式含义为:
(1)每个小格会对应B个边界框,边界框的宽高范围为全图,表示以该小格为中心寻找物体的边界框位置。
(2) 每个边界框对应一个分值,代表该处是否有物体及定位准确度:
(3)每个小格会对应C个概率值,找出最大概率对应的类别P(Class|object)P(Class|object),并认为小格中包含该物体或者该物体的一部分,虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。从上面可以看出整个图像只是被计算了一次,真正做到了降低计算量,提高了检测实时性。
YOLO将输入图像分成SxS个格子,若某个物体Ground truth的中心位置的坐标落入到某个格子,那么这个格子就负责检测中心落在该栅格中的物体。代码中side∗side即为原图中S∗S的小格。为什么side位置的输出会对应到原图中小格的位置呢?因为训练过程中会使用对应位置的GT监督网络收敛,测试过程中每个小格自然对应原图小格上目标的检测。
每个格子预测B个bounding box及其置信度(confidence score),以及C个类别概率。bbox信息(x,y,w,h)为物体的中心位置相对格子位置的偏移及宽度和高度,均被归一化。置信度反映是否包含物体以及包含物体情况下位置的准确性,定义为Pr(Object)×IOUtruthpred,其中Pr(Object)∈{0,1}。
YOLOv1网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。YOLO能够做到在输出中同时包含图片bounding box(检测框)的分类信息和位置信息,试着想象这样的情况,我们用1*1的卷积小方格去卷积一张7*7的图片,显然,卷积的输出也是7*7,但是我们可以做一些神奇的事情,卷积窗口filter出了被窗口过滤后的类别 ! 我们可以为每个过滤后的小窗口(cell)赋予一个类别,比如下图,是自行车Bicycle的类别中的像素过滤为上图紫色。当然,也有可能一些小方格输入多个类别,比如,可能属于猫同时属于自行车,这样,我们自然地在卷积的同时, 把类别信息和位置信息同时包含进去了。
上述是便于理解的例子,大家不要真的以为YOLO第一层卷积就使用了1*1的卷积窗口!事实上,YOLO原理是这样,但每一层窗口是大一点3*3的卷积核。
损失函数
YOLO全部使用了均方和误差作为loss函数。由三部分组成:坐标误差、IOU误差和分类误差。
几点解释:
1、YOLO将输入图像划分为S*S的栅格,每一个栅格预测B个bounding boxes,以及这些bounding boxes的confidence scores。confidence scores反映了模型对于这个栅格的预测,该栅格是否含有物体,以及这个box的坐标预测的有多准:
每一个栅格还要预测C个conditional class probability(条件类别概率):Pr(Classi|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的概率。
2、在测试阶段,将每个栅格的conditional class probabilities与每个 bounding box的confidence相乘,这样可得到每个bounding box的具体类别的confidence score,乘积既包含了bounding box中预测的class的 probability信息,也反映了bounding box是否含有Object和bounding box坐标的准确度:
论文使用的 S=7,即将一张图像分为7×7=49个栅格,每一个栅格预测B=2个boxes(每个box有 x,y,w,h,confidence,5个预测值),同时C=20(PASCAL数据集中有20个类别)。 因此,最后的prediction是7×7×30 { 即S * S * ( B * 5 + C) }的Tensor。
3、在 YOLO中,每个栅格预测多个bounding box,但在网络模型的训练中,希望每一个物体最后由一个bounding box predictor来负责预测。因此,当前哪一个predictor预测的bounding box与ground truth box的IOU最大,这个predictor就负责predict object,这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行,每一个predictor对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。
4、卷积层的输出可能是对同一个检测目标的许多个检测框,我们有高效的非极大值抑制算法来选择最好的检测框。
5、anchor机制。yolov2为了提高精度与召回率,使用了Faster-RCNN中的anchor机制。解释:在每个网格设置k个参考anchor,训练以GT anchor作为基准计算分类与回归损失,测试时直接在每个格子上预测k个anchor box,每个anchor box为相对于参考anchor的offset与w,h的refine,这样把原来每个格子中边界框位置的全图回归(yolov1)转换为对参考anchor位置的精修(yolov2),至于每个格子中设置多少个anchor(即k等于几),作者使用了k-means算法离线对voc及coco数据集中目标的形状及尺度进行了计算,发现当k = 5时并且选取固定5比例值时,anchors形状及尺度最接近voc与coco中目标的形状,并且k也不能太大,否则模型太复杂,计算量很大。
升级版YOLO v2
yolov1基础上的延续,新的基础网络,多尺度训练,全卷积网络,Faster-RCNN的anchor机制,更多的训练技巧等等改进使得yolov2速度与精度都大幅提升。相比YOLO,YOLO v2在识别种类、精度、速度、和定位准确性等方面都有大大提升。
YOLO v2改进之处:
1、Batch Normalization: v1中大量用了Batch Normalization,同时在定位层后边用了dropout,v2中取消了dropout,在卷积层全部使用Batch Normalization。
2、高分辨率分类器:v1中使用224 × 224训练分类器网络,扩大到448用于检测网络。v2将ImageNet以448×448 的分辨率微调最初的分类网络,迭代10 epochs。
3、Anchor Boxes:v1中直接在卷积层之后使用全连接层预测bbox的坐标,v2借鉴Faster R-CNN的思想预测bbox的偏移,移除了全连接层,并且删掉了一个pooling层使特征的分辨率更大一些,另外调整了网络的输入(448->416)以使得位置坐标是奇数只有一个中心点(yolo使用pooling来下采样,有5个size=2,stride=2的max pooling,而卷积层没有降低大小,因此最后的特征是416/(2^5)=13),v1中每张图片预测7x7x2=98个box,而v2加上Anchor Boxes能预测超过1000个,检测结果从69.5mAP,81% recall变为69.2 mAP,88% recall。
YOLO v2对Faster R-CNN的手选先验框方法做了改进,采样k-means在训练集bbox上进行聚类产生合适的先验框,由于使用欧氏距离会使较大的bbox比小的bbox产生更大的误差,而IOU与bbox尺寸无关,因此使用IOU参与距离计算,使得通过这些anchor boxes获得好的IOU分值。距离公式:
D(box,centroid)=1−IOU(box,centroid)D(box,centroid)=1−IOU(box,centroid),使用聚类进行选择的优势是达到相同的IOU结果时所需的anchor box数量更少,使得模型的表示能力更强,任务更容易学习,k-means算法过程是:将每个bbox的宽和高相对整张图片的比例(wr,hr)进行聚类,得到k个anchor box,由于darknet,代码中需要配置文件中region层的anchors参数是绝对值大小,因此需要将这个比例值乘上卷积层的输出特征的大小。如输入是416x416,那么最后卷积层的特征是13x13。
4、细粒度特征(fine grain features):在Faster R-CNN 和 SSD 均使用了不同的feature map以适应不同尺度大小的目标。YOLOv2使用了一种不同的方法,简单添加一个 pass through layer,把浅层特征图(26x26)连接到深层特征图(连接新加入的三个卷积核尺寸为3 * 3的卷积层到最后一层的输入)。通过叠加浅层特征图相邻特征到不同通道(而非空间位置),类似于Resnet中的identity mapping。这个方法把26x26x512的特征图叠加成13x13x2048的特征图,与原生的深层特征图相连接,使模型有了细粒度特征。此方法使得模型的性能获得了1%的提升。
5、Multi-Scale Training: 和YOLOv1训练时网络输入的图像尺寸固定不变不同,YOLOv2(在cfg文件中random=1时)每隔几次迭代后就会微调网络的输入尺寸。训练时每迭代10次,就会随机选择新的输入图像尺寸。因为YOLOv2的网络使用的downsamples倍率为32,所以使用32的倍数调整输入图像尺寸{320,352,…,608}。训练使用的最小的图像尺寸为320 x 320,最大的图像尺寸为608 x 608。 这使得网络可以适应多种不同尺度的输入。
6、网络结构:YOLOv2对v1的基础网络做了更改,如下
分类网络
YOLOv2提出了一种新的分类模型Darknet-19。借鉴了很多其它网络的设计概念。主要使用3x3卷积并在pooling之后channel数加倍(VGG);global average pooling替代全连接做预测分类,并在3x3卷积之间使用1x1卷积压缩特征表示(Network in Network);使用 batch normalization 来提高稳定性,加速收敛,对模型正则化。Darknet-19的结构如下(Darknet-19-arch:包含 19 conv + 5 maxpooling。):
训练:使用Darknet框架在ImageNet 1000类上训练160 epochs,学习率初始为0.1,以4级多项式衰减,weight decay=0.0005, momentum=0.9。使用标准的数据增广方法:random crops,rotations,(hue,saturation),exposure shifts。之后将输入从224放大至448,学习率调整为0.001,迭代10 epochs。结果达到top-1 accuracy 76.5% ,top-5 accuracy 93.3%。
检测网络
在分类网络中移除最后一个1x1的层,在最后添加3个3x3x1024的卷积层,再接上输出是类别个数的1x1卷积。对于输入图像尺寸为Si x Si,最终3x3卷积层输出的feature map是Oi x Oi(Oi=Si/(2^5)),对应输入图像的Oi x Oi个栅格,每个栅格预测anchors种boxes大小,每个box包含4个坐标值,1个置信度和classes个条件类别概率,所以输出维度是Oi x Oi x anchors x (5 + classes)。添加跨层跳跃连接(借鉴ResNet等思想),融合粗细粒度的特征:将前面最后一个3x3x512卷积的特征图,对于416x416的输入,该层输出26x26x512,直接连接到最后新加的三个3x3卷积层的最后一个的前边。将26x26x512变形为13x13x1024与后边的13x13x1024特征按channel堆起来得到13x13x3072。从yolo-voc.cfg文件可以看到,第25层为route层,逆向9层拿到第16层26 * 26 * 512的输出,并由第26层的reorg层把26 * 26 * 512 变形为13 * 13 * 2048,再有第27层的route层连接24层和26层的输出,堆叠为13 * 13 * 3072,由最后一个卷积核为3 * 3的卷积层进行跨通道的信息融合并把通道降维为1024。
升级版YOLO v3
YOLO的V1和V2都不如SSD的算法,主要原因是V1的448尺寸和V2版本的416尺寸都不如SSD的300,以上结论都是实验测试的,V3版本的416跟SSD512差不多好,但速度快很多。yolov2有个毛病就是对小物体的检测不敏感,而增加了多尺度预测之后,yolov3在对小物体检测方便有了好转,但是现在的毛病是对中、大size的物体表现的不是那么好。
YOLO v3改进之处:
1、Loss不同:YOLO V3替换了V2中的Softmax loss为Logistic loss,而且每个GT只匹配一个先验框。YOLOv3不使用Softmax对每个框进行分类,主要考虑因素有两个:Softmax使得每个框分配一个类别(score最大的一个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因此Softmax不适用于多标签分类;Softmax可被独立的多个logistic分类器替代,且准确率不会下降,分类损失采用binary cross-entropy loss.
2、预测方式不同:V2用了5个anchor,V3用了9个anchor,提高了IOU。yolov3在三个(num=3)不同的尺度预测boxes,yolov3使用的特征提取模型通过FPN(feature pyramid network)网络上进行改变,最后预测得到一个3-d tensor,包含bounding box信息,对象信息以及多少个类的预测信息。尺度1: 在基础网络之后添加一些卷积层再输出box信息;尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息。相比尺度1变大两倍;尺度3:与尺度2类似,使用了32x32大小的特征图。yolov3使用这样的方式使得模型可以获取到更多的语义信息,模型得到了更好的表现。yolov3依然使用k-Means聚类来得到bounding box的先验(参数anchors是kmeans计算出来的anchor box的长宽的绝对值(与网络输入大小相关)),选择9个簇以及3个尺度,然后将这9个簇均匀的分布在这3个尺度上。
3、Detection策略和backbone不同:V2只有一个detection,V3设置有3个,分别是一个下采样的,Feature map为13*13,还有2个上采样的eltwise sum,Feature map分别为26*26和52*52,也就是说,V3的416版本已经用到了52的Feature map,而V2把多尺度考虑到训练的data采样上,最后也只是用到了13的Feature map,这应该是对小目标影响最大的地方。yolov3的特征提取模型是一个杂交的模型,它使用了yolov2,Darknet-19以及Resnet,这个模型使用了很多有良好表现的3*3和1*1的卷积层,也在后边增加了一些shortcut connection结构,其中,3*3的卷积增加channel,而1*1的卷积在于压缩3*3卷积后的特征表示,这波操作很具有实用性,最终它有53个卷积层。没有继续增加层数是因为作者认为Resnet模型后边有太多层并且不是很有效。Darknet-53如下:
YOLO V2是一个纵向自上而下的网络架构,随着通道数目的不断增加,FLOPS是不断增加的,而V3网络架构是横纵交叉的,看着卷积层多,其实很多通道的卷积层没有继承性,另外,虽然V3增加了anchor centroid,但是对GT的估计变得更加简单,每个GT只匹配一个先验框,而且每个尺度只预测3个框,V2预测5个框,这样的话也降低了复杂度。
边界框的预测
作者尝试了常规的预测方式(Faster R-CNN),然而并不奏效: x,y的偏移作为box的长宽的线性变换:
与之前yolo版本一样,yolov3的anchor boxes也是通过聚类的方法得到的,仍采用之前的logistic方式。yolov3对每个bounding box预测四个坐标值(tx, ty, tw, th),对于预测的cell(一幅图划分成S×S个网格cell)根据图像左上角的偏移(cx, cy),以及预设的anchor box的宽和高pw,ph可以对bounding box按如下的方式进行预测:
在训练这几个坐标值的时候采用了sum of squared error loss(平方和距离误差损失),因为这种方式的误差可以很快的计算出来。yolov3对每个bounding box通过逻辑回归预测一个物体的得分,如果预测的这个bounding box与真实的边框值大部分重合且比其他所有预测的要好,那么这个值就为1。如果overlap没有达到一个阈值(yolov3中这里设定的阈值是0.5),那么这个预测的bounding box将会被忽略,也就是会显示成没有损失值。
Result
相比RCNN系列物体检测方法,YOLO具有以下缺点:识别物体位置精准性差;召回率低,在每个网格中预测两个bbox这种约束方式减少了对同一目标的多次检测(R-CNN使用的region proposal方式重叠较多),从而减少了候选框的数量,相比R-CNN使用Selective Search产生2000个proposal(RCNN测试时每张超过40秒),YOLO仅使用7x7x2个。YOLO v1吸收了SSD的长处(加了 BN 层,扩大输入维度,使用了 Anchor,训练的时候数据增强),进化到了YOLO v2;吸收SSD和FPN的长处, 仿ResNet的Darknet-53,仿SqueezeNet的纵横交叉网络,又进化到YOLO v3。
每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果很差。原始图片只划分为7x7的网格,当两个物体靠的很近时,效果很差,最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,SSD和YOLO v3对它有点优化。YOLO v3的测试表现:
本人亲测,三大目标检测方法中,虽然Faster R-CNN已经出来两年了,但它对小目标的检测效果还是最好,SSD检测的速度是最快的,尤其是SSD mobilenet,YOLO v3吸取了前两者的一些优点,比Faster R-CNN快、比SSD检测小目标准,效果中规中矩,但个人还是觉得Faster R-CNN用起来更舒服,毕竟是rgb做出来的,不过这也只是我的数据集上跑出的经验,仅作参考罢了。
以前没写过CSDN博客,还不太熟悉怎么去用那些格式工具,格式有些简单,先这样子吧,能看就行~
参考文档
https://www.cnblogs.com/makefile/p/YOLOv3.html
http://blog.51cto.com/gloomyfish/2095418
sdn.net/bigbug_sec/article/details/79739133
https://blog.csdn.net/gzq0723/article/details/79936613
https://blog.csdn.net/hrsstudy/article/details/70305791
https://www.cnblogs.com/fariver/p/7446921.html
E8%B4%B4%E4%B9%8Br-cnn%E7%B3%BB%E5%88%97-r-cnn-fast-r-cnn-faster-r-cnn/
https://yq.aliyun.com/articles/598428?spm=a2c4e.11153940.bloghomeflow.53.384b291atAvOnV
https://blog.csdn.net/qq_31050167/article/details/79190887
最近做一些关于Faster R-CNN、SSD和YOLO模型选择和优化的项目,之前只了解Faster R-CNN系列目标检测方法,于是抽空梳理一下这几个检测模型。先上两张简单的精确度和运算量的对比图,有个粗略的了解,虽然图中缺了YOLO,参考价值仍然很大:
来源:https://blog.csdn.net/weixin_44138807/article/details/97263984