目标检测综述

文章目录

目标检测器

摘要——目标检测作为计算机视觉中最基本和最具挑战性的问题之一,已经获得了广泛的认可。近年来受到重视。它在过去二十年的发展可以看作是计算机视觉历史的一个缩影。如果我们认为将今天的物体检测作为深度学习力量下的技术美学,然后将时钟倒转 20 年见证冷兵器时代的智慧。本文根据其技术广泛回顾了 400 多篇目标检测论文演变,跨越了四分之一个世纪的时间(从 1990 年代到 2019 年)。本文涵盖了许多主题,包括历史上的里程碑检测器、检测数据集、指标、检测系统的基本构建块、加速技术,以及最近最先进的检测方法。本文还回顾了一些重要的检测应用,例如行人检测、人脸检测、文本检测等,并对其面临的挑战和技术进行深入分析。

目标检测发展历程时间线:

image-20220309213136059

I、传统检测器

一、VJ检测器

最直接的检测:滑动窗口法

集成三个技术:

1)积分图像:用Haar小波作为特征图像表示

2)特征选择:用Adaboost算法

3)检测级联。

二、HOG检测器

梯度方向直方图法:在密集的均匀网格中计算并且使用重叠的局部差异归一化方法(在块上)以取得高准确率。

为检测不同尺寸的物体,HOG检测器要多次重塑输入图像的尺寸而保持检测器窗口大小不变。

三、DPM模型

是HOG检测器的延伸,大概思路就是先分开再集成,由“star-model”完成,然后演变为“mixture-model”,后者主要解决真实世界中变性更大的物体。

DPM模型由根滤波器和大量分滤波器构成。DPM使用弱监督学习方法使得分滤波器的所有参数配置(大小、位置)都可以以潜在变量的形式被自动学习到。后人将这种方法延伸为多实例学习,同样一些重要的技巧如难分样本挖掘、边界框回归、背景检测被用于提高检测准确率。

DPM模型对后面重要的影响有模型堆叠难分样本挖掘边界框回归等等。

1、难分样本挖掘(hard negative mining)

难分样本挖掘(hard negative mining)的解释:

首先说明一下,什么是负样本?说白了就是对分类器迷惑性大的样本,这类样本的实际标签是负的,但是分类器往往预测为正的。

难例挖掘是指,针对模型训练过程中的困难负样本,重新训练它们。

在目标检测中我们会事先标记好ground_truth,接下来在图片中随机提取一系列sample,与ground_truth重叠率IoU超过一定阈值的(比如0.5),大于则认为它是positive sample,否则为negative sample,(注意:这里的positive sample中也会包含有负样本(即,假阳),而这里的negative sample组成的集合就是之后说的负样本集合)。

考虑到实际负样本数>>正样本数,我们为了避免network的预测值少数服从多数而向负样本靠拢,取正样本数:负样本数大约为1:3,显而易见,用来训练网络的负样本为提取的负样本的子集,那么,我们当然选择负样本中容易被分错类的难分负样本来进行网络训练。

然后使用这个样本集合去训练我们的网络,再用训练好的网络去预测,选择其中得分最高(得分越高,越容易被当成正例)的前k个negative sample,也就是k个hard negative sample。再将这k个加入到负样本集中,重新训练网络,循环往复,然后就会发现网络的分类性能更好了。

2、边框回归

问题1:为什么要边框回归?

image-20220310150002446

对于上图,绿色的框表示Ground Truth, 红色的框为Selective Search提取的Region Proposal。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5), 那么这张图相当于没有正确的检测出飞机。 如果我们能对红色的框进行微调, 使得经过微调后的窗口跟Ground Truth 更接近, 这样岂不是定位会更准确。 Bounding-box regression 就是用来微调这个窗口的。

问题2:边框回归是什么?

image-20220310151107434

对于窗口一般使用四维向量来表示,分别表示窗口的中心点坐标和宽高。 对于上图红色的框 P代表原始的Proposal, 绿色的框 G 代表目标的 Ground Truth, 我们的目标是寻找一种关系使得输入原始的窗口 P 经过映射得到一个跟真实窗口 G更接近的回归窗口。

边框回归的目的既是:给定原始的Region Proposal和Ground Truth并寻找一种映射, 使得Region Proposal中心点越来越接近Ground Truth中心点,且宽高也越来越接近。

问题3:怎么做边框回归?

经过何种变换才能从上图中的窗口 P 变为窗口G_hat呢? 比较简单的思路就是: 平移+尺度放缩

image-20220310152052499

​ 线性回归就是给定输入的特征向量 X, 学习一组参数 W, 使得经过线性回归后的值跟真实值 Y(Ground Truth)非常接近。那么 Bounding-box 中我们的输入以及输出分别是什么呢?

输入:是这个窗口对应的 CNN 特征,也就是 R-CNN 中的 Pool5 feature(特征向量)。 (注:训练阶段输入还包括 Ground Truth, 也就是下边提到的)

输出:经过 Ground Truth 和 Proposal 计算得到的真正需要的平移量和尺度缩放量。也即R-CNN中的6~9式。

image-20220310152649206

II、基于CNN的两阶段检测器

深度学习时代,目标检测分为:两阶段检测和单阶段检测。

两阶段:生成region proposal+验证检测

单阶段:提取一次特征就可以实现

一、R-CNN(将CNN带入目标检测)

R-CNN想法:从通过可选搜索提取一系列目标候选框开始,然后每一个框都被重塑为尺固定寸的图像然后将之喂到CNN中去在ImageNet数据集中训练并提取特征,最后用线性SVM分类器去预测目标在哪个区域出现并判断目标的类别。

R-CNN缺点:在重叠的边界框上(一张图像接近于2000个边界框)做冗余的特征计算导致检测速度很慢。

二、SPPNet(克服RCNN缺点)

何凯明提出的空间金字塔池化网络(Spatial Pyramid Pooling Networks)。

SPPNet改进点:之前的AlexNet等网络都需要一个固定尺寸的输入图片,SPP的贡献在于引入了空间金字塔池化层使得CNN可以生成固定长度的特征表示,不需考虑图像以及感兴趣的区域,也无需rescale。

​ 当使用SPPNet做目标检测时,特征图可以从整张输入图像中计算得到,而且仅需计算一次,然后就生成了固定长度的任意区域的特征表示以训练检测器,这避避免了卷积特征的重复计算,SPPNet速度较R-CNN快20倍。

SPPNet缺点:(1)仅微调了FC层而忽略了所有FC之前的层;(2)仍然是多阶段训练。

三、Fast R-CNN(克服SPPNet缺点)

贡献:可以在相同的网络配置中同时训练检测器和边界框回归器,在VOCO7数据集中,,它的mAP从R-CNNN的58.5%升到了70.0%,且速度也比R-CNN快200倍。FastR-CNN结合了R-CNN和SPPNet的优点。

缺点:检测速度仍受限于Proposal检测。

衍生问题:我们能用CNN模型来生成目标Proposal吗?

四、 Faster R-CNN(回答了fast R-CNN问题)

它是第一个端到端、近乎实时的深度学习检测器

主要贡献:提出区域生成网络(RPN),这使得region proposal的生成几乎是无耗费的。从Fast R-CNN到faster R-CNN,目标检测系统的大部分单个块如proposal检测、特征提取、边框回归等都逐渐成为一个统一的、端到端的学习框架。打破了fast R-CNN速度上的瓶颈。

