按照时间顺序的一些目标检测方法:
使用分类器进行目标检测,大致思想是使用一个分类器,然后对测试图像的不同位置进行评估。如DPM,使用滑动窗口在图片上运行分类器。
R-CNN系列
(1)最早的R-CNN,在原图上使用Selective Search算法提取region proposal,每个区域扭曲后输入CNN,提取出特征,再分别SVM的训练分类器和locator。训练与检测需要多个阶段,时间空间消耗巨大。
(2) FRCN在此基础上,通过修改损失函数将分类与目标框损失合并,设计了RoI池化层使不同大小的目标框的特征可以被池化为同一尺度的特征向量,将CNN与分类器与BBox回归器合并为一段,带来训练速度提升。但是region proposal与卷积网络仍是分割的,图片须先提取区域再输入网络,测试速度很慢。
(3) Faster RCNN本质上是使用RPN(区域建议网络:在特征图上通过一个3*3的卷积,每一个位置预测k个目标框)代替了Selective Search算法,再加上Fast RCNN,RPN与Fast RCNN可以共享特征,所以目标检测过程被合并为单段(本质上还是proposal+classifier)。但是虽然Faster RCNN的主要目的是提高检测速度,实际检测速度是5帧(基于VGG),与实时检测仍有距离。
系统将输入图片分为S*S个栅格,如果目标中心落在哪个栅格,它就负责检测这个目标。
在YOLO中,目标的位置信息是根据栅格左上角的偏移量来表示的(用x, y, w, h表示,(x, y)是预测框中心在栅格中的坐标,w, h是基于原图的预测框的宽和高),这是目标中心位于某个栅格,这个栅格就负责检测的意义。
每个栅格会预测B个边界框,每个边界框都有置信度,这个置信度=是否有目标*IOU ,即
,所以每个边界框预测5个值:x, y, w, h, confidence。
每个栅格也会预测C个类的条件概率
,这是在有目标的条件下,各个类的概率。
所以YOLO的思路是将一整张图片输入,经过CNN提取特征,然后通过全连接层,最后输出 S × S × ( B ∗ 5 + C ) S\times S\times (B*5 + C) S×S×(B∗5+C)的特征向量,整个过程是端到端的,只需要看一次输入图像,这就是You only look once的意思。
比如在PASCAL VOC数据集,数据分为20类,使用 7 × 7 7\times 7 7×7的栅格,每个栅格产生两个预测框,最终输出就为 7 × 7 × ( 2 ∗ 5 + 20 ) 7\times 7\times (2*5 + 20) 7×7×(2∗5+20)的向量。
在测试时将类的置信度与含有目标的置信度相乘
就能得到每个类的置信度。
系统使用的CNN包含24个卷积层和两个全连接层,借鉴了GoogLeNet,使用了 1 × 1 1\times 1 1×1和 3 × 3 3\times 3 3×3卷积的组合。
在测试时对输出使用非极大抑制NMS(找出IOU最大的边界框、删去不满足阈值的边界框)就可以削减数量得到最终的结果。
NMS: 对预测同一类目标的目标框按照预测目标的置信度排序,选择一个置信度最高的目标框,如果其他的框与它的IoU大于某个阈值,就删除那个框。本质上是保留一个位置上预测最准的框,去掉与它重叠很大的框。
loss = 坐标误差 + IOU误差 + 分类误差
实际损失函数:
位置信息在输出中只有8个维度,分类信息有20维,为了平衡 =>
没有目标的栅格占比更多,可能导致网络不稳定甚至发散 =>
物体的大小差异对损失函数的影响有差异 => 使用平方根
详细解释:
注:
表示第i个栅格的第j个bbox是否负责检测该object(与该object的ground truth的IOU最大的bbox负责该object的检测),负责那么为1,否则为0.
优点:
1)快:只需要训练一个CNN,检测时YOLO达到45帧,Fast YOLO达到155帧
2)准确率优于其他实时模型模型
3)信息从全局提取,优于滑动窗口、区域建议等方法。Fast RCNN会错误地将目标识别为背景,由于其信息视野不够大,YOLO这一点做的更好。
4)泛化能力强:艺术作品中的识别准确度比DPM和RCNN更高。
缺点:
1)由于栅格的设计,对于多个小物体的识别不好。
2)准确率不够高:仍低于优秀的非实时检测模型,如FRCN。
You Only Look Once: Unified, Real-Time Object Detection
知乎:YOLO详解
https://zhuanlan.zhihu.com/p/25236464
博客园:目标检测之YOLO V1
https://www.cnblogs.com/wangguchangqing/p/10406367.html
YOLOv1取得了实时的检测速度,但是仍不能算是最先进的目标检测模型,因为它的准确率还不够高(对YOLO的错误分析显示它在定位上犯了大量的错误)。由此Joseph Redmon等人在YOLO的基础上,一步一步地添加已有的提高准确度的各种技术,也就是说YOLOv2 = YOLOv1+许多提高准确率的技巧。在堆叠了大量技术后,YOLOv2达到了state-of-the-art,准确率可以与Faster RCNN一较高下。
论文中的原话是“我们将过去工作中的大量想法与一些新的概念结合来提高YOLO的表现”
在得到了YOLOv2后,作者转向解决一个新的问题:目前的目标检测只能检测很少的目标类型(几十类),这是因为对用于目标检测的数据打标签要更加昂贵,所以用于目标检测的数据量要远少于用于分类的数据。作者希望能利用大量的分类数据,设计一种联合训练的方式***,使模型可以同时使用检测和分类的数据进行训练,以此来扩展检测的种类*。作者对YOLOv2模型进行了修改,使用ImageNet和COCO的数据进行联合训练,最终得到了YOLO9000,顾名思义它可以对超过9000个类进行目标检测。
多数检测框架使用VGG-16作为特征提取器,它效果很好,但是过于庞大,30.69billion的浮点运算,YOLO使用基于GoogLeNet的结构,需要8.52 billion的浮点运算,但是准确率比VGG低。因而作者提出了Darknet-19。
堆叠了 3 × 3 3\times 3 3×3和 1 × 1 1\times 1 1×1的filter,引入全局平均池化与batch normalization,最终的模型包括19个卷积层与5个池化层,5.58 billion的运算量。
一次训练会输入一批样本进入网络,batch normalization在神经网络的每一层,在激活函数之前层架一个批归一化层(BN),它对该批样本点各特征量分别进行归一化处理,使其均值为0,方差为1,然后再做一次线性变换,上一步的操作可能改变特征数据的分别,增加线性变换可以使它有机会恢复原本的信息。
批归一化有利于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数的敏感性,起到一定正则化的效果,从而得到更快的收敛速度。
预训练的分类图片通常是224*224分辨率,得到的模型适应此分辨率,而不适合分辨率更高的检测图像,所以对分类网络使用 448 × 448 448\times 448 448×448分辨率的图片进行微调,进行10个epoch,带来4% mAP的提升。
YOLOv2在每个位置预设一组anchor,用来识别此位置的的多种尺度的目标。作者将预测类与预测空间位置的机制拆解开,变为为每一个anchor box预测位置以及目标置信度。
对网络做相应的修改:
A. 将 448 × 448 448\times 448 448×448的输入改为 416 × 416 416\times 416 416×416,主要目的是最后的特征图为 13 × 13 13\times 13 13×13大小,使一个特征可以负责中心位置。
B. 将全连接层去掉,减少一个池化层,使用全局平均池化+softmax。
C. YOLO中输出为 S × S × ( B ∗ 5 + C ) S\times S\times (B*5+C) S×S×(B∗5+C), 也就是以栅格为单位预测; 在YOLOv2中变为每一个位置输出 a n c h o r n u m × ( 5 + c l a s s n u m ) anchornum\times (5+classnum) anchornum×(5+classnum)
使用anchor的结果:
产生超过1000个anchor boxes,但是mAP有些许下降69.5=>69.2,有点是召回率上升,81%=>88%,这代表着有更大的提升空间。
Faster RCNN人工选出9种不同大小与比例的anchor boxes。
相比人工挑选anchor box比例的不确定性,作者又希望使用一种方法来自动找出最好的anchor box的比例和数量,这个技术叫Dimension Clusters。作者对所有ground-truth box做聚类分析,找出平均IOU最好的一组anchor。使用这种方法找到的5个anchor优于人工选择9个anchor,这也是作者使用的方案。
原方法:直接预测box的坐标,预测出的坐标可能在图片的任何位置,不稳定,难收敛。
现方法:将预测框的中心限制在某个栅格内。
ResNet中的残差块:将前面某层卷积层的输出与当前输出直接相加然后通过relu。基本思想是:如果网络已经足够大,目前已经学到了很好的特征,那么特征是不需要在变动的,但是后面的卷积层想要与之前得到的结果相同是十分困难的,由此将残差块作为捷径将它们连接。
许多目标尺寸很小,所以作者希望模型预测时能有更细的粒度,类似于ResNet的思想,作者在最后一个池化层之前,将特征图拆为4份,然后与池化后的结果堆叠在一起。带来了1%的提升。
采用不同尺寸的输入进行训练:{320,352,…,608}。
作者希望找到一种机制,使模型可以同时使用分类与检测数据进行训练,以此来达到扩展检测种类的目的。基本思想是:如果遇到一张检测图像就按照YOLOv2的损失函数进行反向传播,如果遇到一张分类图像,则只传播分类损失。
通常如果我们想把两个数据集合并,需要满足的条件是他们的标签要么相同要么互斥,但是相比检测数据,分类数据种类更细致,比如检测的标签是dog,分类数据的标签则有更细致的Norfolk terrier(某个狗的种类),它们并不互斥。
解决方法:Hierarchical classification 层级分类
WordNet,一个语言数据库,将许多概念按关系组织起来,比如Yorkshire terrier与terrier和hunting dog相连,然后又与dog相连,最终所有概念都被组织在了一张网中。
作者找到所有的类对应的WordNet的节点,把它们与它们直到根节点的路径保留下来,如果不止一条路径,则仅保留最短的那条,那么作者就为他的数据构建出了一颗树,越向根节点走,概念越泛化,最终的根节点是physical object。
这种层级结构正好匹配我们对条件概率的理解,如果想要计算某一个节点的概率,只需要按照路径将从这个节点到根节点的所有概率相乘就可以。如果一个目标是柴犬,那么用1代表,同时它的上层,比如狗,哺乳动物等等也可以用1代表,而它下层的节点则用0代表。按照这种方式,每个节点的概率都可以计算:
举个例子:原本Darknet-19是基于1000个类的ImageNet建立的,加上WordTree中的所有中间节点,标签空间从1000扩展到1369,使用一个1369大小的向量代表。不需要对原来的网络结构做修改,因为扩展的节点可以用数学方法计算:对每个语义集使用一个softmax,相当于计算得到了它们的父节点的概率。
当数据的非互斥问题解决后,我们就可以将ImageNet 和COCO数据集合并了。
4)优点:当网络不能识别是哪类的狗时,至少可以识别出来dog类。
缺点:识别准确率略微下降
实际使用的数据是COCO目标检测数据集与ImageNet的前9000个类以及ImageNet detection challenge的数据,最终一共9418个类。为了减少计算了,将5个anchor减少为3个anchor。YOLOv2的输出是13135*(4+1+20),现在YOLO9000的输出是13133*(4+1+9418)。
对于分类损失计算的修改:对于一个检测样本,它的分类误差只包含该标签节点以及到根节点路径上所有节点的误差。如果一个样本的标签是狗,那么就没有必要计算它的子节点的误差,因为没有这些信息。对于分类样本只计算分类误差,直接找到类的预测概率最高的bbox,然后在它的树的路径上计算损失。
YOLO9000整体取得19.7%的mAP,其中156个类是完全没有任何用于检测的标签的,这156个类仍有16.0%的mAP。对YOLO9000结果的分析显示,它对新的动物类型的检测效果很好,但是对一些衣服、物品的效果不好,这是因为COCO里有关于动物和人的图片,但没有任何关于衣服的数据。
YOLOv1=>更换CNN模型、添加各种提高准确率的技术(Faster、Better)=>YOLOv2
YOLOv2=>WordTree融合数据,检测种类扩展(Stronger)=>YOLO9000
YOLO9000:Better, Faster, Stronger
简书:YOLOv2/YOLO9000深入理解
https://www.jianshu.com/p/517a1b344a88
YOLOv3没有在YOLO9000上做出巨大的改进,它的工作更多的是基于YOLOv2的思路,设计了一个新的网络结构(Darknet-53),并将当时的一些新的点子加到这个模型上,以此来提高YOLO系列目标检测模型的准确率。
YOLOv3的改进主要有:建立新的CNN模型(引入残差块);利用多尺度特征进行目标检测;在分类时使用Logistic代替softmax。
这篇文章比较随心所欲,最后作者阐述了自己一些关于计算机视觉的隐患(获取私人信息,军工等),并希望其他人在从事该领域时有更多的责任感。
Darknet-53:
在Darknet-19的基础上,作者引入了Resnet中的shortcut connection。
回顾:上图是Resnet的组成元素,残差块。残差网络的思想是当某层网络已经很好地学习到了特征,那么之后的层出现一点小的变化就会使性能变差,而让某层网络自学习来与之前某层相同是非常困难的。因此残差块将前面某层的输入直接加到后层,使网络很容易与前面某层相同,那么至少性能不会变差。
为了提高检测的粒度,作者引入了多尺度检测,同时对网络进行了扩充,最终的网络达到了53个卷积层。
为什么这样做会有更细的粒度:
1)将前面某层的特征图与当前层的特征图堆叠,由此就包含了前面更小的特征,这个方法与YOLOv2一致。
2)上采样:从感受野的角度考虑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-efx9YRpj-1601568418673)(file:///C:\Users\lenovo\AppData\Local\Temp\ksohtml20544\wps4.jpg)]
YOLOv3在3个不同的尺度上预测bbox。首先先按照v2的思路构建好网络,然后取出此输出层向前数第二层的特征图进行2倍上采样,然后从前面的某层取出特征图,将它们堆叠,按照这样的方法我们就可以得到粒度更细的语义信息了。然后作者又按照同样的方法又构建了一个尺度的模块,所以检测会基于三个尺度。因为有三种尺度,所以作者分别为它们设置了3个不同大小的anchor box。
每次上采样,感受野都在减小,直观的展现是:
蓝色是anchor box,黄色是ground truth,红色是中心所在的栅格
在这个模型中不能使用softmax,因为softmax对一个目标只能输出一个标签,而logistic支持多标签对象(如:Woman,Person)
一共有 13 × 13 × 3 + 26 × 26 × 3 + 52 × 52 × 3 = 10647 13\times 13\times 3+26\times 26\times 3+52\times 52\times3=10647 13×13×3+26×26×3+52×52×3=10647个预测
YOLOv3在速度和准确率上较为平衡,总之它是效果很好的检测模型。
YOLOv3: An Incremental Improvement
简书:YOLOv3 深入理解
https://www.jianshu.com/p/d13ae1055302
CSDN:YOLOv3网络结构和解析
https://blog.csdn.net/dz4543/article/details/90049377