资源经验分享框的故事——检测工作的一些总结

框的故事——检测工作的一些总结

2019-09-25 | |  94 |   0

原标题:框的故事——检测工作的一些总结

原文来自:CSDN      原文链接:https://blog.csdn.net/weixin_40955254/article/details/101170467


1、什么是检测

有人说,深度学习的最终目的就是在图片上画个框;我说,一派胡言;但是检测的目的确实是画一个框就ok了。

这里记下,差一张图

检测是分类任务的进展,也是目前来说深度学习突破最大,可能对社会生产产生较大影响力的一种技术。而且可以作为一系复杂任务的基线,比如人脸识别就需要先定位去人脸在哪里,多目标分类,也需要分别定位出一张图上不同目标的位置,然后再根据不同的位置做相应的分类工作。所以说虽然只是一个框,但是这个框吸引着许许多多的科研工作者在前赴后继的做着努力。


2、检测技术综述

由于个人research经验有限,所以我只能从深度学习开始讲起,更原始的一些古籍我也还没有看,但是我觉得如果想更深入的研究,那些古籍的阅读是有必要的(古籍指基于机器学习的检测方法)。现有的检测框架主要可以分为三类:two stage的方法,这类方法中的典型就是RCNN系列,这种方法基本的方法思路是先利用RPN层提出ROI,然后再ROI pooling到feature map上,在利用这些信息回归出检测框。one stage的方法可以分为两种,比如以SSD,Yolo,retina net为代表的anchor based的方法以及这两年突然火起来的以center net,Conner net为代表的anchor free的方法。下面给大家笼统的讲讲:

2.1 two stage的方法

说到two stage的方法就绕不开RCNN系列,可以说RCNN系列开辟了two stage系列的检测框架。那么初学者的同学可能要问了,什么是two stage,别着急,我大概的给你描述一下。

2.1.1 RCNN

下图所示是RCNN的框架,我们可以看到输入一张图,首先通过传统的方法selectively search这样的传统方法挑选出大约两千个左右的建议框,然后对于每个建议框送到CNN中去提取特征,然后进行分类。大致的流程可以总结为下面;

a.输入一张多目标图像,采用selective search算法提取约2000个建议框;

b.先在每个建议框周围加上16个像素值为建议框像素平均值的边框,再直接变形为227×227的大小(这里的277这个尺寸,是因为采用的alexnet作为输入,他的尺寸要求是277*277,如果换成其他网络对应修网络就行);

c.先将所有建议框像素减去该建议框像素平均值后,再依次将每个227×227的建议框输入AlexNet CNN网络获取4096维的特征,2000个建议框的CNN特征组合成2000×4096维矩阵;

d.将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘,举例这有20个种类,而SVM是二分类器,所以就需要二十个SVM,获得2000×20维矩阵表示每个建议框是某个物体类别的得分;

e.分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框;

f.分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。
 

20190922224825221.png

2.12 Fast RCNN

上面的框架有没有觉得有一丝丝不协调,不是深度学习框架嘛,为什么要用selective research,为什么要用SVM,为什么?所以这里的作者就说,我要直接用深度学习去先提取一个feature,然后所有的RPN直接从feature上提取特征,速度就能得到大大的提高。这么做的效果就是网络不再需要对于每个建议框单独的去提取feature,这是个极其繁琐的过程,fast rcnn省去了这个过程中大量的操作时间。

2.png

2.1.3 Faster RCNN

那么为什么最出名的是faster rcnn呢,这是因为faster rcnn想说,既然深度学习这么牛,为什么还要通过selective research来选出建议框呢,我建议直接上NN,于是faster rcnn成为了第一个stage-to-stage的two-stage的检测框架。

如下图所示这是faster rcnn的框架,一张图经过一个basebone,可以是vgg16,resnet,mobinenet等任何网络,提取出一个合适大小的feature map。然后这个feature map会有两步操作,第一步就是feature map经过卷积,分别给出一个RPN bbox的分支以及RPN score的分支,然后这两个分支会经过一个proposal operation的步骤,会对RPN部分大量的建议框进行裁剪以及NMS的筛选,然后得到的部分在two stage的方法中我们把它称为ROI

注意了然后就到了我们一直讲的feature map上的第二个操作,我们会把ROI得到的区域映射到fature map上,然后把这个过程称为ROI pooling,然后ROI pooling后得到的特征ROI feature,再通过卷积池化等操作送入子结构得到最后的bbox以及score的结果。

3.png