缺点:计算冗余。

改进:后面针对这个缺点提出了RFCN和Light head RCNN。

五、特征金字塔网络(FPN)

在faster R-CNN基础上提出了FPN,在FPN之前所有的深度学习检测器都是仅仅在网络顶层做检测,尽管CNN网络深层的特征对分类有益,但对于目标的定位却无益。因此一个自上而下的单边连接的结构产生了(FPN),用于在所有尺度上构建高级语义信息,因为CNN可以通过前向传播的方法构建一个特征金字塔,所以FPN对于不同尺度的检测目标都是先进的,在faster R-CNN系统基础上用FPN结构可以达到在MSCOCO数据集上单模型的SOTA水平。FPN是最近一段时间检测器(2019年前后)的基础构建块。

III、基于CNN的单阶段检测器

一、YOLO(You Only Look Once)

第一个深度学习时代的单阶段检测器。

优点:快、准,抛弃了之前的两阶段检测模式(提案检测+验证)。

遵从原则:在全图上应用单个神经网络,网络将图分为regions、预测边框和每个region同时出现的可能性。

缺点:相对于两阶段检测器,YOLO的定位准确率一般,特别是小物体检测不准。

改进版本:YOLOv2、v3在保持速度的情况下大大提高准确率。YOLO后来的版本和SSD更加关注于解决YOLOv1的缺点。

二、单发多框检测器(SSD)

第二个深度学习时代的单阶段检测器。

贡献:引入多参考和多分辨率检测技术,提高了检测精度,尤其是小物体。SSD同之前检测器的区别在于SSD检测网络不同层上的不同尺度的目标,后者仅仅在网络顶层上检测。

三、RetinaNet

问题:准确率方面,之前的单阶段检测器一直落后于两阶段检测器。

作者解释其中的原因为:在密集检测器的训练过程中会发生极端的前景-背景类别的不均衡。

解决措施:一个新的损失函数:focal loss引入到RetinaNet中,通过重组标准交叉熵损失以让检测器更注重于训练时的难分、错分样本。

优势:focal loss使得单阶段检测器可以达到两阶段检测器的精度,且仍可以维持探测的速度。

1、focal loss

对交叉熵损失改进:

image-20220312144941864

式(3)控制了正负样本对总的loss的共享权重,a取比较小的值来降低负样本(多的那类样本)的权重,因为在目标检测中负样本确实要远多于正样本。

image-20220312145204675

式(4)控制了易分类和难分类样本的权重。

将下式称为调制系数,目的是通过减少易分类样本的权重,从而使得模型在训练时更专注于难分类的样本。

image-20220312143824292

image-20220312145339691

式(5)既能调整正负样本的权重,又能控制难易分类样本的权重

focal loss的两个重要性质:

1、当一个样本被分错的时候,pt是很小的,那么调制因子(1-Pt)接近1,损失不被影响;当Pt→1,因子(1-Pt)接近0,那么分的比较好的(well-classified)样本的权值就被调低了。当pt趋于0的时候调制系数就趋于1(此时是分类错误的样本),也就是说相比原来的loss是没有什么大的改变的;当pt趋于1的时候(此时分类正确而且是易分类样本),调制系数趋于0,也就是对于总的loss的贡献很小。

2、当γ=0的时候,focal loss就是传统的交叉熵损失,当γ增加的时候,调制系数也会增加。 专注参数γ平滑地调节了易分样本调低权值的比例。γ增大能增强调制因子的影响,实验发现γ取2最好。直觉上来说,调制因子减少了易分样本的损失贡献,拓宽了样例接收到低损失的范围。当γ一定的时候,比如等于2,easy example(pt=0.9)的loss要比标准的交叉熵loss小100+倍,当pt=0.968时,要小1000+倍,但是对于hard example(pt < 0.5),loss最多小了4倍。这样的话hard example的权重相对就提升了很多。这样就增加了那些误分类的重要性。

注:

①focal loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失的贡献。

②在实验中a的选择范围也很广,一般而言当γ增加的时候,a需要减小一点(实验中γ=2,a=0.25的效果最好)

数据集(大型)和衡量指标

一、数据集

1、Pascal VOC

逐渐没落、成为测试新检测器的图床

Pascal VOC2007:5k张训练图片、12k标注目标,包括20个类别的物体

Pascal VOC2012:11k张训练图片、27k标注目标,包括20个类别的物体

2、ILSVRC

ILSVRC检测数据集包括200个类

ILSVRC-2014:517k张图片,534k个标注目标。

3、MSCOCO

最有挑战性的数据集,类别比ILSVRC少。与ImageNet一样都已经成为了目标检测的标杆数据集。

MS-COCO:164k张图片,897k个标注目标,80个类别。

与VOC和ILSVRC区别:除了有边框注释外。还使用每个实例分割进一步标记每个目标,以助定位准确。MS-COCO还包括更多小物体(面积仅占全图的1%)和更多所处位置密集的物体。使得MS-COCO的物体分布更接近于真实世界。

4、Open Images(OID)

目标检测方面数据集:1910k张图片、15440k个标注的边框、600个目标类别。

image-20220312153128459

image-20220312153141374

image-20220312153150773

二、衡量指标

早起行人检测衡量方法:每个窗的未命中率与假阳性率(FPPW)→每张图的假阳性率吧(FPPI)。

近几年目标检测衡量方法:

①AP(Average Precision):在VOC2007提出。AP定义为不同召回率下的平均检测精度,通常以特定类别的方式进行评估。

②mAP(mean AP):平均所有目标类别的mAP通常用作性能的最终指标。

目标定位准确率衡量指标:

IoU(Intersection over Union ):用来检查预测框和GT框间的IoU是否超过预定义阈值,如超过那么就认为物体被检测成功,否则就认为是检测失败。基于IoU值为0.5的mAP的衡量方法已经成为近年来(2019)目标检测的标杆。

虽然目标检测的衡量方法变化很大,但是基于VOC/COCO数据集的mAP仍然是目标检测中使用最频繁的评价指标。

mAP的定义及计算

image-20220310155011419
做以下定义:
TP:飞机(正样本)被识别为飞机(正样本)
TN:大雁(负样本)被识别为大雁(负样本)
FP:大雁(负样本)被识别为飞机(正样本)
FN:飞机(正样本)被识别为大雁(负样本)
image-20220310155345962

1、Precision计算 (表示定位的准确率)

image-20220310155742032
其中的n代表的是(True positives + False positives),也就是系统一共识别出来多少照片 。

详细过程:首先是precision就是用TP除以总的detection的数目(你预测处来的框的数目),注意我们在计算AP的时候要首先要计算precision。在我们实际计算的时候是一个序列,如果我们一共有N个detections那么它就是一个长度维N的序列,我们计算Precision的时候是针对某一个类别的,首先确定一个类别,然后对这个类别的所有的检测结果按他们得到的分数也就是confidence进行从大大小排序,然后我们每次取一个结果出来不管这个detection是TP还是FP,all detections都要加1也就是在实际计算的过程中上述的公式中的all detections是一个递增变化的数,每次取一个框就加1,然后每次取一个框出来如果这个框是TP那么TP的数目就加1,然后TP和all detections比值作为当前的precision,这样取完所有的框就有了N个precision组成的一个序列。

2、recall计算(表示找到了多少个目标物的量)

