导航:首页 > 解决方法 > 目标检测器的使用方法

目标检测器的使用方法

发布时间:2023-04-07 18:36:28

1. 如何用OpenCV自带的adaboost程序训练并检测目标

转自:http://hi..com/andyzcj/blog/item/3b9575fc63c3201f09244d9a.html可能遇到的问题:1.如果跑到某一个分类器时,几个小时也没有反应,而且显示不出训练百分比,这是因为你的负样本数量太少,或者负样本的尺寸太小,所有的负样本在这个分类器都被reject了,程序进入不了下一个循环,果断放弃吧。解决方法:负样本尽量要大一些,比如我的正样本是40*15,共300个,负样本是640*480,共500个。2.读取样本时报错:,网上说这个错误是因为opencv规定单幅iplimage的内存分配不能超过10000,可是我的每个负样本都不会超过这个大小,具体原因不明。后来我把负样本的数量减少,尺寸加大,这个问题就解决了。最近要做一个性别识别的项目,在人脸检测与五官定位上我采用OPENCV的haartraining进行定位,这里介绍下这两天我学习的如何用opencv训练自己的分类器。在这两天的学习里,我遇到了不少问题,不过我遇到了几个好心的大侠帮我解决了不少问题,特别是无忌,在这里我再次感谢他的帮助。一、简介目标检测方法最初由PaulViola[Viola01]提出,并由RainerLienhart[Lienhart02]对这一方法进行了改善。该方法的基本步骤为:首先,利用样本(大约几百幅样本图片)的harr特征进行分类器训练,得到一个级联的boosted分类器。分类器中的"级联"是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依次通过每一级分类器,这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。分类器训练完以后,就可以应用于输入图像中的感兴趣区域的检测。检测到目标区域分类器输出为1,否则输出为0。为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。所以,为了在图像中检测未知大小的目标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描。目前支持这种分类器的boosting技术有四种:DiscreteAdaboost,RealAdaboost,GentleAdaboostandLogitboost。"boosted"即指级联分类器的每一层都可以从中选取一个boosting算法(权重投票),并利用基础分类器的自我训练得到。根据上面的分析,目标检测分为三个步骤:1、样本的创建2、训练分类器3、利用训练好的分类器进行目标检测。二、样本创建训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本,反例样本指其它任意图片。负样本负样本可以来自于任意的图片,但这些图片不能包含目标特征。负样本由背景描述文件来描述。背景描述文件是一个文本文件,每一行包含了一个负样本图片的文件名(基于描述文件的相对路径)。该文件创建方法如下:采用Dos命令生成样本描述文件。具体方法是在Dos下的进入你的图片目录,比如我的图片放在D:\face\posdata下,则:按Ctrl+R打开Windows运行程序,输入cmd打开DOS命令窗口,输入d:回车,再输入cdD:\face\negdata进入图片路径,再次输入dir/b>negdata.dat,则会图片路径下生成一个negdata.dat文件,打开该文件将最后一行的negdata.dat删除,这样就生成了负样本描述文件。dos命令窗口结果如下图:正样本对于正样本,通常的做法是先把所有正样本裁切好,并对尺寸做规整(即缩放至指定大小),如下图所示:由于HaarTraining训练时输入的正样本是vec文件,所以需要使用OpenCV自带的CreateSamples程序(在你所按照的opencv\bin下,如果没有需要编译opencv\apps\HaarTraining\make下的.dsw文件,注意要编译release版的)将准备好的正样本转换为vec文件。转换的步骤如下:1)制作一个正样本描述文件,用于描述正样本文件名(包括绝对路径或相对路径),正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:posdata/1(10).bmp1112323posdata/1(11).bmp1112323posdata/1(12).bmp1112323不过你可以把描述文件放在你的posdata路径(即正样本路径)下,这样你就不需要加前面的相对路径了。同样它的生成方式可以用负样本描述文件的生成方法,最后用txt的替换工具将“bmp”全部替换成“bmp1112323”就可以了,如果你的样本图片多,用txt替换会导致程序未响应,你可以将内容拷到word下替换,然后再拷回来。bmp后面那五个数字分别表示图片个数,目标的起始位置及其宽高。这样就生成了正样本描述文件posdata.dat。2)运行CreateSamples程序。如果直接在VC环境下运行,可以在Project\Settings\Debug属性页的Programarguments栏设置运行参数。下面是一个运行参数示例:-infoD:\face\posdata\posdata.dat-vecD:\face\pos.vec-num50-w20-h20表示有50个样本,样本宽20,高20,正样本描述文件为posdata.dat,结果输出到pos.vec。或者在dos下输入:"D:\ProgramFiles\OpenCV\bin\createsamples.exe"-info"posdata\posdata.dat"-vecdata\pos.vec-num50-w20-h20运行完了会d:\face\data下生成一个*.vec的文件。该文件包含正样本数目,宽高以及所有样本图像数据。结果入下图:Createsamples程序的命令行参数:命令行参数:-vec训练好的正样本的输出文件名。-img源目标图片(例如:一个公司图标)-bg背景描述文件。-num要产生的正样本的数量,和正样本图片数目相同。-bgcolor背景色(假定当前图片为灰度图)。背景色制定了透明色。对于压缩图片,颜色方差量由bgthresh参数来指定。则在bgcolor-bgthresh和bgcolor+bgthresh中间的像素被认为是透明的。-bgthresh-inv如果指定,颜色会反色-randinv如果指定,颜色会任意反色-maxidev背景色最大的偏离度。-maxangel-maxangle,-maxzangle最大旋转角度,以弧度为单位。-show如果指定,每个样本会被显示出来,按下"esc"会关闭这一开关,即不显示样本图片,而创建过程继续。这是个有用的debug选项。-w输出样本的宽度(以像素为单位)-h《sample_height》输出样本的高度,以像素为单位。到此第一步样本训练就完成了。恭喜你,你已经学会训练分类器的五成功力了,我自己学这个的时候花了我一天的时间,估计你几分钟就学会了吧。三、训练分类器样本创建之后,接下来要训练分类器,这个过程是由haartraining程序来实现的。该程序源码由OpenCV自带,且可执行程序在OpenCV安装目录的bin目录下。Haartraining的命令行参数如下:-data存放训练好的分类器的路径名。-vec正样本文件名(由trainingssamples程序或者由其他的方法创建的)-bg背景描述文件。-npos,-nneg用来训练每一个分类器阶段的正/负样本。合理的值是:nPos=7000;nNeg=3000-nstages训练的阶段数。-nsplits决定用于阶段分类器的弱分类器。如果1,则一个简单的stumpclassifier被使用。如果是2或者,则带有number_of_splits个内部节点的CART分类器被使用。-mem预先计算的以MB为单位的可用内存。内存越大则训练的速度越快。-sym(default)-nonsym指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对称的。-minhitrate《min_hit_rate》每个阶段分类器需要的最小的命中率。总的命中率为min_hit_rate的number_of_stages次方。-maxfalsealarm没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate的number_of_stages次方。-weighttrimming指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9-eqw-mode选择用来训练的haar特征集的种类。basic仅仅使用垂直特征。all使用垂直和45度角旋转特征。-w《sample_width》-h《sample_height》训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。一个训练分类器的例子:"D:\ProgramFiles\OpenCV\bin\haartraining.exe"-datadata\cascade-vecdata\pos.vec-bgnegdata\negdata.dat-npos49-nneg49-mem200-modeALL-w20-h20训练结束后,会在目录data下生成一些子目录,即为训练好的分类器。训练结果如下:恭喜你,你已经学会训练分类器的九成功力了。四:利用训练好的分类器进行目标检测。这一步需要用到performance.exe,该程序源码由OpenCV自带,且可执行程序在OpenCV安装目录的bin目录下。performance.exe-datadata/cascade-infoposdata/test.dat-w20-h20-rs30performance的命令行参数如下:Usage:./performance-data-info[-maxSizeDiff][-maxPosDiff][-sf][-ni][-nos][-rs][-w][-h]也可以用opencv的cvHaarDetectObjects函数进行检测:CvSeq*faces=cvHaarDetectObjects(img,cascade,storage,1.1,2,CV_HAAR_DO_CANNY_PRUNING,cvSize(40,40));//3.检测人脸

2. deep learning 目标检测(一)之R-CNN

          Since we combine region proposals   with CNNs, we call our method R-CNN: Regions with CNN

features.

下面先介绍R-CNN和Fast R-CNN中所用到的边框回归方法。

什么要做Bounding-box regression?

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

那么经过何种变换才能从图11中的窗口P变为窗口呢?比较简单的思路就是:

注意:只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线清烂性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这个也是G-CNN: an Iterative Grid Based Object Detector多次迭代实现目标准确定位的关键蠢悄。

PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集,从2005年到2012年每年都会举行一场图像识别challenge。

模型详解

RCNN全程就是Regions with CNN features,从名字也可以看出,RCNN的检测算法是基于传统方法来找出一些可能是物体的区域,再把该区域的尺寸归一化成卷积网络输入的尺寸,最后判断该区域到底是不是物体,是哪个物体,以及对是物体的区域进行进一步回归的微微调整(与深度学习里的finetune去分开,我想表达的就只是对框的位置进行微微调整)学习,使得框的更加答档漏准确。

       正如上面所说的,RCNN的核心思想就是把图片区域内容送给深度网络,然后提取出深度网络某层的特征,并用这个特征来判断是什么物体(文章把背景也当成一种类别,故如果是判断是不是20个物体时,实际上在实现是判断21个类。),最后再对是物体的区域进行微微调整。实际上文章内容也说过用我之前所说的方法(先学习分类器,然后sliding windows),不过论文用了更直观的方式来说明这样的消耗非常大。它说一个深度网络(alexNet)在conv5上的感受野是195×195,按照我的理解,就是195×195的区域经过五层卷积后,才变成一个点,所以想在conv5上有一个区域性的大小(7×7)则需要原图为227×227,这样的滑窗每次都要对这么大尺度的内容进行计算,消耗可想而知,故论文得下结论,不能用sliding windows的方式去做检测(消耗一次用的不恰当,望各位看官能说个更加准确的词)。不过论文也没有提为什么作者会使用先找可能区域,再进行判断这种方式,只是说他们根据09年的另一篇论文[1],而做的。这也算是大神们与常人不同的积累量吧。中间的深度网络通过ILSVRC分类问题来进行训练,即利用训练图片和训练的分类监督信号,来学习出这个网络,再根据这个网络提取的特征,来训练21个分类器和其相应的回归器,不过分类器和回归器可以放在网络中学习,

R-CNN 模型

如果要拟人化比喻,那 R-CNN 肯定是 Faster R-CNN 的祖父了。换句话说,R-CNN 是一切的开端。

R-CNN,或称 Region-based Convolutional Neural Network,其工作包含了三个步骤:

1.借助一个可以生成约 2000 个 region proposal 的“选择性搜索”(Selective Search)算法,R-CNN 可以对输入图像进行扫描,来获取可能出现的目标。

2.在每个 region proposal 上都运行一个卷积神经网络(CNN)。

3.将每个 CNN 的输出都输入进:a)一个支持向量机(SVM),以对上述区域进行分类。b)一个线性回归器,以收缩目标周围的边界框,前提是这样的目标存在。

下图具体描绘了上述 3 个步骤:

Abstract :

                 R-CNN的两个贡献:1.cnn卷积层的能力很强,可以遍历候选区域达到精确的定位。2.当有标签的数据很少的时候,我们可以事前进行有标签(别的数据集上?)的预训练作为辅助任务,然后对特定的区域进行微调。

Introction:

                这篇文章最开始是在PASCAL VOC上在图像分类和目标检测方面取得了很好的效果。

               为了达到很好的效果,文章主要关注了两个问题:1.用深层网络进行目标的定位。2.如何用少量的带标签的检测数据来训练模型

                对于 对一个问题目标定位 ,通常有两个思路可以走:

                     1.把定位看成回归问题。效果不是很好。

                     2.建立划窗检测器。

                CNN一直采用建立划窗这个方式,但是也只是局限于人脸和行人的检测问题上。

              本文使用了五个卷积层(感受野食195*195),在输入时移动步长是32*32。

              除此之外,对于定位问题,我们采用区域识别的策略。

                在测试阶段,本文的方法产生了大约2000个类别独立的候选区域作为cnn的输入。然           后得到一个修正后的特征向量。然后对于特定的类别用线性SVM分类器分类。我们用简             单的方法(放射图像变形)来将候选区域变成固定大小。

                  对于第二个缺少标签数据的问题

                    目前有一个思路就是无监督的预训练,然后再加入有监督的微调。

                   作为本文最大的贡献之二:在ILSVRC数据集上,我们先进行有监督的预训练。然                  后我们在PASCAL这个小数据集上我们进行特定区域的微调。在我们的实验中,微调                  可以提升8%的mAP。

                    本文的贡献;效率高

                     仅仅是特别类别的计算是合乎情理的矩阵运算,和非极大值抑制算法。他们共享权                值,并且都是低维特征向量。相比于直接将区域向量作为输入,维数更低。

               本文方法处理能实现目标检测,还以为实现语义分割。

2.用R-CNN进行目标检测:

            有3个Model:

           (1)产生独立的候选区域。

           (2)CNN产生固定长度的特征向量。

            (3)针对特别类别的一群svm分类器。

2.1 模块的设计

候选区域:

                  之前有大量的文章都提过如果产生候选区域。本文采用SS(selective search )方法。参考文献【34】+【36】

特征抽取:

                对于每个候选区域,我们采用cnn之后得到4096维向量。

2.2 测试阶段的检测

              在测试阶段,我们用选择性搜素的方式在测试图片上选取了2000个候选区域,如上图所示的步骤进行。

运行时间分析: 总之当时相比很快。

2.3训练模型

有监督的预训练: 我们使用了大量的ILSVRC的数据集来进行预训练CNN,但是这个标签是图片层的。换句话说没有带边界这样的标签。

特定区域的微调: 我们调整VOC数据集的候选区域的大小,并且我们把ImageNet上午1000类,变成了21类(20个类别+1个背景)。我们把候选区域(和真实区域重叠的)大于0.5的标记为正数,其他的标记为负数。然后用32个正窗口和96个负窗口组成128的mini-batch。

目标类别分类器:

        对于区域紧紧的包括着目标的时候,这肯定就是正样本。对于区域里面全部都是背景的,这也十分好区分就是负样本。但是某个区域里面既有目标也有背景的时候,我们不知道如歌标记。本文为了解决这个,提出了一个阈值:IoU覆盖阈值,小于这个阈值,我们标记为负样本。大于这个阈值的我们标记为正样本。我们设置为0.3。这个是一个超参数优化问题。我们使用验证集的方法来优化这个参数。然而这个参数对于我们的最后的性能有很大的帮助。

        一旦,我们得到特征向量。因为训练数据太大了。我们采用standard hard negative mining method(标准难分样本的挖掘)。这个策略也是的收敛更快。

2.4 Results on PASCAL VOC 201012

3.3. Visualization, ablation, and modes of error

3.1. Visualizing learned features

      提出了一个非参数的方法,直接展现出我们的网络学习到了什么。这个想法是将一个特定的单元(特性)放在其中使用它,就好像它自己是一个对象检测器正确的。具体方法就是:我们在大量候选区域中,计算每个单元的激励函数。按从最高到最低排序激活输出,执行非最大值抑制,然后显示得分最高的区域。我们的方法让选定的单元“为自己说话”通过显示它所触发的输入。我们避免平均为了看到不同的视觉模式和获得洞察力为单位计算的不变性。我们可以看到来着第五个maxpooling返回的区域。第五层输出的每一个单元的接受野对应输出227*227的其中的195*195的像素区域。所以中心那个点单元有全局的视觉。

3.2. Ablation studies

实际上ablation study就是为了研究模型中所提出的一些结构是否有效而设计的实验。比如你提出了某某结构,但是要想确定这个结构是否有利于最终的效果,那就要将去掉该结构的网络与加上该结构的网络所得到的结果进行对比,这就是ablation study。

Performance layer-by-layer, without fine-tuning.

我们只观察了最后三层

Performance layer-by-layer, with fine-tuning.

微调之后,fc6和fc7的性能要比pool5大得多。从ImageNet中学习的pool5特性是一般的,而且大部分的提升都是从在它们之上的特定领域的非线性分类器学习中获得的。

Comparison to recent feature learning methods.

             见上图

3.3. Detection error analysis

          CNN的特征比HOG更加有区分。

3.4. Bounding box regression

有了对错误的分析,我们加入了一种方法来减少我们的定位错误。我们训练了一个线性的回归模型

HOG和SIFT很慢。但是我们可以由此得到启发,利用有顺序等级和多阶段的处理方式,来实现特征的计算。

生物启发的等级和移不变性,本文采用。但是缺少有监督学习的算法。

使得卷积训练变得有效率。

第一层的卷积层可以可视化。

【23】本文采用这个模型,来得到特征向量

  ImageNet Large Scale Visual Recognition Competition

用了非线性的激励函数,以及dropout的方法。

【34】直接将区域向量作为输入,维数较高。IoU覆盖阈值=0.5,而本文设置为0.3,能提高5个百分点。产生候选区域的方式:selective search 也是本文所采取的方式是结合【34】+【36】。

【5】产生候选区域的方式为:限制参数最小割

bounding box regression

HOG-based DPM文章3.2section中的对比试验。

缩略图概率。

[18][26][28]文章3.2section中的对比试验。

3. 小目标检测的方法总结

一、图片输入层面

基于以上结论,采用多尺度训练过程中,要在避免那些极小的和极大的(多尺度后)带来的不好的影响时,考虑保证目标有足够的多样性。所以在进行多尺度训练过程中,将每种输入尺度下,不满足要求的proposal以及anchor忽略。论文中使用了三种尺度如图所示,比一般的多尺度训练的尺度跨度要大。

二、 Neck部分(采用金字塔结构改进方案的)

一般意义的FPN网络结构是最右边似的结构,而本文中采用的结构则是

该方法首先无疑是增加了计算量,优点就是最终输出的每一层的特征不是一个线性的变换(应该想表述的说不是从一层特征直接到另一层特征),而是使用共享的多层特征。最终相比RetinaNet提升一个点左右吧,效果一般。VisDrone2020检测的冠军团队采用了这个结构

该文章利用多个TUM模块试图更充分构建的特征金字塔的网络结构,靠前的TUM提供浅层特征,中间的歼哪TUM提供中间层特征,靠后的TUM提供深层特征,通过这种方式能够多次将深层浅层特征融合,参数量多了。和RetinaNet对比可以看到,512输入,都不采用multi-scale推理,mAP由33提升到37.6,小目标精度也提升了一点;以参数量和计算量堆砌的精度提升,不是好方法。

文章认为不同层的重要程度应该和嫌租目标的绝对尺度分布有关系,所以在FPN自上而下融合的时候,加入了一个尺度因子用来平衡金字塔不同层的重要性。个人感觉意义不大,实际提升也不明显。氏者码

三、 Head部分的改进方案

在VisDrones上的冠军方案和若干其他方案都采用了这种“双头部”的方案。soft-NMS似乎可以提升几个点。

四、 小目标目前检测不好,主要原因不是小,应该是小且和背景接近,对比度不高。所以可以借鉴伪装物体检测的思路;

4. 目标检测算法图解:一文看懂RCNN系列算法

姓名:王咫毅

学号:19021211150

【嵌牛导读】CNN如此风靡,其衍生算法也是层出不穷,各种衍生算法也可以应用于各种应用场景,各类场合。本文则是了解每个衍生算法的各个使用场景、原理及方法。

【嵌牛鼻子】RCNN 目标检测

【嵌牛提问】RCNN系列算法有何区别和联系?

【嵌牛正文】

在生活中,经常会遇到这样的一种情况,上班要出门的时候,突然找不到一件东西了,比如钥匙、手机或者手表等。这个时候一般在房间翻一遍各个角落来寻找不见的物品,最后突然一拍大脑,想到在某一个地方,在整个过程中有时候是很着急的,并且越着急越找不到,真是令人沮丧。但是,如果一个简单的计算机算法可以在几毫秒内就找到你要找的物品,你的感受如何?是不是很惊奇!这就是对象检测算法(object detection)的力量。虽然上述举的生活例子只是一个很简单的例子,但对象检测的应用范围很广,跨越多个不同的行业,从全天候监控到智能城市的实时车辆检qian测等。简而言之,物体检测是强大的深度学习算法中的一个分支。

在本文中,我们将深入探讨可以用于对象检测的各种算法。首先从属于RCNN系列算法开始,即RCNN、 Fast RCNN和 Faster RCNN。在之后的文章中,将介绍更多高级算法,如YOLO、SSD等。

1.解决对象检测任务的简单方法(使用深度学习)

下图说明了对象检测算法是如何工作。图像中的每个对象,从人到风筝都以一定的精度进行了定位和识别。

下面从最简单的深度学习方法开始,一种广泛用于检测图像中的方法——卷积神经网络(CNN)。如果读者对CNN算法有点生疏,建议 阅读此文 。

这里仅简要总结一下CNN的内部运作方式:

首先将图像作为输入传掘卜颤递到网络,然后通过各种卷积和池化层处理,最后以对象类别的形式获得输出。

对于每个输入图像,会得到一个相应的类别作为输出。因此可以使用这种技术来检测图像中的各种对象。

1.首先,将图像作为输入;

2.然后,将图像分成不同的区域;

3.然后,将每个区域视为单独的图像;