2.1.4 SPP net

SPP net这个框架也许你并没有听说过,但是你要知道这是一个很强的网络。SPP的全称,Spatial Pyramid Pooling空间金字塔池化。主要的贡献有两个,第一,首次把金字塔的概念引入了网络中,实现了数据的多尺度输入。第二,提出了feature map共享的概念,也就是说所有的RPN从一个区域去抠取特征图,加快了网络的计算速度。

在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。

4.png


2.2 one stage的方法

one stage的方法是什么意思呢,就是竟然神经网络这么牛逼,我为什么要繁琐的先挑出建议框,然后再从建议框经过nms,要知道nms可是特别消耗时间的.为什么不能直接回归呢,所以one stage的方法就是说直接从图片输入提取特征,然后在特征图上每个点会有一个anchor size和anchor ratio,注意这部分所讲的一些one stage的方法都是指anchor based的方法,关于anchor free的方法我会在下一部分进行讲解.one stage方法中最具代表性的有这几个:YOLO,SSD等. One stage的方法省去了region proposal之后,最大的一个突破就是可以做到实时,YOLO甚至可以达到155fps这样的速度.

2.2.1 YOLO(YOU LOOK ONLY ONCE)

YOLO 的核心思想就是利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别。具体的描述方法大致可以归纳为:将一幅图像分成 SxS 个网格(grid cell),如果某个 object 的中心落在这个网格中,则这个网格就负责预测这个 object。

5.png

每个网格要预测 B 个 bounding box,每个 bounding box 除了要回归自身的位置之外,还要附带预测一个 confidence 值。举例来说,在实现的过程中,每个grid最后会输出一个30维的信息,其中两维的confidence,8维的坐标信息,20维的类别信息.

虽然每个格子可以预测 B 个 bounding box,但是最终只选择只选择 IOU 最高的 bounding box 作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是 YOLO 方法的一个缺陷。

2.2.2

虽然YOLO的速度得到了大大的提升,但是YOLO有个过不去的死结,就是精度低呀,用精度去换速度这样的事说到底还是一个权衡,所以这时候就有人提出了SSD.

SSD不仅在速度上优于two stage的方法,而且在性能上也可以和传统方法相媲美.那么是什么使得SSD这么强呢?有观点认为主要是以下三点原因:

1 利用多尺度信息,能够有效的解决了尺度多样性的问题.SSD使用6个不同特征图检测不同尺度的目标。低层预测小目标,高  层预测大目标。

6.png

2 多种anchor和size的anchor,有同学也许要问了,anchor不是two stage中的方法嘛,这里着重强调,不是!!! RPN是区别two stage和one stage的一个有效手段,而anchor在one stage的方法中也会得到大量的应用的是.anchor的方法一般是基于feature map,然后映射到原图上,所以其实充当了一部分RPN的作用.

7.png

3 有效的数据增强,也许很少有人会注意到是作者在论文中强调的一点.一个有效的增强方法是随机crop.实验证明这个方法很有效,所以不要放弃对数据的增强处理.


2.3 无处安放的retina net

我纠结了好久决定为了retina net单开一章,因为不知道如何进行归类,retina net的效果堪比two stage的而速度堪比one stage的.而且他的网络结构也是相当的简单,就是一个FPN金字塔网络,而造成这个神奇效果的就是引入了focal loss这么一个关键.

那么focal loss为什么可以work呢?这就得谈谈类别不平衡的一些问题了,我们知道two stage的精度比one stage的高,但是速度会慢很多,为什么two stage的精度很高呢,是因为在第一个部分就会通过nms或者OME之类的方法筛掉大量的背景以及置信度低的框.而在one stage的方法中,我们可以看到会生成大约一万甚至一百万这么多的建议框,这简直就是巨大的,而我们真实的目标往往可能只有几个或者几十个,大量的可以确定类别的背景信息会产生一个很小的loss,然后大量的loss叠加就会是一个很巨大的量,这个量会混淆我们真实的损失信息.这就会造成我们最后的训练结果被多数但包含信息量却很少的负样本所支配,少样正样本提供的关键信息却不能在一般所用的training loss中发挥正常作用,从而无法得出一个能对模型训练提供正确指导的loss。

所以有个什么办法呢,很直接的一个想法就是我们给loss加上一个权重,对于确定类别的样本,给他一个很小的loss,对于类别不确定的样本,则赋予一个比较大的loss.这样的话就有效的解决了类别不平衡的问题.