image-20220310155811164
Recall的分母是(True positives + False negatives),这两个值的和,可以理解为一共有多少张飞机的照片(Ground Truth)。

详细过程:recall也是一个长度维N的序列,其中N是我们得到detections的数目,我们每取出来一个框如果这个框是TP,那么TP的数目就加1,然后我们用当前的TP数目来除以all ground truths来得到当前的recall,这里要注意all ground truths就是我们这数据集中所有的这个类别的目标的数目,对于一个特定的数据集的一个特定的类别这是一个定值。所以把所有的框都取完之后我们就得到两个长度为N的序列 。

3、什么是IoU?

image-20220310154045694

4、AP的计算

AP的由来:在计算时发现多取一些框那么recall就可能比较的高,但是这样就可能会使得precision降低,所以在模型如果不是特别特别精确的情景下,这两个量是相互矛盾的,所以我们对于不同的场景可能就必须要选择到底要照顾那一边。那么对于普适的情况下我们就要综合考虑二者的取一个平衡,也就有了我们的AP这个指标。

image-20220312160935265

详细过程:首先取到了第n种recall的取值,然后往后看直到出现不同的recall,然后我们在这个区间里找到最大的precision,然后用这个最大的precision和这两个recall的差值相乘作为这段区间的AP,然后我们遍历所有的区间然后把每段的AP加起来就得到了最后的AP 。

引入一个例子:首先假设一个数据集中的某个类别一共有7张图像,然后这些图像中绿色的框是ground truths,然后红色的框是我们得到的detections。

image-20220312162532499

首先按分数来给这些框排个序就像下面这样,然后要看下这些框到底是TP还是FP,但是这里有一个问题就是对于同一个ground truth我们可能同时有多个框和它的IOU都大于阈值,那么我么把它们都当做TP吗?肯定不是,这个时候我们就从这些框里面选一个和我们的ground truth重合率最大的一个框作为TP剩下的作为FP,注意这里是重合率大的留下而不是confidence大的留下。

image-20220312163259871

然后计算 precision和recall序列

image-20220408154010141
KaTeX parse error: Expected 'EOF', got '&' at position 16: 这里只以前三行为例计算一下:&̲\\ 对于目标R有:Prec…

然后现在来计算AP,在每个recall区间做相应的计算,即每个recall的区间内我们只取这个区间内precision的最大值然后和这个区间的长度做乘积,所以最后体现出来就是一系列的矩形的面积,还是以上面的那个例子为例,我们一共有recall一共变化了7次,我们就有7个recall区间要做计算,然后实际我们计算的时候人为的要把这个曲线变化成单调递减的,也就是对现有的precision序列要做一些处理 。结合代码理解:

def voc_ap(rec, prec, use_07_metric=False):  
    """ ap = voc_ap(rec, prec, [use_07_metric])   
    Compute VOC AP given precision and recall.
    If use_07_metric is true, uses the   
    VOC 07 11 point method (default:False).
  """   
    if use_07_metric:     
        # 11 point metric(以往的11点法计算AP)    
        ap = 0.
    	for t in np.arange(0., 1.1, 0.1):       
            if np.sum(rec >= t) == 0:         
                p = 0       
            else:         
                p = np.max(prec[rec >= t])       
            ap = ap + p / 11.
  	else:     
        # current AP calculation     
        # first append sentinel values at the end
        # 第一步:将recall开放的区间补成闭合的区间。mpre也做了对应的补偿
        mrec = np.concatenate(([0.], rec, [1.]))     
        mpre = np.concatenate(([0.], prec, [0.]))     				print(mpre)    
        # compute the precision envelope
        # 第二步:人为地把pre-rec曲线变成单调递减的
        for i in range(mpre.size - 1, 0, -1):       
            mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i])       	# to calculate area under PR curve, look for points     	 # where X axis (recall) changes value 
       # 第三步:用rec的区间长度乘以这个区间上的最大的pre(注意这里是处理后的pre)
            i = np.where(mrec[1:] != mrec[:-1])[0]       
            ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])     	   
            print(mpre)   
    return ap
5、mAP计算

AP是算一个类别的,mAP就是把所有的类别的AP都算出来然后求均值。

目标检测的技术演化

一、早期使用CNN的目标检测

受限于计算资源,虽然提出来一系列改进措施如:使用共享权重复制神经网络和空间替代网络的方法以此来通过扩展每一层CNN使得网络可以覆盖整个输入图像来减少计算量。用这种方式,仅仅通过网络一段前向传播的时间就可以提取到整张图任何区域的特征,这也被看做是现在全卷积网络(FCN)的雏形。

二、多尺度检测技术演变

image-20220314111903925