4.将所有这些区域传递给CNN并将它们分类为各种类别;

5.一旦将每个区域划分为相应的类后,就可以组合所有这些区域来获取具有检测到的对象的原始图像:

使用这种方法会面临的问题在于,图像中的对象可以具有不同的宽高比和空间位置。例如,在某些情况下,对象可能覆盖了大部分图像,而在其他情况下,对象可能只覆盖图像的一小部分,并且对象的形状也可能不同。

基于此,需要划分大量的区域,这会花费大量的计算时间。因此,为了解决这个问题并减少区域数量,可以使用基于区域的CNN,它使用提议方法选择区域。

2.基于区域的卷积神经网络

2.1 RCNN的思想

RCNN算法不是在大量区域上工作,而是在图像中提出了一堆方框,并检查判败这些方框中是否包含任何对象。RCNN 使用选择性搜索从图像中提取这些框。

下面介绍选择性搜索以及它如何识别不同的区域。基本上四个区域形成一个对象:不同的比例、颜色、纹理和形状。选择性搜索在图像中识别这些模式弊裂,并基于此提出各种区域。以下是选择性搜索如何工作的简要概述:

首先, 将图像作为输入:

然后,它生成初始子分段,以便获得多个区域:

之后,该技术组合相似区域以形成更大的区域(基于颜色相似性、纹理相似性、尺寸相似性和形状兼容性):

最后,这些区域产生最终的对象位置(感兴趣的区域);

下面是RCNN检测对象所遵循的步骤的简要总结:

1.首先采用预先训练的卷积神经网络;

2.重新训练该模型模型——根据需要检测的类别数量来训练网络的最后一层(迁移学习);

3.第三步是获取每个图像的感兴趣区域。然后,对这些区域调整尺寸,以便其可以匹配CNN输入大小;

4.获取区域后,使用SVM算法对对象和背景进行分类。对于每个类,都训练一个二分类SVM;

最后,训练线性回归模型,为图像中每个识别出的对象生成更严格的边界框;

[对上述步骤进行图解分析]( http://www.robots.ox.ac.uk/~tvg/publications/talks/Fast-rcnn-slides.pdf ):

首先,将图像作为输入:

然后,使用一些提议方法获得感兴趣区域(ROI)(例如,选择性搜索):

之后,对所有这些区域调整尺寸,并将每个区域传递给卷积神经网络:

然后,CNN为每个区域提取特征,SVM用于将这些区域划分为不同的类别:

最后,边界框回归(Bbox reg)用于预测每个已识别区域的边界框:

以上就是RCNN检测物体的全部流程。

2.2 RCNN的问题

从上节内容可以了解到RCNN是如何进行对象检测的,但这种技术有其自身的局限性。以下原因使得训练RCNN模型既昂贵又缓慢:

基于选择性搜索算法为每个图像提取2,000个候选区域;

使用CNN为每个图像区域提取特征;

RCNN整个物体检测过程用到三种模型:

CNN模型用于特征提取;

线性svm分类器用于识别对象的的类别;

回归模型用于收紧边界框;

这些过程相结合使得RCNN非常慢,对每个新图像进行预测需要大约40-50秒,这实际上使得模型在面对巨大的数据集时变得复杂且几乎不可能应用。

好消息是存在另一种物体检测技术,它解决了RCNN中大部分问题。

3.了解Fast RCNN

3.1Fast RCNN的思想

RCNN的提出者Ross Girshick提出了这样的想法,即每个图像只运行一次CNN,然后找到一种在2,000个区域内共享该计算的方法。在Fast RCNN中,将输入图像馈送到CNN,CNN生成卷积特征映射。使用这些特征图提取候选区域。然后,使用RoI池化层将所有建议的区域重新整形为固定大小,以便将其馈送到全连接网络中。

下面将其分解为简化概念的步骤:

1.首先将图像作为输入;

2.将图像传递给卷积神经网络,生成感兴趣的区域;

3.在所有的感兴趣的区域上应用RoI池化层,并调整区域的尺寸。然后,每个区域被传递到全连接层的网络中;

4.softmax层用于全连接网以输出类别。与softmax层一起,也并行使用线性回归层,以输出预测类的边界框坐标。

因此,Fast RCNN算法中没有使用三个不同的模型,而使用单个模型从区域中提取特征,将它们分成不同的类,并同时返回所标识类的边界框。

对上述过程进行可视化讲解:

将图像作为输入:

将图像传递给卷积神经网络t,后者相应地返回感兴趣的区域:

然后,在提取的感兴趣区域上应用RoI池层,以确保所有区域具有相同的大小:

最后,这些区域被传递到一个全连接网络,对其进行分类,并同时使用softmax和线性回归层返回边界框:

上述过程说明了Fast RCNN是如何解决RCNN的两个主要问题,即将每个图像中的1个而不是2,000个区域传递给卷积神经网络,并使用一个模型来实现提取特征、分类和生成边界框。

3.2Fast RCNN的问题

Fast RCNN也存在一定的问题,它仍然使用选择性搜索作为查找感兴趣区域的提议方法,这是一个缓慢且耗时的过程,每个图像检测对象大约需要2秒钟。

因此,又开发了另一种物体检测算法——Faster RCNN。

4.了解Faster RCNN

4.1. Faster RCNN的思想

Faster RCNN是Fast RCNN的修改版本,二者之间的主要区别在于,Fast RCNN使用选择性搜索来生成感兴趣区域,而Faster RCNN使用“区域提议网络”,即RPN。RPN将图像特征映射作为输入,并生成一组提议对象,每个对象提议都以对象分数作为输出。

以下步骤通常采用Faster RCNN方法:

1.将图像作为输入并将其传递给卷积神经网络,后者返回该图像的特征图;

2.在这些特征图上应用RPN,返回提议对象及其分数;

3.在这些提议对象上应用RoI池层,以将所有提案降低到相同的大小;

4.最后,将提议传递到全连接层,该层在其顶部具有softmax层和线性回归层,以对对象的边界框进行分类和输出;

这里简要解释一下RPN是如何运作的:

首先,Faster RCNN从CNN获取特征图并将它们传递到区域提议网络。RPN在这些特征图上使用滑动窗口,每个窗口生成不同形状和大小的k个方框( Anchor boxe):

方框是固定尺寸的边界箱,具有不同的形状和尺寸。对于每个方框,RPN预测两件事:

预测锚是对象的概率;

用于边界框回归器调整锚点以更好地适合物体的形状;

在有了不同形状和大小的边界框后,将其传递到RoI池层。对每个提案并对其进行裁剪,以便每个提案都包含一个对象。这就是RoI池层所做的事情,它为每个方框提取固定大小的特征图:

然后将这些特征图传递到全连接层,该层具有softmax和线性回归层,最终对对象进行分类并预测已识别对象的边界框。

4.2Faster RCNN的问题

上述讨论过的所有对象检测算法都使用区域来识别对象,且网络不会一次查看完整图像,而是按顺序关注图像的某些部分,这样会带来两个复杂性的问题:

该算法需要多次通过单个图像来提取到所有对象;

由于不是端到端的算法,不同的系统一个接一个地工作,整体系统的性能进一步取决于先前系统的表现效果。

链接: https://www.jianshu.com/p/51fc039ae7a4

5. Faster R-CNN:使用RPN实时目标检测

论文: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

目标检测网络大多依靠 区域生成 (region proposal)算法来假设目标的位置。 R-CNN 是采用 Selective Search 算法来提取(propose)可能的 RoIs(regions of interest) 区域,然后对每个提取区域采用标准 CNN 进行分类。选择性搜索(Selective Search )方法就是在目标对象周围设定2000个形状大小位置不一的候选区域,目标物体在候选区域的可能性还是比较大的。然后对这些区域卷积,找到目标物体,虽然大多数区域都是无用的。与寻找几乎个区域比起来,这种方法要高效的多。

Fast R-CNN ,不在原始图像生成备选区域,而是先整张图片通过卷积网络得到特征图,然后在特征图上使用备选区域算法得到感兴趣的区域在特征图的映射,之后使用 Rol Pool将所有区域变成同样尺寸,大大减少了这些目标检测网络的运行时间,但是区域生成的计算成为整个检测网络的瓶颈。

Faster R-CNN 引入了一个 区域生成网络(Region Proposal Network,RPN) ,该网络与检测网络共享输入图像的卷积特征,从而使接近零枯昌时间成本的区域生成成为可能。 RPN是一个全卷积网络,可以同时在每个位置预测目标边界和目标分数。RPN经过端到端的训练,可以生成高质量的区域候选框,然后提供给Fast R-CNN用于检测。

Faster R-CNN 由两个模块组成:第一个模块是区域生成的深度全卷积网络,第二个模块是使用备选区域的Fast R-CNN检测器。整个系统是一个单个的,统一的目标检测网络。使用最近流行的“注意力”机制的神经网络术语,RPN模块告诉Fast R-CNN模块在哪里寻找目标。

针对一张图片,需要获得的输出有:

Faster R-CNN 第一步是采用基于分类任务(如ImageNet)的 CNN 模型作为特征提取器。输入图片表示为 H × W × D 的形式,经过预训练 CNN 模型的处理,得到卷积特征图(conv feature map)。

Faster R-CNN 最早是采用在 ImageNet 训练的 ZF 和 VGG ,其后出现了很多其它权重不同的网络.。如 MobileNet 是一种小型效率高的网络结构,仅有 3.3M 参数;而ResNet-152 的没含扒参数量达到了 60M;新网络结构,如 DenseNet 在提高了结果的同时,降低了参数数量。

以 VGG16 为例:

VGG16 图片分类时,输入为 224×224×3 的张量(即,一张 224×224 像素的 RGB 图片)。网络结构最后采用 FC 层(而不是 Conv 层)得到固定长度的向量,以进行图片分类.。对最后一个卷积层的输出拉伸为1维的向量,然后送入 FC 层。官方实现中是采用的卷积层 conv5/conv5_1 的输出。

在深度上,卷积特征图对图片的所有信息进行了编码,同时保持相对于原始图片所编码 “things” 的位置。例如,如果在图片的左上角存在一个红色正方形,而且卷积层有激活响应,那么该红色正方形的信息被卷积层编码后,仍在卷积特征图老滑的左上角。因此利用特征图检测目标所在的位置是可行的。

ResNet 结构逐渐取代 VGG 作为基础网络,用于提取特征。ResNet 相对于 VGG 的明显优势是,网络更大,因此具有更强的学习能力.。这对于分类任务是重要的,在目标检测中也应该如此。另外,ResNet 采用残差连接(resial connection) 和 BN (batch normalization) 使得深度模型的训练比较容易。

然后,RPN(Region Propose Network) 对提取的卷积特征图进行处理,寻找可能包含 目标的 预定义数量的区域(regions,边界框) 。为了生成候选区域,在最后的共享卷积层输出的卷积特征图上做 3x3 卷积,卷积核共有512个(VGG),后面是ReLU,这样每个 3x3 区域会得到一个512维的特征向量。然后这个特征向量被输入到两个全连接层——一个边界框回归层(reg)和一个边界框分类层(cls)。

下面解释 k, 2k, 4k 的含义。

基于深度学习的目标检测中,可能最难的问题就是生成长度不定(variable-length)的边界框列表(bounding-boxes),边界框是具有不同尺寸(sizes)和长宽比(aspect ratios )的矩形。在构建深度神经网络时,最后的网络输出一般是固定尺寸的张量输出(采用RNN的除外)。例如,在图片分类中,网络输出是 (C, ) 的张量,C是类别标签数,张量的每个位置的标量值表示图片是类别的概率值。

在 RPN 中,通过采用 anchors(锚) 来解决边界框列表长度不定的问题,即在原始图像中统一放置固定大小的参考边界框。上面说到RPN对特征图做3x3的卷积,假设每一次卷积需要预测 k 个候选区域,因此,reg层具有 4k 个输出,编码 k 个边界框的坐标,cls层输出 2k 个分数,估计每个区域是目标或是背景的概率。这 k 个区域就是 被 k 个参考边界框初始化, k 个参考框就是 k 个锚点,作为第一次预测目标位置的参考 boxes。锚点的中心位于卷积核滑动窗口的中心。默认情况下每个滑动位置使用3个不同尺度(128 2 , 256 2 , 512 2 )3个不同长宽比(1:2, 1:1, 2:1)的锚点,k=9。对于大小为W×H(通常约为2400)的卷积特征图,总共有 W×H×k 个锚点。对于RPN的最后两个全连接层,参数的个数为 512×(4+2)×k.

不同于直接检测目标的位置,这里将问题转化为两部分。对每一个 anchor 而言:

有一种简单的方法来预测目标的边界框,即学习相对于参考边界框的偏移量。假设参考 box:( ),待预测量:( ),一般都是很小的值,以调整参考 box 更好的拟合所需要的。

虽然 anchors 是基于卷积特征图定义的,但最终的 anchos 是相对于原始图片的.

由于只有卷积层和 pooling 层,特征图的维度是与原始图片的尺寸成比例关系的. 即,数学地表述,如果图片尺寸 w×h,特征图的尺寸则是w/r×h/r. 其中,r 是下采样率(subsampling ratio). 如果在卷积特征图空间位置定义 anchor,则最终的图片会是由 r 像素划分的 anchors 集。在 VGG 中, r=16。

RPN 利用所有的参考边界框(anchors),输出一系列目标的良好的 proposals。针对每个 anchor,都有两个不同的输出:

RPN是全卷积网络。

对于分类层,每个 anchor 输出两个预测值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score.

对于回归层,也可以叫边界框调整层,每个 anchor 输出 4 个预测值:
(Δxcenter,Δycenter,Δwidth,Δheight),用于 anchors 来得到最终的 proposals。根据最终的 proposal 坐标和其对应的 objectness score,即可得到良好的 objects proposals.

RPN 有两种类型的预测值输出:二值分类和边界框回归调整。

为了训练RPN,我们为每个锚点分配一个二值类别标签(是目标或不是目标)。我们给两种锚点分配一个正标签:(i)具有与实际边界框的重叠最高交并比(IoU)的锚点,或者(ii)具有与实际边界框的重叠超过0.7 IoU的锚点。注意,单个真实边界框可以为多个锚点分配正标签。通常第二个条件足以确定正样本;但我们仍然采用第一个条件,因为在一些极少数情况下,第二个条件可能找不到正样本。对于所有的真实边界框,如果一个锚点的IoU比率低于0.3,我们给非正面的锚点分配一个负标签。既不正面也不负面的锚点不会有助于训练目标函数。

然后,随机采样 anchors 来生成batchsize=256 的 mini-batch,尽可能的保持 foreground 和 background anchors 的比例平衡。

RPN 对 mini-batch 内的所有 anchors 采用二分类交叉熵来计算分类 loss。然后,只对 mini-batch 内标记为 foreground 的 anchros 计算回归 loss。为了计算回归的目标targets,根据 foreground anchor 和其最接近的 groundtruth object,计算将 anchor 变换到 object groundtruth 的偏移值 Δ。

Faster R-CNN没有采用简单的 L1 或 L2 loss 用于回归误差,而是采用 Smooth L1 loss. Smooth L1 和 L1 基本相同,但是,当 L1 误差值非常小时,表示为一个确定值即认为是接近正确的,loss 就会以更快的速度消失.

由于 Anchors 一般是有重叠,因此,相同目标的候选区域也存在重叠。

为了解决重叠 proposals 问题,采用 NMS 算法处理,丢弃与一个 score 更高的 proposal 间 IoU 大于预设阈值的 proposals.

虽然 NMS 看起来比较简单,但 IoU 阈值的预设需要谨慎处理. 如果 IoU 值太小,可能丢失 objetcs 的一些 proposals;如果 IoU 值过大,可能会导致 objects 出现很多 proposals。IoU 典型值为 0.7。

NMS 处理后,根据 sore 对topN 个 proposals 排序. 在 Faster R-CNN 论文中 N=2000,其值也可以小一点,如 50,仍然能的高好的结果.

当获得了可能的相关目标和其在原始图像中的对应位置之后,问题就更加直接了,采用 CNN 提取的特征和包含相关目标的边界框,采用 RoI Pooling 处理,并提取相关目标的特征,得到一个新的向量。

RPN 处理后,可以得到一堆没有分类得分的目标 proposals。待处理问题为,如何利用这些边界框并分类。

一种最简单的方法是,对每个 porposal,裁剪,并送入pre-trained base 网络,提取特征;然后,将提取特征来训练分类器. 但这就需要对所有的 2000 个 proposals 进行计算,效率低,速度慢。Faster R-CNN通过重用卷积特征图来加快计算效率,即采用 RoI(region of interest) Pooling 对每个 proposal 提取固定尺寸的特征图。然后 R-CNN 对固定尺寸的特征图分类。

目标检测中,包括 Faster R-CNN,常用一种更简单的方法,即:采用每个 proposal 来对卷积特征图裁剪crop,然后利用插值算法(一般为双线性插值 bilinear)将每个 crop resize 到固定尺寸14×14×ConvDepth. 裁剪后,利用 2×2 kernel 的 Max Pooling 得到每个 proposal 的最终7×7×ConvDepth 特征图.

之所以选择该精确形状,与其在下面的模块(R-CNN)中的应用有关。

R-CNN利用RoI Pooling提取的特征进行分类,采用全连接层来输出每个可能的 目标类别的分类得分,是Faster R-CNN框架中的最后一个步骤。

R-CNN 有两个不同的输出:

R-CNN 对每个 proposal 的特征图,拉平后采用 ReLU 和两个大小为 4096 维的全连接层进行处理。然后,对每个不同目标采用两个不同的全连接层处理:一个全连接层有 N+1 个神经单元,其中 N 是类别 class 的总数,包括 background class;一个全连接层有 4N 个神经单元,是回归预测输出,得到 N 个可能的类别分别预测 Δcenterx,Δcentery,Δwidth,Δheight。

R-CNN 的目标基本上是与 RPN 目标的计算是一致的,但需要考虑不同的可能的 object 类别 classes.

根据 proposals 和 ground-truth boxes,计算其 IoU。与任何一个 ground-truth box 的 IoU 大于 0.5 的 proposals 被设为正确的 boxes。IoU 在 0.1 到 0.5 之间时设为 background。这里忽略没有任何交叉的 proposals。这是因为,在此阶段,假设已经获得良好的 proposals。当然,所有的这些超参数都是可以用于调整以更好的拟合 objects。

边界框回归的目标计算的是 proposal 与其对应的 ground-truth间的偏移量,只对基于 IoU 阈值设定类别后的 proposals 进行计算。随机采用一个平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有类别class) 和 75% 的background proposals.