基于focal loss在FPN的基础上简单搭建了一个网路,称为retina net,模型框架如下所示:

8.png


2.4 anchor free

最近一年,检测框架中anchor free的方法悄悄的就火起来了.出名的比如CornerNet、ExtremeNet、centernet、FSAF等等.

那么anchor free的方法为什么会火起来呢,这就要讲讲基于anchor的方法中存在的一些缺陷了:基于anchor的方法中,anchor ratio以及size的设置通常会是一种经验活,面对不同的任务,需要使用不同的超参进行调节,会使得模型的泛化能力变差;同样,大量的anchor,在计算IOU以及NMS的过程中会消耗大量的时间,使得模型的训练计算过程变得缓慢.

所以anchor free的方法就被提出来了,那么有人也许就要问了.那么anchor free又有什么样的好处呢?anchor-free一般会得到更多的正样本。具体原因是基于anchor的目标检测方法通常认为anchor与gt之间的IOU大于0.7/0.5为正样本,下图由于IOU小于0.5/0.7而被认为是负样本或ignore。而anchor-free的方法一般会认为中心点落在gt内部即为正样本。

9.png

2.4.1   center net

center net中将目标作为一个点——即目标BBox的中心点。我们的检测器采用关键点估计来找到中心点,并回归到其他目标属性,例如尺寸,3D位置,方向,甚至姿态。

center net中通过目标中心点来呈现目标(见下图),然后在中心点位置回归出目标的一些属性,例如:size, dimension, 3D extent, orientation, pose。 而目标检测问题变成了一个标准的关键点估计问题。我们仅仅将图像传入全卷积网络,得到一个热力图,热力图峰值点即中心点,每个特征图的峰值点位置预测了目标的宽高信息。

CenterNet整体结构如下图所示,用一组角点及中心点表示每个目标物,在CornerNet的基础上增加了一个用于预测center keypoint的heatmap,同时,预测cneter keypoint的偏移,然后基于CornerNet提出的方法选择前k个候选框。

10.png

2.4.2    corner net

这篇发表在ECCV上的工作,主要包括两个很有特色的角度:首先将目标检测变为关键点检测,通过检测左上角和右下角来获得关键框的位置,并且通过这种方法取消了anchor的使用.其次提出了corner pooling这样的概念.

网络的框架如下图所示:通过两个级联的Hourglass提取了特征,然后会经过两个分支,分别对应于左上角和右下角.每个分支包含一个Corner pooling层以及三个输出,分别是heatmap,embedding以及offsets.

heatmaps是输出预测角点信息,用维度为CHW的特征图表示,C表示目标的类别(没有背景类),这个特征图的每个通道都是一个mask,mask的每个值该点是角点的分数,,可以看作类似于高斯密度图,值越大的地方出现角点可能性就越大;embeddings用来对预测的corner点做group,也就是找到属于同一个目标的左上角角点和右下角角点;offsets用来对预测框做微调,这是因为从输入图像中的点映射到特征图时有量化误差,offsets就是用来输出这些误差信息。
 

11.png

下面介绍一个很关键的部分,我们都知道用左上角和右下角确定的矩形框去表示目标往往是不靠谱的,因为在图片上面我们检测的物体往往是不具备有一个明确的左上角和右下角的,但是考虑到左上角角点的右边有目标顶端的特征信息,左上角角点的下边有目标左侧的特征信息,因此如果左上角角点经过池化操作后能有这两个信息,那么就有利于该点的预测,这就有了corner pooling。

12.png

2.4.3 FSAF

文章来自卡内基梅隆,研究方向是针对单阶段目标检测算法的优化,尤其是RetinaNetSSD的优化。

提出一种简单有效的方法,叫做无锚点特征选择模块。它可以用于解决启发式引导特征选择和基于重叠的锚点采样两个以前算法受限的问题;使用大量的目标检测基准实验证明了本文提出的方法的有效性。骨干网络为ResNeXt-101的RetinaNet加上FSAF模块后,mAP提升1.8%,前向推理时间仅仅增加6ms,在COCO上所有单阶段目标检测器中达到了SOT的水平。

13.png


3 总结

想着是写一个类似于大综述样式的东西,但是真的太懒了,所以就删了又删,就为了赶紧写完,上述的一些有自己思考的,有借鉴别人的,希望能够对读到这里的同学有所帮助.

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:尝试混搭,告别格子衫,这个GAN帮你展示真人高清混搭效果

下一篇:在modelarts上部署backend为TensorFlow的keras模型

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...