对不同尺寸和不同纵横比的目标进行多尺度检测是目标检测的主要技术挑战之一。经历了多个历史阶段:特征金字塔、滑动窗(2014年前)→目标提案检测(2010~2015 →深度回归(2013~2016)→多分辨率检测(2016之后)

1、特征金字塔+滑动窗技术(2014年前)

JV检测器和HOG检测器是为检测具有固定纵横比的目标而设计的,都是简单的建立特征金字塔和在图上华东固定大小的检测窗。为解决可变纵横比图片的目标检测,那时提出了“混合模型”,即为不同纵横比的图片训练相应的模型,除此之外,基于范例的检测为训练集中的每个目标范例训练单个模型。

2、目标提案检测(2010~2015)

涉及到可能包含目标的候选框,在2010年首次应用于目标检测,这种方法避免了滑动窗在图像上从头滑到尾的现象,目标提案检测算法应满足下列三个条件:
①高recall率;②高定位准确率;③在前两个条件基础上增加准确率减少检测时间

现代提案检测算法可以分为三类:
①分段分组法;②滑窗得分法;③基于NN的方法

3、深度回归(2013~2016)

用深度学习取解决多尺度问题,如基于深度学习特征直接预测边框的坐标,优点是易于实施,缺点是定位不准(特别是小物体)。

4、多参照、多分辨率检测(2015~)

(1)多参照检测是目标检测中最流行的框架,主要的思想是:预定义一组不同尺寸和纵横比且处在一张图的不同位置的参照框(anchor boxes)。

典型loss由两部分组成:①用于分类的交叉熵损失;②用于目标定位的L1\L2回归损失。最终损失函数的普遍形式如下:

image-20220314095522097

这里t和t※分别是预测框和GT框所处位置,p和p※代表是何种类别的可能性,IOU{a,a※}是界于anchor a和它的ground truth a※之间的IOU,Ita代表IOU阈值(默认为0.5)。如果anchaor不包含任何目标,那么它的定位损失不出现在最终的损失中。

(2)多分辨率检测是检测网络不同层中不同尺度的目标,因CNN在前向传播时会构成一个特征金字塔,在深层很容易能够检测到比较大的目标,而在浅层很容易检测到比较小的目标。

总结:这两种方法都是现在SOTA方法中所采取的基础构建块。

三、边框回归技术演变

image-20220314111813551

目的是基于原始proposal或anchor box去微调预测框。

1、从BB到BB时期(2008~2013)

2、从特征到BB(2013~)

在Faster RCNN引入之后,BB回归不再只是作为一个单个的后处理块,还与检测器做了集成并以端到端的方式进行训练。与此同时,BB回归演变到了直接基于CNN特征去预测BB。

为得到更鲁棒的预测,smooth-L1函数开始盛行了。

image-20220314103202269

或者使用根平方函数image-20220408154244999

这两种函数都可以作为回归损失函数使用,还有使用标准化坐标的方法去得到鲁棒结果的例子。

四、背景启发的技术演变

image-20220314111830994

人脑利用物体和环境之间的联系去加强视觉感知和认知,在背景启发的发展历史有三个常用的方法:①用局部背景检测②用全局背景检测③背景交互。

1、局部背景检测

指要检测的对象周围区域中的视觉信息。 加入少量的背景信息会增加检测正确率,现在基于深度学习的检测器也可以用局部背景信息来提升性能,具体方法是扩大网络的感受野或目标提案的尺寸。

2、全局背景检测

全局背景利用场景配置作为目标检测的额外信息来源。早期目标检测器一个常用的整合全局背景的方法是整合构成场景的元素的统计结果;对于现代基于深度学习检测器,有两种方法去整合全局背景,①利用大感受野(可以大过输入图)②将全局背景信息看做是一种序列信息并且用NN来学习这些信息。

3、背景交互

背景交互是指通过视觉元素的交互传达的信息,例如约束和依赖关系。对于大部分目标检测器,目标实例的检测都没有利用它们之间的联系,现在具有背景交互的目标检测器可以分成两类:①寻求目标个体之间的联系②寻找在目标和场景之间的模型依赖关系。

五、非最大抑制(NMS)技术演进

image-20220314111949447

因为相邻窗有相似的检测分数,NMS用于后处理以移走复制后的边框并得到最终的检测结果。早期一般都不会整合NMS到目标检测器中,因为那时目标检测器系统的期望输出不是可知的。NMS发展为三种方法:①贪心选择法②边框聚合法③学习NMS法。

1、贪心选法

过时了,但在目标检测中实施NMS中最常用,不过还是有进步发展的余地。第一,最高得分框可能不是最合适的;第二,这可能会影响邻近的物体被检测到;第三,这不会影响假阳性样本被检测出。贪心选法仍是现在目标检测中最牛逼的基线。

2、BB聚合法

思想是多个重叠的边框将结合或聚类为一个最终的检测器,优点是这种方法全面考虑了目标之间的关系和空间布局,VG和Overfeat用了这类方法。

3、学习NMS

思想是将NMS看做一个滤波器去对所有新的检测结果重新评分,并且将NMS当做网络的一部分以端到端的方式进行训练,这种方法对于提升遮挡和在传统手工NMS方法上做密集目标检测都有帮助。

NMS应用与目标检测原理

目标检测pipeline:产生proposal后使用分类网络给出每个框的每类置信度,使用回归网络修正位置,最终应用NMS。

image-20220408155034282

NMS原理:对于BBox的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值Nt的框从B中移除.重复这个过程,直到B为空。

过程描述:其中用到排序,可以按照右下角的坐标排序或者面积排序,也可以是通过SVM等分类器得到的得分或概率,R-CNN中就是按得分进行的排序。如下图一样,定位一个车辆,最后算法就找出了一堆的方框,需要判别哪些矩形框是没用的。NMS的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。

image-20220408155503132

①从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

②假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。(常用阈值为0.3~0.5)

③从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。就这样一直重复,找到所有被保留下来的矩形框。

NMS代码实现

def py_cpu_nms(dets, thresh):
    """Pure Python NMS baseline."""
    #x1、y1、x2、y2、以及score赋值
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]
    #每一个检测框的面积
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    #按照score置信度降序排序
    order = scores.argsort()[::-1]
    keep = [] #保留的结果框集合
    while order.size > 0:
        i = order[0]
        keep.append(i) #保留该类剩余box中得分最高的一个
        #得到相交区域,左上及右下
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])
        #计算相交的面积,不重叠时面积为0
        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        #计算IoU:重叠面积 /(面积1+面积2-重叠面积)
        ovr = inter / (areas[i] + areas[order[1:]] - inter)
        #保留IoU小于阈值的box
        inds = np.where(ovr <= thresh)[0]
        order = order[inds + 1] #因为ovr数组的长度比order数组少一个,所以这里要将所有下标后移一位
    return keep

六、难分样本挖掘(HNM)

image-20220314165258783

目标检测器的训练实际上是在解决一个不平衡数据学习的问题,旨在处理训练中不平衡数据的问题。

1、Bootstrap

训练开始于背景样本的一小部分,然后周期性地在训练过程中增加新的错分样本背景,早期bootstrap用于减少训练计算量,然后它就在DPM和HOG检测器中变成一种标准的训练技巧以解决数据不平衡问题。

2、HNM在深度学习检测器中的使用

为减少数据不平衡问题,像RCNN和YOLO这样的检测器在阳性和阴性窗之间平衡权重,然而却发现权重平衡并不能完全解决数据不平衡问题,在2016年bootstrap再度出现在深度学习检测器中。如SSD和OHEM,样本仅有很小一部分梯度可以被反向传播;在RefineDet中,设计anchor提炼模块去滤除易分阴性样本;还有一些改进是基于损失函数的,将标准交叉熵损失重建(如focal loss)让模型更多关注难分、错分样本。

HNM原理及方法

原理:在目标检测中我们会事先标记好ground_truth,接下来在图片中随机提取一系列sample,与ground_truth重叠率IoU超过一定阈值的(比如0.5),大于则认为它是positive sample,否则为negative sample,(注意:这里的positive sample中也会包含有负样本(即,假阳),而这里的negative sample组成的集合就是之后说的负样本集合)。考虑到实际负样本数>>正样本数,我们为了避免network的预测值少数服从多数而向负样本靠拢,取正样本数:负样本数大约为1:3,显而易见,用来训练网络的负样本为提取的负样本的子集,那么,我们当然选择负样本中容易被分错类的困难负样本来进行网络训练。然后使用positive sample这个样本集合去训练我们的网络,再用训练好的网络去预测negative sample,选择其中得分最高的前k个negative sample,也就是k个hard negative sample。再将这k个加入到负样本集中,重新训练网络,循环往复,然后就会发现网络的分类性能更好了。

方法:

①离线HNM:在样本训练过程中,会将训练结果与GroundTruth计算IOU。通常会设定一个阈值(0.5),结果超过阈值认为是正样本,低于一定阈值的则认为是负样本,然后扔进网络中训练。

流程:首先是通过训练集训练网络,训练完成,然后固定网络,寻找新的样本,加入到训练集中。很显然这将耗费很长的时间。

问题:随着训练的进行,这样的策略也许会出现一个问题,那就是正样本的数量会远远小于负样本,这样会导致数据的分布不平衡,使得网络的训练结果不是很好。
解决方案:针对这种导致不平衡的数据,有人提出了一种对称的模型类似下图,将Hard Posiotive也重新赋给正样本。

image-20220408163431317

②在线HNM(OHNM):训练的时候选择hard negative来进行迭代,从而提高训练的效果。简单来说就是从ROI中选择hard,而不是简单的采样。Forward: 全部的ROI通过网络,根据loss排序; Backward:根据排序,选择B/N个loss值最大的样本来后向传播更新model的weights。

流程:舍弃了Fast RCNN中的正负样本(ROI)比例为1:3,它通过每个ROI的loss值,对所有roi的loss排序,取B/N数量的roi组成mini batch。也即通过loss提高难样本的比例,让网络花更多精力去学习难样本。