类似于 RPNs 的 losses,对于选定的 proposals,分类 loss 采用 multiclass entropy loss;对于 25% 的 foreground proposals 采用 SmoothL1 loss 计算其与 groundtruth box 的匹配。

由于 R-CNN全连接网络对每个类别仅输出一个预测值,当计算边框回归loss 时需谨慎,只需考虑正确的类别。

类似于 RPN,R-CNN 最终输出一堆带有类别分类的objects,在返回结果前,再进一步进行处理。

为了调整边界框,需要考虑概率最大的类别的 proposals. 忽略概率最大值为 background class 的proposals.

当得到最终的 objects 时,并忽略被预测为 background 的结果,采用 class-based NMS. 主要是通过对 objects 根据类别class 分组,然后根据概率排序,并对每个独立的分组采用 NMS 处理,最后再放在一起.

最终得到的 objects 列表,仍可继续通过设定概率阈值的方式,来限制每个类的 objects 数量.

Faster R-CNN在论文中是采用分步方法,对每个模块分别训练再合并训练的权重. 自此,End-to-end 的联合训练被发现能够得到更好的结果.

当将完整的模型合并后,得到 4 个不同的 losses,2 个用于 RPN,2 个用于 R-CNN。4 种不同的 losses 以加权和的形式组织. 可以根据需要对分类 loss 和回归 loss 设置权重,或者对 R-CNN 和 RPNs 设置不同权重.

采用 SGD 训练,momentum=0.9. 学习率初始值为 0.001,50K 次迭代后衰减为 0.0001. 这是一组常用参数设置。

6. 目标跟踪检测算法(一)——传统方法

姓名:刘帆;学号:20021210609;学院:电子工程学院

https://blog.csdn.net/qq_34919792/article/details/89893214

【嵌牛导读】目标跟踪算法研究难点与挑战在于实际复杂的应用环境 、背景相似干扰、光照条件的变化、遮挡等外界因素以及目标姿态变化,外观变形,尺度变化、平面外旋转、平面内旋转、出视野、快速运动和运动模糊等。而且当目标跟踪算法投入实际应用时,不可避免的一个问题——实时性问题也是非常的重要。正是有了这些问题,才使得算法研究充满着难点和挑战。

【嵌牛鼻子】目标跟踪算法,传统算法

【嵌牛提问】利用目标跟踪检测算法要达到何目的?第一阶段的单目标追踪算法包括什么?具体步骤有哪些?它们有何特点?

【嵌牛正文】

第一阶段

目标跟踪分为两个部分,一个是对指定目标寻找可以跟踪的特征,常用的有颜色,轮廓,特征点,轨迹等,另一个是对目标特征进行跟踪。

1、静态背景

1)背景差: 对背景的光照变化、噪声干扰以及周期性运动等进行建模。通过当前帧减去背景图来捕获运动物体的过程。

2)帧差: 由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧或三帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。

