Integral Channel Features

Integral Channel Features-ICF


本文是我piotr dollar的integral channel features的理解,如有错误或者疑问请及时与我联系,谢谢。



一、导读

Integral Channel Features是指一类特征,这类特征可以通过积分图(Integral images)快速的计算出来。例如,Haar feature,local sums,gradient histograms。都可以通过积分图(Integral images)快速的计算出来。


PS:这里有几点要说明

1.什么是Haar特征,简单的说,在图像中划定一个矩形框,如下图,然后分别求出区域1和区域2中所有像素的和,记作sum(1),sum(2)。然后这俩个差值:sum(1)-sum(2)的值就是一个 Haar特征。当然,这只是一个例子,这个矩形可以有很多其它形式,详细了解请参考Haar


      


2.local sums这个特征就是图像中局部区域的像素和,比如上面的sum(1)


3.gradient histogram(梯度直方图):求出原始图像的gradient angle 和gradient magnitude,这个角度的值会决定对应像素落在直方图的那个bin上,而这个像素的gradient magnitude值会决定这个像素对这个bin的贡献。举个例子,下面这个梯度直方图有六个bin,分别是0-30度~150-180度。如果现在有个像素,它的gradient angle是142度,gradient magnitude是13,那么,这个像素会对120-150这个区间的直方图做出贡献,贡献值是13.更详细内容请参考HOG





4.积分图(Integral images),这个直接上图吧,比如下面4*4的图像

它的积分图也是同样大小的图片,即4*4大小,在积分图中,每个像素的的值,是原始图像中该位置左上角区域内所有的像素和。比如积分图像中,第二行第二列的像素就应该是:2+3+4+6=15



所以,上图的积分图像是这样的:


有了这个积分图像(Integral images)我们就可以很轻松的算出上面提到的特征了。比如求local sums 特征(这个矩形大小是2*2)

所以这个local sum应该是:7+5+6+4=22,这是原始做法

  


现在有了积分图,我们可以换一种方式,我们可以这样算:

rect(3,3)-rect(3,1)-rect(1,3)+rect(1,1)=39-9-10+2=22

rect(i,j)代表积分图中第i行第j列元素的值,如rect(3,3)代表积分图中第三行,第三列的值,也就是39.如果刚接触积分图的话,可能看这会有点不理解,下面补张图说明一下:

sum(1)=点1左上角区域的像素和,也就是区域A中的像素和。
sum(2)=点2左上角区域的像素和,也就是区域A和区域B中的像素和。
sum(3)=点3左上角区域的像素和,也就是区域A和区域C中的像素和。
sum(4)=点4左上角区域的像素和,也就是区域A,B,C,D中的像素和。
这就是积分图中每个点值的求法,所以,有了积分图,我们就能算出任一矩形区域D的像素和了。
sum(D)=sum(4)-sum(3)-sum(2)+sum(1)

上面介绍的特征可以通过积分图像很快的计算出来,这样速度是提上来了,但是准确性不行啊,因为只用原始图像,内容不够丰富,所以导致特征比较有局限的。为了解决这个问题,作者在这篇论文中又介绍了许多Channel ,这些Channel是通过对原始图像进行线性或者非线性变化的到的图像,利用不同Channel的积分图像,求出的上述各个特征,内容将会丰富很多,也更能真实的、全面的反映出图片的本质内容

ps:如果跟我一样,刚接触这些内容,为了理解,可以这样做个类比,我们要了解一幅图像的真实的,客观的内容,就像我们了解一个人一样,我们只看这个人的外表(原始图像),的到的信息是不完善的,也不可能全面的了解他,为了深入的了解他,我们可以继续观察生活中的他、工作中的他(不同的channel)等等,通过这些不同场合的观察,我相信你对这个人会有很深很全面的认识。哈哈,自己想的时候很有道理,写出来咋赶脚这么逗比~~





二、Channel Types

作者在论文的第二部分介绍了几种不同的Channel,下面我我也整理下:

上面简单说了一下,什么Channel,说白了就是对原始图像I的另一种表达,比如原始图像的灰度图,就是一个Channel,原始图像的LUV彩色图,它的三个通道L,U,V都是一个Channel.还要很多其它的Channel,这些通道Channel都是通过对原始图像I进行线性或者非线性的变换的到的。

下图是原文中的图片,就是luv三个chanel的图像

        



1.Gray&Color:就是灰度图或者彩色图像的通道,比如RGB图像的三个通道,或者LUV图像的三个通道。

2.Linear Filters:线性滤波器,利用不同的滤波器,作用在原始图像上,从而得到不同的Channel。文中提到的滤波器有Gabor filters,DoG(diffierence of Gaussian)filter,利用线性滤波器,是得到不同channels的有效方法。

3.nonlinear  transformations:非线性变换,本文提到的有gradient magnitude,Canny等,下图中,就是本文中提到的几个 Channel,有线性的和非线性的变换,先看一下,有个直观的认识,具体这些滤波器和变换可以再慢慢查资料看


4.Integral Histogram:积分直方图,这个,就是利用积分图像计算图像的直方图。首先,先将原始图像I按照一定方式量化,比如像灰度图那样,I中像素的取值范围是0~255之间的整数,这样最后的直方图就有256个bin了。或者可以按照上面提到的gradient histogram,按像素的gradient angle进行量化,之前的例子是将180度分成了6份,所以在那个例子中,最后的直方图就有6个bin。

我就按这3个bin的情况举个例子,最后直方图有三个bin,分别是0-60度,60-120度,120-180度。我们将原始图像I量化,量化后生成3幅和原始图像同样大小的图片。下图中,原始图中是每个像素的gradient angle.生成的三幅图像,大小与原图相同,如果对应原始图像像素的角度在其范围内,则至1,否则置0,如下:





注意,生成的三个bin图像中,像素代表的是在对应范围内,像素的分布情况,所以,三幅bin图像内像素加起来应该是一幅4*4大小,全是1的图像。有了Q1,Q2,Q3,我们就有了原始图像的直方图了,如下。下面,只要我们分别求出Q1,Q2,Q3的积分图像(上面有介绍介分图的定义哦),我们就可以通过几次运算,求出原始图像中,任何矩形区域内的直方图了,而且效率很高,因为只要开始时把Q1,Q2,Q3的积分图算出,后面的运算只是有限次加减运算,就可以求出。



注:0~60区间有7个像素,60~120区间有6个像素,120~180区间有3个像素,共16个像素。


注意:以上部分是帮助理解原论文中的内容,详细请参考原论文,为了方便理解,上面举的例子都没用考虑图像的边缘处理方法,在原论文中指出,各个channel,都要比原图要小一些,是因为为了消除边缘的影响,在channel中,将边缘舍弃了。



5.pointwise transformations:对像素逐个进行操作,例如取原始图像中每个像素值的log值,这样的到的channel中的local sum值,经过取e的幂,就可以变成原始图像像素的局部乘积,从而拓宽了应用,而并不必须是local sum的值


在这部分,作者提出pre-smoothing和post-smoothing的概念,就是普通的滤波,只不过前者作用在原图上,后者作用在由原图求出的channel图像上,两者都会影响最重的特征值,但相对来说pre-smoothing影响更大,而post-smoothing的影响很小。



三、实现细节


这部分作者介绍了pre-smoothing的技巧,还有一些计算复杂度的讨论和算法的优化,这里我只介绍两部分:第一个是Features,第二个是分类器Boodting.


1.特征Features:作者提出两个概念,first-order feature和higher-order feature,我翻译成一阶特征(first-order feature)和高阶特征(higher-order feature),一阶特征是指,特定channel中一个矩形区域内的像素和,而高阶特征是由多个一阶特征的加权和组成,后面作者讨论过,高阶特征不仅计算负责,而且对提高分类器性能并没有太明显帮助,所以,主要用一阶特征。


2.Boosting:本论文用这个算法,关于这个的内容挺多的,我介绍下学习的顺序吧:

首先应该学习下adaboost这个算法,这个一个集成算法,思想利用弱分类器,构成强分类器。对于行人检测来说,使用的弱分类器一般是单层或者两层的决策树,所以也要看一下决策树的概念。了解这两个算法后,就要去读一下Paul Viola大牛的<>论文,这里提出一种cascade adaboost算法,本来是用在人脸检测上,后来发现也很适合做行人检测,这个cascade adaboost算法的精髓是对于哪些很明显不是目标的样本尽早的排出,而将更多精力放在哪些不容易确定的样本上,大概流程如下图:



这里用圆圈扩起来的1,2,3,4都是一个用adaboost训练好的分类器,而且结构越往后越复杂,分类能力也越强,一开始将所有待检测的样本(sub-windows)用分类器1处理,哪些经过1的判断是正确的样本将进入第二轮,也就是会用分类器2进行下一步处理,而经过1判断是错误的样本,将直接排除,后续的分类器2将不会作用在这些样本上。当然,这只是简单的介绍,方便了解,实际的情况比这个要复杂些,特别是对于这些被排除的样本,还要经过些处理,这里就先不讨论了。

了解完这个cascade adaboost后,会发现这个算法的参数比较多,设定起来也不太方便,后续很多人在此基础上,提出了改进算法,其中一个是叫做soft-cascade adaboost的,相关内容可以在论文<>找到详细的介绍。soft-cascade adaboost是对上面的改进,这里不用分别设计很多层的强分类器,而是直接设计一个强分类器,这个强分类器有很多弱分类器组成,每个弱分类器后面都设置一个阈值,剩下的流程和上面类似,只有通过前面弱分类器的考验,才可以进入下一轮挑战。

学完这个之后,可以在读一下<>,会介绍下别的形式的分类器。我也整理了关于cascade类型分类器的内容,感兴趣可以看一下。


在本篇论文中,作者使用的分类器是:soft-cascade型分类器。具体内容是这样,由两层的决策树作为弱分类器,一共用1000个弱分类器,有20000个训练样本(training windows),5000个特征(features),记得前面提过,用一阶特征就足够了,所以这5000个features都是first-order features.

训练样本中,负样本的选择对训练分类器也有很重要的影响,论文中是这样产生负样本的(negative windows),先准备5000个负样本,训练分类器,这个分类器会将一部分负样本判断成正样本,也就是false-postive的样本,我们下一步就是在这些被误判的负样本中,利用bootstrapping方法,再生成5000个负样本,然后再重复一下上面的操作,这样一共有了5000+5000+5000=15000个负样本。

5000个features是这样产生的,它随机从30000个features中选择。这30000个features在论文中叫做candidate features,这个候选特征的个数也是个重要参数,凭直觉的,当然越多越有代表性,最后训练的分类器效果也会越好,经过原作者试验,三万个就很好啦。那么怎么选择这30000个features的呢,首先随机选择channel,再随机选择一个矩形框,计算它的sum,这是一个feature,我们重复三万次次,就可以产生30000个features了。注意,这个channel,是从指定几个类型中随机选择的,特别是下面的讨论中,也是这样,所谓随机选择矩形框,有两个随机内容,一、随机选择矩形位置,二、随机选择矩形大小。当然了,矩形可不能超过原图范围。



四、测试性能


论文在第四部分,对很多参数进行了测试,从而选出一组最近的参数。作者在这部分讨论了通道(channel)的选择、特征的选择(feature),以及pre-smoothing 使用滤波器的选择和分类器的选择,讨论这些对最后分类器性能的影响,论文中图文并貌,写的时分详细,不在赘述。最后作者得出的结论是:

1.用LUV+Gradient magnitude+gradienthist这几个channel组合的性能最好。

2.pre-smoothing使用的滤波器参数设置成1效果最好

3.用30000个候选的features效果最好

4.用1000个弱分类器训练adaboost效果比较好。




最后,总个以上,作者选择一组最优化的参数,并将这个分类器起了个名字,叫做:ChnFtrs


这个分类器的参数如下:

(1)LUV+Gradient magnitude+gradienthis(6个方向)共10个channels

(2)pre-smoothing 滤波器参数,r=1

(3)2000个弱分类器

(4)30000后选特征


你可能感兴趣的:(行人检测)