问题1:位置相近的ROI在特征图中可能对应的是同一个位置,loss值是相近的。
解决方案:对hard做nms,取loss最大的ROI,然后再选择B/N个ROI反向传播,这里nms选择的IoU=0.7。

问题2:后向传播时,直觉想到的方法就是将那些未被选中的ROI的loss直接设置为0即可,但这实际上还是将所有的ROI进行反向传播,时间和空间消耗都很大。
解决方案:用两隔网络,一个只用来前向传播,另一个则根据选择的ROIs进行后向传播,的确增加了空间消耗(1G),但是有效的减少了时间消耗。

image-20220408164433095

在绿色部分的(a)中,一个只读的RoI网络对特征图和所有RoI进行前向传播,然后Hard RoI module利用这些RoI的loss选择B个样本。在红色部分(b)中,这些选择出的样本(hard examples)进入RoI网络,进一步进行前向和后向传播。同样是利用loss选择,但是针对的是two stage的方案,选取的是第一阶段的ROIs。

HNM代码实现

 # 在正负样本的挑选过程中,采用困难样例挖掘的方法进行筛选而不是简单的随机挑选;

def _sample_pos(self,
                assign_result,
                num_expected,
                bboxes=None,
                feats=None,
                **kwargs):
    # Sample some hard positive samples
    pos_inds = torch.nonzero(assign_result.gt_inds > 0)
    if pos_inds.numel() != 0:
        pos_inds = pos_inds.squeeze(1)
    if pos_inds.numel() <= num_expected: #如果样本量本身少于期望值不进行困难样本挖掘
        return pos_inds
    else:
        return self.hard_mining(pos_inds, num_expected, bboxes[pos_inds],
                                    assign_result.labels[pos_inds], feats)

def _sample_neg(self,
                assign_result,
                num_expected,
                bboxes=None,
                feats=None,
                **kwargs):
    # Sample some hard negative samples
    neg_inds = torch.nonzero(assign_result.gt_inds == 0)
    if neg_inds.numel() != 0:
        neg_inds = neg_inds.squeeze(1)
    if len(neg_inds) <= num_expected:
        return neg_inds
    else: #如果样本量多于期望值,进行困难样本挖掘进行筛选
        return self.hard_mining(neg_inds, num_expected, bboxes[neg_inds],
                                assign_result.labels[neg_inds], feats)

    
    
# 计算样本的损失值,根据类别的loss挑选出损失比较大的样本【困难样本】

def hard_mining(self, inds, num_expected, bboxes, labels, feats):
'''
inds: 正负样本的索引; 
num_expected:期望的正负样本数量; 
bboxes:正负样本【anchor】, 
labels:类别标签  feats:特征图
'''
    with torch.no_grad():  #不参与梯度的计算
        rois = bbox2roi([bboxes])
        bbox_feats = self.bbox_roi_extractor(
            feats[:self.bbox_roi_extractor.num_inputs], rois)
        cls_score, _ = self.bbox_head(bbox_feats)
        loss = self.bbox_head.loss(
            cls_score=cls_score,
            bbox_pred=None,
            labels=labels,
            label_weights=cls_score.new_ones(cls_score.size(0)),
            bbox_targets=None,
            bbox_weights=None,
            reduction_override='none')['loss_cls']
        _, topk_loss_inds = loss.topk(num_expected)
    return inds[topk_loss_inds]

检测提速

简单分为三类:①加速检测pipeline②加速检测机器③加速数值计算

一、特征图计算共享

目标检测的各个计算阶段中,特征提取占主导。对滑动窗口检测器来说,计算冗余是由位置和尺度引起的。前者是由于在邻近窗口会出现重叠,后者是由于邻近尺度会出现特征关联。

1、空间计算冗余和加速

​ 最常用方法:特征图计算共享,但这种方法的缺点是:特征图的分辨率(在特征图中滑动窗口的最小步长)将会被框的尺寸限制,如果一个小物体位于两个框之间,那么它会忽略所有的检测窗,解决这个问题的方法是构建一个积分特征金字塔。特征图计算共享的思想同样被用在了卷积检测器中,如SPPNet,Fast-RCNN和Faster-RCNN。

2、尺度计算冗余和加速

​ 最成功方法:直接衡量特征而不是图片,首先用在VJ检测器中。但是这样的方法因为模糊效果不能直接用在类似于HOG的特征上。对于此问题有研究者发现HOG相邻尺度和积分通道特征之间有强相关性,这个相关性可以通过逼近邻近尺度的特征图来加速特征金字塔的计算过程;建立检测器金字塔也可以避免尺度计算冗余,如通过在一张特征图(不是重构之后的图片或特征)上滑动多个检测器来检测不同尺度下的目标。

二、分类加速

目标检测中加速核分类器的方法最常见的有:模型逼近法,因为线性核SVM决策边界仅由训练样本中的一小批(即SV)决定,所以推理阶段的计算量与支持向量的数量呈正比。

方法一:约简集向量对核SVM来说是一个好的逼近方法,此方法旨在按照小批量的合成向量来得到一个等价的决策边界;

方法二:将决策边界近似为分段线性的形式已实现恒定的推理时间;

方法三:使用稀疏编码方法加速核方法分类。

三、级联检测

遵从由粗到细的检测原则:用简便计算滤除大部分简单的背景窗,然后用复杂的窗处理更加难分的窗。VJ检测器、HOG、DPM都用到这种技巧去加速检测。

近些年级联检测器也用于深度学习检测器,尤其是用于在大场景下探测小目标的检测中使用,如行人检测、人脸检测等。

级联检测的作用:①加速算法;②提升难例检测的性能;③整合背景信息;④提升定位准确率。

四、网络修剪和量化

网络修剪和量化是加速CNN模型的常用方法。网络修剪是指修建网络结构或权重以减小它的尺寸,网络量化是指减少激活或权重的编码长度。

1、网络修剪

常采取迭代训练和修剪的过程,如在每个训练阶段之后仅去除一小部分不重要的权重,然后重复训练和修剪过程。但是传统网络修剪是简单的移除一些不重要的权重,这会导致卷积核中部分连接模式变得稀疏,所以说这种方法不能直接用于压缩CNN模型,解决措施是:移除整个卷积核而不是独立的权重。

2、网络量化

网络二值化是当年网络量化方法的重点,旨在通过量化网络的激活或权重使两者转换成一个二进制变量来加速网络,变为二进制则浮点运算都将转换为逻辑运算(和或非)。网络二值化可极大地加速计算并减小网络存储,更加容易在移动设备上部署。

这种思想可能的实施方法是:用最小二乘法通过二进制变量来近似卷积,通过使用多个二进制卷积的线性组合可以得到更加精确的近似卷积。除此之外,还开发了用于二值化计算的GPU加速库,使得加速更加显著。

3、网络蒸馏

网络蒸馏是一个常见的框架,用来压缩大网络(teacher网)的知识到小网络(student网)中,现在这个方法用于会加速目标检测。最直接的方法是用teacher网络去指导student网络(权重较少)的训练以至于后者可用于加速检测另一种方法是对候选region做转换使得老师网络和学生网络之间的特征距离最小,这个方法使得检测模型在获得相同准确率的同时速度提升了两倍。

五、轻量化网络设计

网络设计原则:①更少通道更多层;②分解卷积;③组卷积;④深度可分离卷积;⑤bottleneck设计;⑥神经结构搜索。

image-20220314213220798