与二帧差分法不同的是,三帧差分法(交并运算)去除了重影现象,可以检测出较为完整的物体。帧间差分法的原理简单,计算量小,能够快速检测出场景中的运动目标。但帧间差分法检测的目标不完整,内部含有“空洞”,这是因为运动目标在相邻帧之间的位置变化缓慢,目标内部在不同帧图像中相重叠的部分很难检测出来。帧间差分法通常不单独用在目标检测中,往往与其它的检测算法结合使用。

3)Codebook

算法为图像中每一个像素点建立一个码本,每个码本可以包括多个码元(对应阈值范围),在学习阶段,对当前像素点进行匹配,如果该像素值在某个码元的学习阈值内,也就是说与之前出现过的某种历史情况偏离不大,则认为该像素点符合背景特征,需要更新对应点的学习阈值和检测阈值。

如果新来的像素值与每个码元都不匹配,则可能是由于动态背景导致,这种情况下,我们需要为其建立一个新的码元。每个像素点通过对应多个码元,来适应复杂的动态背景。

在应用时,每隔一段时间选择K帧通过更新算法建立CodeBook背景模型,并且删除超过一段时间未使用的码元。

4)GMM

混合高斯模型(Gaussian of Micture Models,GMM)是较常用的背景去除方法之一(其他的还有均值法、中值法、滑动平均滤波等)。

首先我们需要了解单核高斯滤波的算法步骤:

混合高斯建模GMM(Gaussian Mixture Model)作为单核高斯背景建模的扩展,是目前使用最广泛的一种方法,GMM将背景模型描述为多个分布,每个像素的R、G、B三个通道像素值的变化分别由一个混合高斯模型分布来刻画,符合其中一个分布模型的像素即为背景像素。作为最常用的一种背景建模方法,GMM有很多改进版本,比如利用纹理复杂度来更新差分阈值,通过像素变化的剧烈程度来动态调整学习率等。

5)ViBe(2011)

ViBe算法主要特点是随机背景更新策略,这和GMM有很大不同。其步骤和GMM类似。具体的思想就是为每个像素点存储了一个样本集,样本集中采样值就是该像素点过去的像素值和其邻居点的像素值,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点。

其中pt(x)为新帧的像素值,R为设定值,p1、p2、p3….为样本集中的像素值,以pt(x)为圆心R为半径的圆被认为成一个集,当样本集与此集的交集大于设定的阈值#min时,可认为此为背景像素点(交集越大,表示新像素点与样本集越相关)。我们可以通过改变#min的值与R的值来改变模型的灵敏度。

Step1:初始化单帧图像中每个像素点的背景模型。假设每一个像素和其邻域像素的像素值在空域上有相似的分布。基于这种假设,每一个像素模型都可以用其邻域中的像素来表示。为了保证背景模型符合统计学规律,邻域的范围要足够大。当输入第一帧图像时,即t=0时,像素的背景模型。其中,NG(x,y)表示空域上相邻的像素值,f(xi,yi)表示当前点的像素值。在N次的初始化的过程中,NG(x,y)中的像素点(xi,yi)被选中的可能次数为L=1,2,3,…,N。

Step2:对后续的图像序列进行前景目标分割操作。当t=k时,像素点(x,y)的背景模型为BKm(x,y),像素值为fk(x,y)。按照下面判断该像素值是否为前景。这里上标r是随机选的;T是预先设置好的阈值。当fk(x,y)满足符合背景#N次时,我们认为像素点fk(x,y)为背景,否则为前景。

Step3:ViBe算法的更新在时间和空间上都具有随机性。每一个背景点有1/ φ的概率去更新自己的模型样本值,同时也有1/ φ的概率去更新它的邻居点的模型样本值。更新邻居的样本值利用了像素值的空间传播特性,背景模型逐渐向外扩散,这也有利于Ghost区域的更快的识别。同时当前景点计数达到临界值时将其变为背景,并有1/ φ的概率去更新自己的模型样本值(为了减少缓慢移动物体的影响和摄像机的抖动)。

可以有如下总结,ViBe中的每一个像素点在更新的时候都有一个时间和空间上随机影响的范围,这个范围很小,大概3x3的样子,这个是考虑到摄像头抖动时会有坐标的轻微来回变化,这样虽然由于ViBe的判别方式仍认为是背景点,但是也会对后面的判别产生影响,为了保证空间的连续性,随机更新减少了这个影响。而在样本值保留在样本集中的概率随着时间的增大而变小,这就保证了像素模型在时间上面的延续特性。

6)光流

光流是由物体或相机的运动引起的图像对象在两个连续帧之间的视在运动模式。它是2D矢量场,其中每个矢量是一个位移矢量,显示点从第一帧到第二帧的移动。

光流实际上是一种特征点跟踪方法,其计算的为向量,基于三点假设:

1、场景中目标的像素在帧间运动时亮度(像素值或其衍生值)不发生变化;2、帧间位移不能太大;3、同一表面上的邻近点都在做相同的运动;

光流跟踪过程:1)对一个连续视频帧序列进行处理;2)对每一帧进行前景目标检测;3)对某一帧出现的前景目标,找出具有代表性的特征点(Harris角点);4)对于前后帧做像素值比较,寻找上一帧在当前帧中的最佳位置,从而得到前景目标在当前帧中的位置信息;5)重复上述步骤,即可实现目标跟踪

2、运动场(分为相机固定,但是视角变化和相机是运动的)

1)运动建模(如视觉里程计运动模型、速度运动模型等)

运动学是对进行刚性位移的相机进行构型,一般通过6个变量来描述,3个直角坐标,3个欧拉角(横滚、俯仰、偏航)。

Ⅰ、对相机的运动建模

由于这个不是我们本次所要讨论的重点,但是在《概率机器人》一书中提出了很多很好的方法,相机的运动需要对图像内的像素做位移矩阵和旋转矩阵的坐标换算。除了对相机建立传统的速度运动模型外,也可以用视觉里程计等通关过置信度的更新来得到概率最大位置。

Ⅱ、对于跟踪目标的运动建模

该方法需要提前通过先验知识知道所跟踪的目标对象是什么,比如车辆、行人、人脸等。通过对要跟踪的目标进行建模,然后再利用该模型来进行实际的跟踪。该方法必须提前知道要跟踪的目标对象是什么,然后再去跟踪指定的目标,这是它的局限性,因而其推广性相对比较差。(比如已知跟踪的物体是羽毛球,那很容易通过前几帧的取点,来建立整个羽毛球运动的抛物线模型)

2)核心搜索算法(常见的预测算法有Kalman(卡尔曼)滤波、扩展卡尔曼滤波、粒子滤波)

Ⅰ、Kalman 滤波

Kalman滤波器是通过前一状态预测当前状态,并使用当前观测状态进行校正,从而保证输出状态平稳变化,可有效抵抗观测误差。因此在运动目标跟踪中也被广泛使用。

在视频处理的运动目标跟踪里,每个目标的状态可表示为(x,y,w,h),x和y表示目标位置,w和h表示目标宽高。一般地认为目标的宽高是不变的,而其运动速度是匀速,那么目标的状态向量就应该扩展为(x,y,w,h,dx,dy),其中dx和dy是目标当前时刻的速度。通过kalman滤波器来估计每个时刻目标状态的大致过程为:

对视频进行运动目标检测,通过简单匹配方法来给出目标的第一个和第二个状态,从第三个状态开始,就先使用kalman滤波器预测出当前状态,再用当前帧图像的检测结果作为观测值输入给kalman滤波器,得到的校正结果就被认为是目标在当前帧的真实状态。(其中,Zt为测量值,为预测值,ut为控制量,Kt为增益。)

Ⅱ、扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)

由于卡尔曼滤波的假设为线性问题,无法直接用在非线性问题上,EKF和UKF解决了这个问题(这个线性问题体现在用测量量来计算预测量的过程中)。EKF是通过构建线性函数g(x),与非线性函数相切,并对每一时刻所求得的g(x)做KF,如下图所示。

UKF与EKF去求解雅可比矩阵拟合线性方程的方法不同,通过对那个先验分布中的采集点,来线性化随机变量的非线性函数。与EKF所用的方法不同,UKF产生的高斯分布和实际高斯分布更加接近,其引起的近似误差也更小。

Ⅲ、粒子滤波

1、初始状态:基于粒子滤波的目标追踪方法是一种生成式跟踪方法,所以要有一个初始化的阶段。对于第一帧图像,人工标定出待检测的目标,对该目标区域提出特征;

2、搜索阶段:现在已经知道了目标的特征,然后就在目标的周围撒点(particle), 如:a)均匀的撒点;b)按高斯分布撒点,就是近的地方撒得多,远的地方撒的少。论文里使用的是后一种方法。每一个粒子都计算所在区域内的颜色直方图,如初始化提取特征一样,然后对所有的相似度进行归一化。文中相似性使用的是巴氏距离;

3、重采样:根据粒子权重对粒子进行筛选,筛选过程中,既要大量保留权重大的粒子,又要有一小部分权重小的粒子;

4、状态转移:将重采样后的粒子带入状态转移方程得到新的预测粒子;

5、测量及更新:对目标点特征化,并计算各个粒子和目标间的巴氏距离,更新粒子的权重;

6、决策阶段:每个粒子都获得一个和目标的相似度,相似度越高,目标在该范围出现的可能性越高,将保留的所有粒子通过相似度加权后的结果作为目标可能的位置。

3)Meanshift算法

MeanShift算法属于核密度估计法,它不需要任何先验知识而完全依靠特征空间中样本点的计算其密度函数值。对于一组采样数据,直方图法通常把数据的值域分成若干相等的区间,数据按区间分成若干组,每组数据的个数与总参数个数的比率就是每个单元的概率值;核密度估计法的原理相似于直方图法,只是多了一个用于平滑数据的核函数。采用核函数估计法,在采样充分的情况下,能够渐进地收敛于任意的密度函数,即可以对服从任何分布的数据进行密度估计。

Meanshift算法步骤

1、通过对初始点(或者上一帧的目标点)为圆心,绘制一个半径为R的圆心,寻找特征和该点相似的点所构成的向量;

2、所有向量相加,可以获得一个向量叠加,这个向量指向特征点多的方向;

3、取步骤二的向量终点为初始点重复步骤一、二,直到得到的向量小于一定的阈值,也就是说明当前位置是特征点密度最密集的地方,停止迭代,认为该点为当前帧的目标点;

4)Camshift算法

Camshift算法是MeanShift算法的改进,称为连续自适应的MeanShift算法。Camshift 是由Meanshift 推导而来 Meanshift主要是用在单张影像上,但是独立一张影像分析对追踪而言并无意义,Camshift 就是利用MeanShift的方法,对影像串行进行分析。

1、首先在影像串行中选择目标区域。

2、计算此区域的颜色直方图(特征提取)。

3、用MeanShift算法来收敛欲追踪的区域。

4、通过目标点的位置和向量信息计算新的窗口大小,并标示之。

5、以此为参数重复步骤三、四。

Camshift 关键就在于当目标的大小发生改变的时候,此算法可以自适应调整目标区域继续跟踪。

3、小结

第一阶段的单目标追踪算法基本上都是传统方法,计算量小,在嵌入式等设备中落地较多,opencv中也预留了大量的接口。通过上面的两节的介绍,我们不难发现,目标检测算法的步骤分为两部分,一部分是对指定目标寻找可以跟踪的特征,常用的有颜色,轮廓,特征点,轨迹等,另一部分是对目标特征进行跟踪,如上文所提及的方法。所以目标检测方法的发展,也可总结为两个方面,一个是如何去获得更加具有区分性的可跟踪的稳定特征,另一个是如何建立帧与帧之间的数据关联,保证跟踪目标是正确的。

随着以概率为基础的卡尔曼滤波、粒子滤波或是以Meanshift为代表向量叠加方法在目标检测的运用,使得目标检测不再需要假设自身的一个状态为静止的,而是可以是运动的,更加符合复杂场景中的目标跟踪。

7. 目标检测算法是什么

目标检测算法是先通过训练集学习一个分类器,然后在测试图像中以不同scale的窗口滑动扫描整个图像;每次扫描做一下分类,判断一下当前的这个窗口是否为要检测的目标。检测算法的核心是分类,分类的核心一个是用什么特征,一个是用哪种分类器。

(7)目标检测器的使用方法扩展阅读:

目标检测算法可以分为:

1、背景建模法,包含时间平均模型、混合高斯模型、动态纹理背景、PCA模型、时一空联合分布背景模型

2、点检测法,包含Moravec检测器、Harris检测器 、仿射不变点检测、S IFT

3、图像分割法,包含Mean Shift方法 、Graph-cut方法、Active Contours方法

4、聚类分析法,包含支持向量机、神经网络、Adaptive Boosting

5、运动矢量场法,包含基于运动矢量场的方法

8. 目标检测中的样本不平衡处理方法——OHEM, Focal Loss, GHM, PISA

GitHub

CSDN

目前。计算机视觉中的性能最好的目标检测方法主要分为两种: one-stage 和two-stage 方法。two-stage方法分为两步,第一步为候选区域生成阶段(Proposal stage),通过如Selective Search、EdgeBoxes等方法可以生成数量相对较小候选目标检测框;第二步为分类与回归阶段,对第一阶段生成的 Candiate Proposal 进行分类和位置回归。one-stage 代表性的方法是R-CNN系列,如 R-CNN, Fast R-CNN, Faster R-CNN。 而one-stage 方法直接对图像的大量 Candiate Proposals 进行分类与回归。

这两类方法中均存在类别不平衡问题,two-stage 方法通过第一步已经将当量的候选区域降低到一个数量较小的范围,同时又在第二步通过一些启发式原则,将正负样本的比例降低到一定程度。而 one-stage 优于没有这降低候选框的步骤,因此,候选区域的数量大大超过 two-stage 方法,因此,在精度上,two-stage 仍然优于 one-stage 方法,但是在速度和模型复杂度上, one-stage 占优势。

类别不平衡会使检测器评估 的候选位置,但是通常只有少量的位置存在目标,这回导致两个问题:

因此,解决样本不平衡问题是提高目标检测精度的一个关键技术之一。

论文题目: Training Region-based Object Detectors with Online Hard Example Mining

OHEM 是通过改进 Hard Example Mining 方法,使其适应online learning算法特别是基于SGD的神经网络方法。Hard Example Mining 通过交替地用当前样本集训练模型,然后将模型固定,选择 False Positive 样本来重新组建用于下一次模型训练的样本集。但是因为训练神经网络本事就是一个耗时的操作,这样在训练中固定模型,这样会急剧降低模型的训练进程。

Hard Examples Mining通常有两种方法:

OHEM算法的大致流程是: 首先计算出每个ROI的loss, 然后按loss从高到低来排列每个 ROI, 然后为每张图片选择 个损失最高的 ROI 作为Hard Examples,其中 B 表示总的 ROI 数量, 表示batch-size 的大小,在 Fast R-CNN 中, N=2, B=128时,效果很好。

但是如果直接按照 loss 对所有的 ROI 进行选择,会有一个缺点,由于 ROI 很多,这样 很多 ROI 的位置就会相关并重叠,如果和某个高 Loss 的 ROI 重合度很高的其它 ROI很多, 这样, 这些 ROI 的 Loss 通常也会很多,这样这些样本都会被选择,但是它们可以近似认为时同一个,这样就会给其它较低 Loss 的 ROI 更少的选择余地,这样就会存在冗余。为了消除这种冗余,作者提出先使用 NMS (non-maximum suppression) 删除部分重合度很高的 ROI, 在使用上述方法进行 选择 Hard Example。

实现技巧:

论文,作者将该方法是现在 Fsat R-CNN 目标检测方法中。最简单做法是更改损失函数层,损失函数层首先计算所有 ROI 的 loss, 然后根据 loss 对 ROI 进行排序,并选择 hard RoIs, 让 那些 non-RoIs的损失变为0. 这种方法虽然很简单,但是非常不高效,因为还需要为所有的 RoIs 分配进行反向传播时需要的内存空间。

为了克服这个缺点,作者对下面的 Figure 1 进行改进, 如下面的 Figure 2.该改进时使用两份同样的 RoI network。 其中一个是只读的(readonly), 即只进行前向计算,不进行反向传播优化,所以只需要为前向传播分配内存,它的参数实时保持和另一个 RoI network(regular RoI network)保持一样。在每次迭代时,首先使用 readonly RoI network 对每个 ROI 计算起 loss,然后用上面描述的选择 hard RoIs 的方法选择 hard RoIs. 然后利用 regular RoI network来对选择的 hard RoIs 进行前向和后向计算来优化网络。

论文题目 Focal Loss for Dense Object Detection

在改论文中,作者认为样本类别的不平衡可以归结为难易样本的不平衡,从而更改交叉熵损失函数,重新对样本赋予不同的权值,之前的模型这些样本都是同等重要的,从而使模型训练更加关注 hard examples。

首先引入交叉熵的公式:

其中, ,表示真实类别, 表示我们预测的概率,为了方便,我们定义:

因此, ,该方法在 较大时,该loss是一个较小的量级, 如下图的连线所示所示,因为存在大量的易分类样本,相加后会淹没正样本的loss。

一个常见的解决类别不平衡的方式是引入一个加权因子 来表示正样本的权重, 表示负样本的权重。我们按照定义 的方法重新定义 为 , 定义如下:

虽然可以平衡 positive和negative的重要性,但是对 easy/hard 样本还是无法区分, Focal loss 通过更 Cross loss来达到区分easy/hard的目的:

上图展示了不同 取值对应的 loss,通过分析上述公式,我们发现,当 非常小时,即样本被分类错误,此时 接近1, loss几乎不受影响,当 接近于1时,即样本被分类正确,此时 接近0,此时降低了该样本的权重,比如,取 , 当时 时,该样本的 loss 会降低100倍,

在实际应用中,作者使用了该 Focal loss的变体,即加入了 平衡因子:

作者提出,对于二分类,一般模型的模型初始化会同概率的对待正负样本,由于类别不平衡,负样本的 loss 会占主导,作者提出在训练初始阶段对正样本的概率估计“prior”的概念,用 表示, 通过设置它来达到正样本的输出概率低的效果,比如为0.01,从而使模型更加关注正样本。实际操作中,出了最后一个用于分类的卷积层,其余卷积层的参数初始化为bias ,而最后一层 , 实验中设置为 0.01.

两个实现细节

论文题目: Gradient Harmonized Single-stage Detector

改论文提出 Focal Loss 存在两个缺点:

该论文有一句概括该篇论文的核心思想的一句话: 类别的不平衡可以归结为难易样本的不平衡,难易样本的不平衡可以归结为梯度的不平衡原话如下:

如下图所示:

左边是样本数量关于梯度的分布,中间表示各个修正后的函数的梯度(使用了log scale)对原始梯度的,右边表示所有样本集的梯度贡献的分布。

定义 是模型未经过 sigmoid 之前的输出, 则 ,得出该损失函数对 的梯度为:

定义梯度的模长(norm) 为:

训练样本的梯度密度(Gradient Density)定义如下:

其中, 是第 k 个样本的gradient norm,

这个公式可以理解为,以梯度 为中心,宽度为 的区域内的样本密度。

梯度密度协调参数:

分母是对梯度位于 范围的部分样本进行归一化,如果所有样本的梯度时均分分布,那么对于任意 都有 .(这里不是很理解为什么N,可以理解它们相等)

通过将梯度密度协调参数将 GHM 嵌入到损失函数中,则 GHM-C Loss 为:

计算公式11时,求和有一个N,再求 时会遍历所有的样本,因此该公式的时间复杂度为 .如果并行的化,每个计算单元也有N的计算量。对gradient norm进行排序的最好的算法复杂度为 ,然后用一个队列去扫描样本得到梯度密度的时间复杂度为 n 。基于排序的方法即使并行也不能较快的计算,因为N往往是 甚至 ,仍然是非常耗时的.

作者提出的近似求解的方法如下:

根据上述定义,得出近似梯度密度函数为:

利用上面的公式,由于我们可以事先求好 , 在求和时只需查找 即可,因此时间复杂度为 .

因为loss的计算是基于梯度密度函数,而梯度密度函数根据一个batch中的数据得到,一个batch的统计结果是有噪声的。与batch normalization相同,作者用Exponential moving average来解决这个问题,也就是

将模型鱼的的偏移量定义为 , 将真实的偏移量定义为 ,回归loss采用 Smooth L1 loss:

其中

则 关于 的梯度为:

从公式可以看出,当样本操作 时, 所有样本都有相同的梯度 1, 这就使依赖梯度范数来区分不同样本是不可能的, 一种简单的替代方法时直接使用 作为衡量标准,但是该值理论上无限大,导致 无法实现,

为了将 GHM 应用到回归损失上,作者修改了原始的 损失函数:

该函数和 具有类似的属性,当d的绝对值很小时,近似 L2 loss, 当d的绝对值比较大时, 近似 L1 loss, 关于d的梯度为:

这样就将梯度值限制在

定义 , 则 GHM-R Loss 为:

论文题目: Prime Sample Attention in Object Detection

PISA 方法和 Focal loss 和 GHM 有着不同, Focal loss 和 GHM 是利用 loss 来度量样本的难以程度,而本篇论文作者从 mAP 出法来度量样本的难易程度。

作者提出提出改论文的方法考虑了两个方面:

Prime Samples 是指那些对检测性能有着巨大影响的样本。作者研究表明样本的重要程度依赖于它和ground truth 的 IoU值,因此作者提出了一种 IOU-HLR 排序。