1、分解卷积(最简单、最直接的前向方式)

方法一:在空间维度上将一个大卷积核分解为一组小的卷积核。(如VGGNet中提出的用三个3×3卷积核代替一个7×7卷积核),或可将一个k×k卷积核分解为一个1×k卷积核和一个k×1卷积核。此方法最近常用于目标检测中。

方法二:在通道维度上将一大组卷积核分解为两小组卷积核,如上图c,可以通过用d’个卷积核+一个非线性激活+另外d个卷积核(d’ < d)来近似具有d个卷积核和c个通道特征图的卷积层。在本例中,原始层中计算复杂度O(dk2c)减少为O(d’k2c)+ O(dd’)

2、分组卷积

旨在通过将特征通道分成许多不同的组减少卷积层的参数量,然后在每一个组中单独进行卷积,如果我们将特征通道分成m个组,不改变其他的皮遏制,理论的计算复杂度会减少到原来的1/m。

3、深度可分离卷积

建立轻量化卷积网络来实现,当设定组数等于通道数时可被看做是一个分组卷积的特例。假定我们有一个卷积核数量为d和c通道的特征图的卷积层,每个卷积核大小为k×k,对深度可分离卷积层,每个k×k×c的卷积核首先被分成c片,使得每一片的尺寸是k ×k ×1,然后在每个通道中使用卷积核的每一片分别执行卷积操作,最后很多的1x1卷积核用来做维度转换因此最终输出应该有d个通道。这种思想被用于目标检测和细粒度分类中。

4、Bottleneck设计

bottleneck层中包含以前网络层中没有的一些节点,用来去学习输入的维度降低后的有效数据编码,常用在深度自动编码器上。近年来bottleneck设计多用于轻量化网络,最常见的方法是压缩检测器的输入层去减少来自检测器pipeline最开头的计算量,其他方法是研所检测器的输入使得特征图变小,使得随后的检测阶段变得更加高效。

5、神经架构搜索(NAS)

通过神经架构搜索法自动生成网络结构,NAS亦被用在大规模图像分类、目标检测以及图像分割任务中,NAS法也使得网络可以更加轻量化,局限在于在搜索过程中要同时兼顾预测准确率和计算量。

六、数值计算加速

在目标检测上经常使用的方法有:①用积分图加速;②在频域加速;③向量量化;④降秩逼近。

1、积分图加速

有助于加快计算图像子区域的总和,积分图的本质是信息处理中卷积的积分-微分可分性。可用来加速CNN模型,还可以用来加速在目标检测阶段中的普遍特征(如色彩直方图,梯度直方图),典例是通过计算积分HOG特征图来加速HOG:不是在传统积分图上做像素值的累加,HOG积分图累加了整张图的梯度方向。积分HOG图用在行人检测上使得保证准确率的同时可以增加速度。

image-20220316091227990

后来又提出了积分通道特征(ICF),可以看作是积分图特征的更普遍的例子,也被用在行人识别中,ICF在接近真实检测速度下达到了SOTA的检测准确率。

2、在频域下加速

卷积可以用多种方法加速,傅里叶变换是最实用的选择尤其对于大型卷积核,在频域加速卷积的理论基础是信号处理中的卷积定理,即在合适的条件下,两个信号卷积的傅里叶变换是它们在傅里叶空间中的逐点积。

image-20220316092617598

I是输入图,W是卷积核,F是傅里叶变换,F^-1是反傅里叶变换,*是卷积运算,·是点积,上述运算过程可以通过FFT和IFFT加速。FFT和IFFT常用来加速CNN模型和一些经典的线性检测器。

image-20220316092847930

3、向量量化

VQ旨在通过一小组雏形向量逼近一大组数据的分布,可被用来做数据压缩并加速目标检测的内积运算。例子是HOG直方图用VQ后可以分组并量化到一个雏形直方图向量上,然后在检测阶段,在特征向量和检测权重之间的内积是通过查表操作来完成的,因此这个过程没有浮点乘除法,检测器的速度通常可以加快一个数量级。

4、降秩逼近

旨在加速矩阵乘法,使得原先的高秩矩阵变成低秩,如Fast-RCNN检测器运算大部分都集中在FC层中的矩阵运算中,而截断SVD正则化方法减少了这类计算量,可以提高两倍速度。

最近目标检测方面取得的进步

一、用更好的Engine

目标检测新backbone:

STDNDSODTinyDSODPelee采用DenseNet

Mask-RCNN采用ResNeXt

为加速检测,Xception引入深度可分离卷积用在MobileNetLightHead-RCNN上。

二、用更好的特征检测

特征表示的质量对于目标检测来说是非常关键的,近年来的一些新方法有:①特征融合;②用大感受野学习高分辨率特征

1、为什么要特征融合

图像特征表示的两个重要的性质是不变性和同等性,分类更想要不变特征表示因为它旨在学习到高层次的语义信息,目标定位更想要同等性特征表示因为它旨在区分位置和尺度的变化。目标检测包括目标识别和定位两个子任务,因此学习两种性质对于目标检测来说至关重要。

因为CNN深层有很强的不变性但是同等性却比较弱,而浅层的特征对学习语义却没有帮助但可以帮助目标定位,因此结合CNN模型深层和浅层的特征有助于提高检测的不变形和同等性特征。

2、特征融合的不同方法

①加工flow

特征融合分为两类:自下到下融合(图a)和从上到下融合(图b),除了这两种方法还有跨层编织特征。因为不同层的特征图可能有不同的尺寸(根据空间和通道维度确定),因此需要将特征图调整到能够匹配的尺寸,最简单的方法是用最近邻或双线性插值法,还有用分步卷积(即转置卷积)的方法去调整特征图大小和通道数量,用分步卷积的优势在于可以通过自身学习到合适的方式来进行下采样

②逐元素运算

特征融合可以看做是在不同特征图之间的逐元素运算,分为三种方法:逐元素相加(图c)、逐元素做点积(图d)和级联法(图e)。

逐元素做点积相对于逐元素相加的优势在于可以压缩特征或强调某一特定区域的特征,这对于小目标检测是更有益的。特征级联优点在于可以结合不同区域的背景信息但是缺点在于会增加内存损耗。

image-20220316194631496

3、用大感受野学习高分辨率特征

感受野和特征分辨率是CNN检测器的两个重要特点,具有较大感受野的网络能够捕获较大范围的上下文信息,而具有较小感受野的网络可能更关注局部细节

增加特征分辨率最直接的方法是除掉池化层或减小卷积下采样率,但是这会导致感受野变得过小(因为步长减小了),换句话说这会使得检测器的“视野”变窄还会使得一些大目标错失检测。

扩张卷积(又空洞卷积或带孔卷积)是在语义分割任务中提出的,主要思想是增加卷积核数量且使用稀疏参数,如VGG提出两个3×3卷积感受野同一个5×5卷积,此方法现在广泛适用于目标检测中且可以有效提高准确率而不增加额外参数和计算量。

感受野定义:卷积神经网络每一层输出的特征图上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域。

感受野冷知识:

①最后一层(卷积层或池化层)输出特征图感受野的大小等于卷积核的大小;

②第i层卷积层的感受野大小和第i层的卷积核大小和步长有关系,同时也与第(i+1)层感受野大小有关;

③计算感受野的大小时忽略了图像边缘的影响,即不考虑padding的大小。