在目标检测中时如何定义正样本(True Positive)的呢?

剩余的标注为负样本。

mAP 的原理揭露了对目标检测器更重要的 两个准则 :

基于上述分析,作者提出了一种称为 IoU-HLR 的排序方法,它既反映了局部的IoU关系(每个ground truth目标周围),也反映了全局的IoU关系(覆盖整个图像或小批图像)。值得注意的是,不同于回归前的边界框坐标,IoU-HLR是根据样本的最终定位位置来计算的,因为mAP是根据回归后的样本位置来计算的。

该排序方法的大致流程如下图所示,其原理如下:

IoU-HLR遵循上述两个准则。首先,它通过局部排序(即上面的步骤2)将每个单独的 GT 的 对应的样本中 IoU 较高的样本放在前面,其次通过重采样和排序(步骤3, 4)将不同 GT 的 对应的样本中, 将 IoU 较高的放在了前面。

作者提出Prime Sample Attention,一种简单且有效的采样策略,该采样策略将更多的注意力集中到 Prime examples 上, PISA 由两部分组成: Importance- based Sample Reweighting(ISR)和Classification Aware Regression Loss(为CARL).

PISA 的训练过程是基于 prime samples 而不是同等对待所有样本。

作者提出一种基于 soft sampling 的方法: Importance-based Sample Reweighting (ISR), 他给不同样本根据重要性赋予不同的权重。首先它将Iou-HLR排序转化为线性映射的真实值。 IoU-HLR在每个类中分别进行计算。对于类 , 假设总共有 个样本, 通过 IoU-HLR 表示为 . 其中 ,使用一个线性转换函数将 转换为 , 表示第 类中的第 个样本的重要程度:

采用指数函数的形式来京一部将样本重要性 转换为 loss 的权值 , 表示对重要样本给予多大的优先权的程度因子, 决定最小样本权值的偏差(感觉就是一个决定最小的权值大小的一个变量)。

根据上面得到的权重值,重写交叉熵:

其中 n 和 m 分别表示真样本和负样本的数量, 和 分别表示预测分数和分类目标,需要注意的是,如果只是简单的添加 loss 权值将会改变 loss 的值,并改变正负样本的比例,因此为了保持正样本的总的 loss 值不变, 作者将 归一化为
(这里不是很理解,欢迎大家解惑)

5.3.1 已经介绍如何染个分类器知道 prime samples, 那么如何让回归其也知道 prime sample,作者提出了 Classification-Aware Regression Loss(CARL) 来联合优化分类器和回归其两个分支。CARL可以提升主要样本的分数,同时抑制其他样本的分数。回归质量决定了样本的重要性,我们期望分类器对重要样本输出更高的分数。两个分支的优化应该是相互关联的,而不是相互独立的。

作者的方法是让回归器知道分类器的分数,这样梯度就可以从回归器传播到分期其分支。公式如下:

表示相应类别的预测分数, 表示输出的回归偏移量。利用一个指数函数将 转化为 ,随后根据所有样本的平均值对它进行缩放。为了保持损失规模不变,对具有分类感知的 进行归一化。 是常用的smooth L1 loss。

关于 的梯度与原回归损失 成正比。 p_i mathcal{L}(d_i, hat d_i) mathcal{L}(d_i, hat d_i)$ 反映了样本i的定位质量,因此可以认为是一个IoU的估计,进一步可以看作是一个IoU-HLR的估计。可以近似认为,排序靠前的样本有较低的回归损失,于是分类得分的梯度较小。对于CARL来说,分类分支受到回归损失的监督。 不重要样本的得分被极大的抑制掉,而对重要样本的关注得到加强。

待续。。。

上面的方法大致可以分为两种:

Focal Loss认为正负样本的不平衡,本质上是因为难易样本的不平衡,于是通过修改交叉熵,使得训练过程更加关注那些困难样本,而GHM在Focal Loss的基础上继续研究,发现难易样本的不平衡本质上是因为梯度范数分布的不平衡,和Focal Loss的最大区别是GHM认为最困难的那些样本应当认为是异常样本,让检测器强行去拟合异常样本对训练过程是没有帮助的。PISA则是跳出了Focal Loss的思路,认为采样策略应当从mAP这个指标出发,通过IoU Hierarchical Local Rank (IoU-HLR),对样本进行排序并权值重标定,从而使得recall和precision都能够提升。

9. 目标检测系列(一):R-CNN

目标检测(object detection)是计算机视觉中非常重要的一个领域。在卷积神经网络出现之前,都利用一些传统方法手动提取图像特征进行目标检测及定位,这些方法不仅耗时而且性能较低。而在卷积神经网络出现之后,目标检测伍宏神领域发生了翻天覆地的变化。最着名的目标检测系统有RCNN系列、YOLO和SSD,本文将介绍RCNN系列的开篇作RCNN。

RCNN系列的技术演进过程可参见 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN 。

目标检测分为两步:第一步是对图像进行分类,即图像中的内容是什么;第二步则是对图像进行定位,找出图像中物体的具体位置。简单来说就是图像里面有什么,位置在哪。

然而,由于不同图片中物体出现的大小可能不同(多尺度),位置也可能不同,而且摆放角度,姿态等都可以不同,同时一张图片中还可以出现多个类别。这使得目标检测任务异常艰难。

上面任务用专业的说法就是:图像识别+定位

两个不同的分支分别完成不同的功能,分类和定位。回归(regression)分支与分类分支(classification)共享网络卷积部分的参数值。

还是刚才的分类识别+回归定位思路。只是现在我们提前先取好不同位置的框,然后将这个框输入到网络中而不是像思路一将原始图像直接输入到网络中。然后计算出这个框的得分,取得分最高的框。

如上,对于同一个图像中猫的识别定位。分别取了四个角四个框进行分类和回归。其得分分别为0.5,0.75,0.6,0.8,因此右下角得分最高,选择右下角的黑框作为目标位置的预测(这里即完成了绝告定位任务)。

这里还有一个问题——检测位置时的框要怎么取,取多大?在上面我们是在257x257的图像中取了221x221的4个角。以不同大小的窗口从左上角到右下角依次扫描的话,数据量会非常大。而且,如果考虑多尺度问题的话,还需要在将图像放缩到不同水腔亏平的大小来进行计算,这样又大大增加了计算量。如何取框这个问题可以说是目标检测的核心问题之一了,RCNN,fast RCNN以及faster RCNN对于这个问题的解决办法不断地进行优化,这个到了后面再讲。

总结一下思路:
对于一张图片,用各种大小的框将图片截取出来,输入到CNN,然后CNN会输出这个框的类别以及其位置得分。

对于检测框的选取,一般是采用某种方法先找出可能含有物体的框(也就是候选框,比如1000个候选框),这些框是可以互相重叠互相包含的,这样我们就可以避免暴力枚举所有框了。

讲完了思路,我们下面具体仔细来看看RCNN系列的实现,本篇先介绍RCNN的方法。

R-CNN相比于之前的各种目标检测算法,不仅在准确率上有了很大的提升,在运行效率上同样提升很大。R-CNN的过程分为4个阶段:

在前面我们已经简单介绍了selective search方法,通过这个方法我们筛选出了2k左右的候选框。然而搜索出的矩形框大小是不同的。而在AlexNet中由于最后全连接层的存在,对于图像尺寸有固定的要求,因此在将候选框输入之前,作者对这些候选框的大小进行了统一处理——放缩到了统一大小。文章中作者使用的处理方法有两种:

(1)各向异性缩放

因为图片扭曲可能会对后续CNN模型训练产生影响,于是作者也测试了各向同性缩放的方法。有两种方法:

此外,作者对于bounding box还尝试了padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。

卷积神经网络训练分为两步:(1)预训练;(2)fine-tune。
先在一个大的数据集上面训练模型(R-CNN中的卷机模型使用的是AlexNet),然后利用这个训练好的模型进行fine-tune(或称为迁移学习),即使用这个预训练好的模型参数初始化模型参数,然后在目标数据集上面进行训练。

此外,在训练时,作者还尝试采用不同层数的全连接层,发现一个全连接层比两个全连接层效果要好,这可能是因为使用两个全连接层后过拟合导致的。

另一个比较有意思的地方是:对于CNN模型,卷积层学到的特征其实就是基础的共享特征提取层,类似于传统的图像特征提取算法。而最后的全连接层学到的则是针对特定任务的特征。譬如对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。

最后,利用训练好的模型对候选框提取特征。

关于正负样本的问题:由于选取的bounding box不可能与人工label的完全相同,因此在CNN训练阶段需要设置IOU阈值来为bounding box打标签。在文章中作者将阈值设置为0.5,即如果候选框bounding box与人工label的区域重叠面积大于0.5,则将其标注为物体类别(正样本),否则我们就把他当做背景类别(负样本)。

作者针对每一个类别都训练了一个二分类的SVM。这里定义正负样本的方法与上面卷积网络训练的定义方法又不相同。作者在文章中尝试了多种IoU阈值(0.1~0.5)。最后通过训练发现,IoU阈值为0.3的时候效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点)。即当IoU小于0.3的时候我们将其视为负样本,否则为正样本。

目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。

在实现边界回归的过程中发现了两个微妙的问题。第一是正则化是重要的:我们基于验证集,设置λ=1000。第二个问题是,选择使用哪些训练对(P,G)时必须小心。直观地说,如果P远离所有的检测框真值,那么将P转换为检测框真值G的任务就没有意义。使用像P这样的例子会导致一个无望的学习问题。因此,只有当提案P至少在一个检测框真值附近时,我们才执行学习任务。“附近”即,将P分配给具有最大IoU的检测框真值G(在重叠多于一个的情况下),并且仅当重叠大于阈值(基于验证集,我们使用的阈值为0.6)。所有未分配的提案都被丢弃。我们为每个目标类别执行一次,以便学习一组特定于类别的检测框回归器。

在测试时,我们对每个提案进行评分,并预测其新的检测框一次。原则上,我们可以迭代这个过程(即重新评估新预测的检测框,然后从它预测一个新的检测框,等等)。但是,我们发现迭代不会改进结果。

使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制(NMS)去除相交的多余的框。再对这些框进行canny边缘检测,就可以得到bounding-box(then B-BoxRegression)。

参考:
Rich feature hierarchies for accurate object detection and semantic segmentation.
RCNN-将CNN引入目标检测的开山之作-晓雷的文章
基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
R-CNN 论文翻译

10. 详细解读TPH-YOLOv5 | 让目标检测任务中的小目标无处遁形

1 简介

针对无人机捕获场景的目标检测是最近比较流行的一项任务。由于无人机在不同高度飞行,目标尺度变化较大,这样给模型的优化也带来了很大的负担。此外,在无人机进行高速低空飞行时,也会带来密集目标的运动模糊问题。

图1 小目标与密集问题

为了解决上述2个问题,本文提出了 TPH-YOLOv5 TPH-YOLOv5 在YOLOv5的基础上增加了一个prediction heads 来检测不同尺度的目标。然后通过探索Self-Attention的预测潜力使用了Transformer Prediction Heads(TPH)代侍戚野替原来的prediction heads。同时作者还集成了卷积块Attention模型(CBAM)来寻找密集场景下的注意力区域。

为了进一步改进 TPH-YOLOv5 ,作者还提供了大量有用的策略,如数据增强、多尺度测试、多模型集成和使用额外的分类器。

在VisDrone2021数据集上的大量实验表明,TPH-YOLOv5在无人机捕获场景上具有良好的性能和可解释性。在DET-test-challenge数据集上,TPH-YOLOv5的AP结果为39.18%,比之前的SOTA方法(DPNetV3)提高了1.81%。在VisDrone Challenge 2021中,TPH-YOLOv5与YOLOv5相比提高了约7%。

本文的贡献如下:

2 前人工作总结 2.1 Data Augmentation

数据增强的意义主要是扩展数据集,使模型对不同环境下获得的图像具有较高的鲁棒性。

Photometric和geometric被研究人员广泛使用。对于Photometric主要是对图像的色相、饱和度和值进行了调整。在处理geometric时主要是添加随机缩放、裁剪、平移、剪切和旋转。

除了上述的全局像素增强方法外,还有一些比较独特的数据增强方法。一些研究者提出了将多幅图像结合在一起进行数据增强的方法,如MixUp、CutMix和Mosaic。

MixUp从训练图像中随机选取2个样本进行随机加权求和,样本的标签也对应于加权求和。不同于通常使用零像素mask遮挡图像的遮挡工作,CutMix使用另一个图像的区域覆盖被遮挡的区域。Mosaic是CutMix的改进版。拼接4幅图像,极大地丰富了被检仔型测物体的背景。此外,batch normalization计算每层上4张不同图像的激活统计量。

在TPH-YOLOv5的工作中主要是结合了MixUp、Mosaic以及传统方法进行的数据增强。

2.2 Multi-Model Ensemble Method

我们都知道深度学习模型是一种非线性方法。它们提供了更大的灵活性,并可以根据训练数据量的比例进行扩展。这种灵活性的一个缺点是,它们通过随机训练算法进行学习,这意味着它们对训练数据的细节非常敏感,每次训练时可能会得到一组不同的权重,从而导致不同的预测。 这给模型带来了一个高方差

减少模型方差的一个成功方法是训练多个模型而不是单一模型,并结合这些模老喊型的预测。

针对不同的目标检测模型,有3种不同的ensemble boxes方法:非最大抑制(NMS)、Soft-NMS、Weighted Boxes Fusion(WBF)。

在NMS方法中,如果boxes的overlap, Intersection Over Union(IoU)大于某个阈值,则认为它们属于同一个对象。对于每个目标NMS只留下一个置信度最高的box删除其他box。因此,box过滤过程依赖于这个单一IoU阈值的选择,这对模型性能有很大的影响。

Soft-NMS是对NMS进行轻微的修改,使得Soft-NMS在标准基准数据集(如PASCAL VOC和MS COCO)上比传统NMS有了明显的改进。它根据IoU值对相邻边界box的置信度设置衰减函数,而不是完全将其置信度评分设为0并将其删除。

WBF的工作原理与NMS不同。NMS和Soft-NMS都排除了一些框,而WBF将所有框合并形成最终结果。因此,它可以解决模型中所有不准确的预测。本文使用WBF对最终模型进行集成,其性能明显优于NMS。

2.3 Object Detection

基于CNN的物体检测器可分为多种类型:

一些检测器是专门为无人机捕获的图像设计的,如RRNet、PENet、CenterNet等。但从组件的角度来看,它们通常由2部分组成,一是基于CNN的主干,用于图像特征提取,另一部分是检测头,用于预测目标的类和Box。

此外,近年来发展起来的目标检测器往往在backbone和head之间插入一些层,人们通常称这部分为检测器的Neck。接下来分别对这3种结构进行详细介绍:

Backbone

常用的Backbone包括VGG、ResNet、DenseNet、MobileNet、EfficientNet、CSPDarknet53、Swin-Transformer等,均不是自己设计的网络。因为这些网络已经证明它们在分类和其他问题上有很强的特征提取能力。但研究人员也将微调Backbone,使其更适合特定的垂直任务。

Neck

Neck的设计是为了更好地利用Backbone提取的特征。对Backbone提取的特征图进行不同阶段的再处理和合理使用。通常,一个Neck由几个自底向上的路径和几个自顶向下的路径组成。Neck是目标检测框架中的关键环节。最早的Neck是使用上下取样块。该方法的特点是没有特征层聚合操作,如SSD,直接跟随头部后的多层次特征图。

常用的Neck聚合块有:FPN、PANet、NAS-FPN、BiFPN、ASFF、SAM。这些方法的共性是反复使用各种上下采样、拼接、点和或点积来设计聚合策略。Neck也有一些额外的块,如SPP, ASPP, RFB, CBAM。

Head

作为一个分类网络,Backbone无法完成定位任务,Head负责通过Backbone提取的特征图检测目标的位置和类别。

Head一般分为2种:One-Stage检测器和Two-Stage检测器。

两级检测器一直是目标检测领域的主导方法,其中最具代表性的是RCNN系列。与Two-Stage检测器相比One-Stage检测器同时预测box和目标的类别。One-Stage检测器的速度优势明显,但精度较低。对于One-Stage检测器,最具代表性的型号是YOLO系列、SSD和RetaNet。

3TPH-YOLOv53.1 Overview of YOLOv5

YOLOv5有4种不同的配置,包括YOLOv5s,YOLOv5m, YOLOv5l和YOLOv5x。一般情况下,YOLOv5分别使用CSPDarknet53+SPP为Backbone,PANet为Neck, YOLO检测Head。为了进一步优化整个架构。由于它是最显着和最方便的One-Stage检测器,作者选择它作为Baseline。

图2 THP-YOLOv5整体架构

当使用VisDrone2021数据集训练模型时,使用数据增强策略(Mosaic和MixUp)发现YOLOv5x的结果远远好于YOLOv5s、YOLOv5m和YOLOv5l, AP值的差距大于1.5%。虽然YOLOv5x模型的训练计算成本比其他3种模型都要高,但仍然选择使用YOLOv5x来追求最好的检测性能。此外,根据无人机捕获图像的特点,对常用的photometric和geometric参数进行了调整。

3.2 TPH-YOLOv5

TPH-YOLOv5的框架如图3所示。修改了原来的YOLOv5,使其专一于VisDrone2021数据集:

图3 TPH-YOLOv5模型结构 微小物体的预测头

作者统计了VisDrone2021数据集,发现它包含了很多非常小的目标,所以增加了一个用于微小物体检测的预测头。结合其他3个预测头,4头结构可以缓解剧烈的目标尺度变化带来的负面影响。如图3所示,添加的预测头(Head 1)是由low-level、高分辨率的feature map生成的,对微小物体更加敏感。增加检测头后,虽然增加了计算和存储成本,但对微小物体的检测性能得到了很大的提高。

Transformer encoder block

图4 Transformer Block

用Transformer encoder块替换了YOLOv5原版中的一些卷积块和CSP bottleneck blocks。其结构如图4所示。与CSPDarknet53中原有的bottleneck blocks相比,作者认为Transformer encoder block可以捕获全局信息和丰富的上下文信息。

每个Transformer encoder block包含2个子层。第1子层为multi-head attention layer,第2子层(MLP)为全连接层。每个子层之间使用残差连接。Transformer encoder block增加了捕获不同局部信息的能力。它还可以利用自注意力机制来挖掘特征表征潜能。在VisDrone2021数据集中,Transformer encoder block在高密度闭塞对象上有更好的性能。

基于YOLOv5,作者只在头部部分应用Transformer encoder block形成transformer Prediction head(TPH)和backbone端。因为网络末端的特征图分辨率较低。将TPH应用于低分辨率特征图可以降低计算和存储成本。此外,当放大输入图像的分辨率时可选择去除早期层的一些TPH块,以使训练过程可用。

Convolutional block attention mole (CBAM)

CBAM是一个简单但有效的注意力模块。它是一个轻量级模块,可以即插即用到CNN架构中,并且可以以端到端方式进行训练。给定一个特征映射,CBAM将沿着通道和空间两个独立维度依次推断出注意力映射,然后将注意力映射与输入特征映射相乘,以执行自适应特征细化。

图5 CBAM注意力机制

CBAM模块的结构如图5所示。通过本文的实验,在不同的分类和检测数据集上将CBAM集成到不同的模型中,模型的性能得到了很大的提高,证明了该模块的有效性。

在无人机捕获的图像中,大覆盖区域总是包含令人困惑的地理元素。使用CBAM可以提取注意区域,以帮助TPH-YOLOv5抵制令人困惑的信息,并关注有用的目标对象。

Self-trained classifier

用TPH-YOLOv5对VisDrone2021数据集进行训练后,对test-dev数据集进行测试,然后通过可视化失败案例分析结果,得出TPH-YOLOv5定位能力较好,分类能力较差的结论。作者进一步探索如图6所示的混淆矩阵,观察到一些硬类别,如三轮车和遮阳三轮车的精度非常低。

图6 检测混淆矩阵

因此,作者提出了一个Self-trained classifier。首先,通过裁剪ground-truth边界框并将每个图像patch的大小调整为64 64来构建训练集。然后选择ResNet18作为分类器网络。实验结果表明,在这个Self-trained classifier的帮助下,所提方法对AP值提高了约0.8%~1.0%。

4实验与结论

最终在test-set-challenge上取得了39.18的好成绩,远远高于VisDrone2020的最高成绩37.37。

图9 检测结果图

阅读全文

与目标检测器的使用方法相关的资料

热点内容
排烟风口与短管连接方法 浏览:701
姚桐斌研究的方法 浏览:737
引伸计安装方法 浏览:618
吉娃娃手机使用方法 浏览:849
安卓系统通讯录设置在哪里设置方法 浏览:815
怎么备孕最好方法 浏览:812
颈椎病治疗方法用什么中药治 浏览:246
水钻打空调眼儿使用方法视频 浏览:819
口腔颌面肿瘤治疗方法 浏览:959
冲成人奶粉的正确方法 浏览:193
404x125的简便运算方法 浏览:10
水泥多孔砖砌墙方法图片 浏览:705
孢谷草种植方法 浏览:283
莴笋青菜种植方法 浏览:736
前列腺增生怎么治疗方法 浏览:846
12伏蓄电池存电量计算方法 浏览:219
冲压工36技计算方法计算实例 浏览:858
骨化三醇免疫治疗方法 浏览:306
三联疗法如何服用方法 浏览:426
93乘43加91的简便方法 浏览:393