感受野计算:采用从最后一层往下计算的方法,即先计算最深层在前一层上的感受野,然后逐层传递到第一层,使用的公式可以表示如下:

image-20220316201608075

image-20220316201713780

若最后一层核大小为2×2,则RFi=2,后RFi-1用上述公式计算,以此类推。

三、滑窗之上

1、子区域搜索检测

方法一:将检测看做是一个路径规划过程,即从最初的网格到最后收敛于GT框

方法二:将检测看做是一个迭代更新过程提炼出预测边框的角

2、关键点定位搜索

用于计算机视觉、面部表情识别、人体姿态识别等任务。图像中的任何对象都可以由其GT框的左上角和右下角唯一确定,因此检测任务可以看做是成对关键点定位问题。一种有效实现是预测出角落的热力图,这种方法的优势在于可以在语义分割框架下实施,不需要设计多尺度的锚框。

四、定位的进步

两种方法:①边框提炼;②为定位准确率设计新损失函数。

1、边框提炼

可认为是对检测结果的后处理。

原因:仍然有许多出人意料的尺度难以被任何预定义的anchor捕捉到,这会导致定位准确率较低,针对此问题提出了边框提炼法

方法:迭代周期性地将检测结果喂给边框回归器知道预测收敛于正确的位置和尺寸

缺点:当这类方法应用时间长时,不能保证边框回归对于定位结果还能最优,甚至会退化。

2、为定位准确率提升损失函数性能

问题:现代检测器目标定位都可看做是坐标回归问题,这有两个缺陷:①回归损失函数与最终定位的评估没有联系;②传统BB回归不提供定位的置信度。多个BB框重叠时可能会导致非最大抑制的失效。

解决措施:设计新的损失函数,最直接的方法是用IoU直接作为定位损失函数;还有提出IoU指导NMS去高训练和检测阶段的定位性能;还有提出概率推理框架下的方法(与之前直接预测框坐标不同的是这种方法是预测框定位概率的)。

五、用分割来学习

可以通过学习语义分割来提高目标检测性能。

1、为什么语义分割可以提升检测性能?

①帮助分类判别(通过边缘判定)

②提升定位精度(可用语义分割特点编码目标边界)

③分割可以作为背景嵌入(飞机更可能出现在天空而不是水中)

2、分割怎样提升检测性能?

①学习丰富特征:最简单的方法是将分割网络看做固定的特征提取器并将网络作为附加特征集成到检测框架中。优点是实施简单,缺点是分割网络会带来额外计算。

②学习多任务损失函数:在原先的检测框架顶部引入额外的分割branch并用多任务损失函数(分割损失+检测损失)训练此模型。多数情况下分割段都在推理阶段被移除。优点是不影响检测速度,缺点是训练需要像素级的图片标注。然后针对此缺点提出了**“弱监督学习”**:不用在像素级图片标注下训练,只是在边框级标注下简单地训练分割branch就行。

六、鲁棒的旋转和尺度变化检测

CNN学习到的特征对旋转和大尺度变化不具有不变性,因此这成了一个大问题。

1、旋转鲁棒检测

目标旋转在检测任务中很常见(人脸检测、文本检测等)。

方法一:数据增强,使得数据集覆盖目标的任何方位。

方法二:为每一个方位训练单独的检测器。

方法三(当代):旋转不变损失函数:在原始检测损失函数中加入约束使得旋转过后的目标特征不改变。

方法四(当代):旋转校准即对你候选目标做几何变化,尤其对多阶段检测器有用,早期的相关性有利于后期的检测。空间变换网络(STN)使用了这个方法,用在旋转文本和人脸检测上

方法五(当代):旋转ROI池化,在极坐标中结合网格特征。

做旋转ROI池化的原因:两阶段检测器特征池化旨在为不同位置和尺寸的目标候选提取固定长度的特征表示,首先将候选平均分到一组网格中,然后将这些网格特征级联。因为网格结合是在笛卡尔坐标系中完成的,所以特征在旋转变换的时候就不具有不变性了。但是在极坐标中做网格特征结合会使得特征在旋转时仍具有鲁棒性。

2、尺度鲁棒检测

①尺度适应训练

原来的方法:重构输入图像到固定大小并反向传播所有尺度下的目标的损失。

image-20220318105116308

缺陷:出现尺度不平衡问题。

解决方法:

a、在检测阶段建立图金字塔(可以解决上面问题但不能从根上缓解);

b、对图金字塔做尺度归一化(SNIP):在训练和检测阶段都建立了图金字塔,但是只在选中的尺度上对损失做反向传播。

c、在SNIP上增加了有效重采样(SNIPER):如对一张图片做裁剪或重构为一组子区域使得可以受益于大批次的训练。

image-20220318105128121

②尺度适应检测

原先方法:大部分检测器都为不同带下的检测目标设定了固定的配置

缺陷:固定的配置对意料之外的尺度变化会不适应

解决方法:

a、自适应放大技术:自适应的将小目标放大。

b、在一张图中预测目标尺度的分布,然后自适应地通过此分布对图进行重缩放。

七、从头训练

1、是否需要预训练模型?

答:当在目标检测中采用预训练网络会有限制,如下:

①ImageNet分类和目标检测之间有分歧(损失函数、尺度\类别的分布)

②域不匹配。ImageNet图像是RGB格式,检测常用深度图像RGB-D格式或3D医学图,预训练知识不会很好的转移到检测任务中。

2、从零开始训练?

答:

加速训练并提高稳定性方法:密集连接和批归一化方法加速浅层的反向传播速度。

加速收敛方法:用ImageNet等数据集的预训练模型,但不一定提供正则化以及提高最终检测的精度。

八、对抗训练

1、什么是GAN网络?

GAN网络组成:生成网络+分辨网络,这两个网络在极大极小优化框架中相互竞争

生成网络:学习从一个潜在的空间映射到特殊的感兴趣分布数据。

辨别网络:从正式数据分布和生成器产生网络产生的数据中做辨析。

GAN网络应用:图像生成、图像风格迁移、图像超分辨率、目标检测(尤其是提高检测小目标和遮挡目标的性能)

2、GAN网络怎么用在目标检测?

增强小目标检测性能:缩小小目标和大目标之间的表示

增强遮挡目标检测性能:用对抗训练生成遮挡掩膜,对抗网络直接修改特征以模拟遮挡,而不是在像素空间中生成图例。

3、对抗攻击

学习用反例去attack检测器,现多用于自动驾驶中。

缺点:不能保证对抗攻击的鲁棒性。

九、弱监督目标检测(WSOD)

只在图像做标注而不是边框做标注的数据集上训练检测器

1、多例学习

多实例学习模型不是使用一组单独标记的实例进行学习,而是接收一组标记的包,每个包包含许多实例。如果将一个图像中的候选目标作为一个包,并且将图像级标注作为标签,然后WSOD就被公式为多例学习过程了。

2、类激活映射

类激活映射揭示了如何使得CNN在只有图像标签训练的情况下具有定位能力。

3、其他方法

①将WSOD看做一个提案排序过程,通过筛选出信息量最大的区域并且用图像级标注训练这些区域。

②掩膜滤除图像的不同部分,若检测分数急剧下降,那么目标很大可能就已经被覆盖进去了。

③交互注释在训练过程中考虑了人类的反馈以此提高WSOD性能。

④生成对抗训练方法(最近)

应用

行人检测、人脸检测、文本检测、交通信号灯检测、遥感目标检测

一、行人检测

拓展到了其他区域如:自动驾驶、视频监控、刑事侦查等方面

早期方法:HOG、ICF;现在方法:Fast-RCNN

1、难点和挑战

①小行人;②难分阴性样本;③密集遮挡的行人;④实时检测

2、文献回顾

a、传统行人检测方法

Haar小波特征、基于梯度的表示、DPM、ICF、除特征表示之外考虑了其他领域的知识如外观恒定性、形状对称性和立体信息。

**解决遮挡行人问题:**当时的方法是成分检测(将检测器看做是多个检测器的集成,粉检测器在人类的不同的部位单独做训练)

b、基于深度学习的行人检测

解决小行人检测问题:①特征融合;②引入额外的高分辨率手工特征;③在多个分辨率上集成检测结果。

解决难分阴性样本的问题:①增强决策树集成;②语义分割(作为行人的背景信息);③跨模型学习(利用RGB和红外图像丰富难分阴性样本特征)。

解决密集且遮挡行人问题:①设计新损失函数,考虑目标吸引力和其他周围物体的排斥性;②集成分检测器和注意力机制(解决遮挡行人检测问题中最常用)。

二、人脸检测

早期方法:VJ

拓展应用:数字照相机的笑脸检测、电商的扫脸支付、手机APP的美颜功能

1、难点和挑战

①类内变化(肤色,表情、手势、动作);②遮挡;③多尺度检测;④实时检测

image-20220318152036106

2、文献回顾

a、早期人脸检测(~2001)

①基于规则方法:对人类典型面部进行编码,并捕获面部元素之间的关系。

②子区域分析法:分析了在线性子空间中的面部分布,如Eigenfaces。

③基于学习法:将人脸检测分为滑动窗口+二元分类(目标和背景)的两个过程,该方法模型有神经网络和SVM。

b、传统人脸检测(2000~2015)

①基于增强决策树方法:易于计算但在复杂场景下精度低。

②基于早期CNN:共享特征计算来加快检测。

c、基于深度学习的人脸检测(2015~)

大部分人脸检测沿用Faster RCNN、SSD等通用目标检测器的检测思想。

加速人脸检测问题:①级联检测;②预测图像中面部的尺度分布然后在一些选择的尺度中进行检测。

解决多姿态和遮挡问题

①人脸校准法可解决多姿态面部检测问题

i、估计校准参数;ii、通过多个检测阶段使用渐进式校准

②解决遮挡问题

i、注意力机制;ii、基于部分面部的检测,继承了DPM思想

解决多尺度问题:①多尺度特征融合;②多分辨率检测

三、文本检测

有两个相互独立的任务:文本定位和文本识别

衍生应用:帮助盲人“阅读”街道标志和货币、识别门牌号和街道标志构建数字地图

1、难点和挑战

①不同字体和语言;②文本旋转和角度失真;③密集排布的文本定位;④破坏和模糊的字体

2、文献回顾

a、逐步检测VS集成检测

①逐步检测:分为字符分割、候选区域确认、字符分组、单词识别四个过程。

优点:在粗分割中可过滤掉大部分背景,大大降低了后续过程的计算成本。

缺点:每步的参数都要拿谨慎设置,因为错误会在每一步中越来越大。

②集成检测:将文本检测看做是一个关节可能性推理问题,这里字符定位、分组和识别步骤都在一个统一框架下处理。

优点:避免了集聚错误并且易于集成语言模型。

缺点:当考虑大量字符类别和候选窗时推理阶段会耗费大量算力

b、传统方法VS深度学习方法

①传统方法:大部分文本检测方法都是以非监督方式产生文本候选,最常用方法为MSER分割和形态过滤,还有考虑文本对称性和笔画结构的方法。

文本定位问题又分为两种方法:

方法一:将文本检测可看做一般目标检测的特例,使用这种方法的都有一个统一的检测框架,但对于有方向或大纵横比的文本检测效果较差。

方法二:将文本检测框看做一个图像分割问题。优点是对文本的形状和方向没有特殊的限制,但缺点是不容易根据分割结果区分密集排列的文本行。最近基于深度学习的文本检测方法为上述问题提出了一些解决方案。

解决文本旋转和角度变化问题:在与旋转和角度改变有关联的锚框和ROI池化层中引入额外参数。

解决密集排布文本问题

①分割和连接。分割指字符的热力图,连接指两个相邻分割段的连接,表明它们属于同一个单词或文本行。

②引入额外的角落/边界检测任务,帮助分离密集排布的文本,其中一组角点或闭合边界对应于单独的文本行。

解决破坏和模糊的字体问题:用词级识别和句级识别。

解决不同字体的文本:用合成样本训练。

四、交通信号和交通灯检测

1、难点和挑战

①光照问题;②移动模糊(车载摄像头捕捉到的图像将由于汽车的运动而变得模糊);③糟糕的天气;④实时检测。

2、文献回顾

a、传统检测方法

基于低层次视觉:颜色阈值的方法、视觉显著性检测、形态过滤、边缘/轮廓分析

超视觉方法:结合GPS和数字地图的方法

b、深度学习检测

①Faster RCNN

②SSD

③在上述两个基础上用注意力机制和对抗训练方法

五、遥感目标检测

延伸应用:军用勘察、疾病治疗、城市交通管理

1、难点及挑战

①“大数据”中的检测(容量大);

image-20220318170251368

②遮挡的目标;

image-20220408154610785

③域适应(通过不同的调制率和分辨率的传感器捕捉遥感图,使得图之间的区别较大)

2、文献回顾

a、传统检测方法

大部分都用两阶段法检测。

其中候选框提取阶段方法有:①基于灰度值过滤的方法;②基于小波转换的方法;③基于异常检测的方法;④基于视觉显著性的方法……

缺点:因为都是非监督方法,在复杂环境下经常会失效。

目标验证阶段方法:①HOG特征;②LBP特征;③SIFT特征……④基于滑窗检测的其他方法……

解决目标遮挡问题:①通过分模型检测

解决不同方位目标检测问题:①“混合模型”法(对不同方位的目标训练不同的检测器然后综合起来)

b、基于深度学习的方法

①Faster RCNN

②SSD

解决不同方位目标检测问题:①ROI池化层(取得更好的旋转不变性)

解决域适应问题:①根据测试图像的分布自适应更新模型

解决小目标检测问题:注意力机制和特征融合策略

总结

未来目标检测发展方向不局限于如下几个方向:

1、轻量化目标检测

2、自动检测(AutoML),使用NAS

3、域适应检测(GAN是趋势)

4、弱监督检测(使得检测器只用在图像级标注上训练或使用部分边框标注训练)

5、小目标检测(未来方向是视觉注意力机制和高分辨率轻量化网络部的集成)

6、视频检测(未来方向是寻找空间和时间关联)

7、信息融合检测(使用多种数据源如RGB-D图像,3D点云,激光雷达等),如何进行信息融合以改进检测。

引用

[1] Zou Z , Shi Z , Guo Y , et al. Object Detection in 20 Years: A Survey[J]. 2019.

[2] 难分样本挖掘的解释

[3] 边框回归(Bounding Box Regression)详解

[4] IoU计算方法

[5] focal loss解释

[6] 史上最易懂AP、mAP计算解析

[7] 感受野定义及计算

[8] hard example mining

  • 1
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋天的风儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值