第九弹:HOG

这是物体检测的第一篇,其实物体检测,物体定位,物体分割关联很大,许多模型都能同时实现以上三个功能。

一、论文翻译

摘要

我们研究了视觉目标检测的特征集问题,并用线性SVM方法进行人体检测来测试,通过与当前的基于边缘和梯度的描述子进行实验对比,得出方向梯度直方图(Histograms of Oriented Gradient,HOG)描述子在行人检测方面表现更加突出。我们研究了计算过程中每一阶段的影响,得出小尺度梯度(fine-scale gradients)、精细方向采样(fine orientation binning)、粗糙空域抽样(coarse spatial binning)以及重叠描述子块的局部对比度归一化(local contrastnormalization in overlapping descriptor blocks)都对最终结果有重要作用。这种方法在最初的MIT行人数据库上表现近乎完美,所以我们引入了一个更具挑战性的包含1800个不同姿势和背景的已标注人体数据集。

1 引言

由于人体姿势和外表的多变,在图像中检测人体是一项具有挑战性的工作。首先需要的就是一个强壮的特征集,使得在不同光照和背景下都能清晰地分辨出人体。我们研究了人体检测的特征集问题,局部归一化的HOG描述子相比于现存的特征集(包括小波[17,22])有更好的表现。相比于边缘方向直方图(EdgeOrientation Histograms[4,5])、SIFT([12])、形状上下文(Shape Contexts[1]),HOG是在网格密集的大小统一的细胞单元(dense grid of uniformlyspaced cells)上进行计算,而且为了提高性能,还采用了重叠的局部对比度归一化(overlapping local contrastnormalizations)。我们用行人检测(人体是大部分可见的并且基本上是直立的)进行测试,为了保证速度和简洁性,使用线性SVM作为分类器。HOG检测器在MIT的行人数据集([17,18])上表现相当好,所以我们又引入了一个更具挑战性的包含1800个不同姿势和背景的已标注人体数据集。正在进行的工作表明,我们的特征集对于其他基于形状的目标检测也同样好。

第2节中简要介绍了在人体检测上前人的研究工作,第3节是HOG方法的总体介绍,第4节介绍了我们使用的数据集,第5-6节是HOG方法的详细介绍以及不同处理阶段的实验结果,第7节是结论和总结。

2 前人的研究工作

在目标检测方向上有大量的文献,这里只列举与人体检测有关的论文[18,17,22,16,20][6]是一篇综述。Papageorgiou等[18]提出了一种使用纠正哈尔小波(rectified Haarwavelet)作为特征的多项式SVM行人检测方法,以及[17]中基于子窗口的改进方法。Depoortere等给出了论文[2]中方法的一个最优化版本。Gavrila和Philomen[8]采用一种更直接的方法,提取边缘图并将其与样本进行匹配,使用chamfer距离作为评判标准,这种方法已被用在一个实时行人检测系统中[7]。Viola等[22]提出了一种高效的运动人体检测器,使用AdaBoost来训练一串渐进复杂的基于类Haar小波和时空差的区域拒绝规则。Ronfard等[19]提出了一种关节式的身体检测器,他通过将基于SVM的肢体分类器合并到动态规划框架中的一阶和二阶高斯滤波来实现,与Felzenszwalb和Huttenlocher[3],以及Ioffe和Forsyth[9]的方法相似。

Mikolajczyk等[16]提出了一种方向位置直方图和二值梯度幅值相结合的身体部位检测器,能够检测脸、头、以及身体上部或下部的前视或侧视轮廓。相比之下,我们的检测器结构更简单,使用单一检测窗口,但行人检测的效果更好。

3 算法概述

此节是HOG特征提取方法的概述,实现细节在第6节。此方法基于对稠密网格中归一化的局部方向梯度直方图的计算。相似的特征在过去十年中越来越多的被使用[4,5,12,15]。此类方法的基本观点是:局部目标的外表和形状可以被局部梯度或边缘方向的分布很好的描述,即使我们不知道对应的梯度和边缘的位置。在实际操作中,将图像分为小的细胞单元(cells),每个细胞单元计算一个梯度方向(或边缘方向)直方图。为了对光照和阴影有更好的不变性,需要对直方图进行对比度归一化,可以通过将细胞单元组成更大的(blocks)并归一化块内的所有细胞单元来实现。我们将归一化的块描述符叫做HOG描述子。将检测窗口中的所有块的HOG描述子组合起来就形成了最终的特征向量,然后使用SVM分类器进行人体检测,见图1。

图1

图1描述了我们的特征提取和目标检测流程。检测窗口划分为重叠的块,在块中计算HOG描述子,形成的特征向量放到线性SVM中进行目标/非目标的分类。检测窗口在整个图像的所有位置和尺度上进行扫描,并在输出的用来检测目标的金字塔上进行非极大值抑制,本文主要讲特征提取的过程。

方向直方图的使用已有很多先例[13,4,5],但是直到Lowe的SIFT尺度不变特征点提取[12],才算达到成熟。SIFT类型的方法在[12,14]的程序中表现相当出色。形状上下文[1]方法研究单元和块的形状,最初只使用边缘像素个数而不是方向直方图,就已经获得不错的结果。这些稀疏特征的成功,不禁使得作为稠密特征的HOG方法的效果和简易性黯然失色,我们希望我们的研究可以改变这一情况。特别地,我们的非正式实验表明,即使现在最好的基于特征点的方法,在人体检测方面比我们方法的错检率也要高上至少1-2个数量级,主要是因为这些基于特征点的检测器不能可靠地检测人体结构。

HOG和SIFT特征有个优点,它们提取的边缘和梯度特征能很好的抓住局部形状的特点,并且由于是在局部进行提取,所以对几何和光学变化都有很好的不变性:变换或旋转对于足够小的区域影响很小。对于人体检测,在粗糙的空域采样(coarse spatial sampling)、精细的方向采样(fine orientationsampling)和较强的局部光学归一化(stronglocal photometric normalization)这些条件下,只要行人大体上能够保持直立的姿势,就容许有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。

4 数据集和研究方法

数据集

我们在两个不同的数据集上进行了测试,第一个是MIT的行人数据库[18],包含城市场景中的509个训练图和200个测试图(加上这些图片的左右翻转图),此数据集只包含正面和背面两种视角,并且人体的动作有限。我们的检测器在此数据集上表现近乎完美,所以我们制作了一个新的更具挑战性的数据集,“INRIA”,包含从各种人体照片中剪切得到1805个64*128的行人图片。这些人体大多数是站立的,但朝向各异并且背景多变,有些背景中还有人群。

研究方法

我们选择了1239个行人图片以及他们的左右翻转图作为训练的正样本,所以总共2478个正样本。从1218个没有行人的图片中随机截取12180个检测窗口大小的子图作为初始的负样本。用正负样本训练一个初始的分类器,然后用初始分类器在负样本原图上进行行人检测,检测出来的矩形区域自然都是分类错误的负样本,这就是所谓的难例(hard examples)。然后,把误报的负样本(难例)集加入到初始的负样本集中,重新训练,生成最终的分类器,最终的SVM分类器文件大约1.7GB。这种二次训练的处理过程显著提高了每个检测器的表现(在我们的默认检测器中使每个窗口的误报率(FPPW False Positives Per Window)下降了5%)。

为了量化检测器的性能,我们提出了一个在双对数坐标上的评价曲线Detection ErrorTradeoff(DET),即纵坐标是漏检率(miss rate,可以是1-recall rate(查全率、命中率)或者),横坐标是每个窗口的误报率FPPW,两个值都是越低越好。这种评价方法对于微小的概率变化都能检测到,我们经常使用在10-4FPPW时的漏检率作为结果性能的参考点。DET曲线比较易变,稍微降低漏检率就等价于在漏检率不变时大幅增加误报率FPPW。例如,对于我们的默认检测器在FPPW为10-4时,降低漏检率1%相当于在漏检率不变时以1.57倍的因子减少?FPPW。

5 结果综述

我们在此节比较HOG检测器与已存在的一些方法的总体表现。我们的HOG检测器基于矩形块(R-HOG)或环形极坐标块(C-HOG)以及线性或核函数SVM,与Haar小波、PCA-SIFT或形状上下文方法进行对比,这些方法的简要介绍如下:

广义Haar小波

这种方法是定向类Haar小波(oriented Haar-like wavelets)的扩展,与论文[17]中使用的方法类似(更优于)。这种特征是从9*9和12*12定向一阶和二阶45度微分滤波器以及对应的二阶微分xy滤波器改进得来。

PCA-SIFT

此描述子基于用PCA算法将梯度图投影到从训练图片中获得的基底上[11]。Ke和Sukthankar表明此描述子在基于特征点的图像匹配上要优于SIFT,但此说法有争议[14]。我们对此算法的实现使用16*16的块,以及和我们的HOG描述子同样的设定,PCA投影基底从正样本图片计算得到。

形状上下文ShapeContexts

最初的形状上下文[1]使用二值边缘投票在极坐标中统计bin,与边缘方向无关。我们用1个方向bin的HOG描述子模拟了这一方法。使用内径2个像素,外径8个像素的16个角向和3个径向间隔获得最好结果。我们测试了基于梯度和边缘投票的方法,边缘阈值进行自动选择来最优化检测结果。

结果

图3是不同的检测器在MIT和INRIA测试集上的实验结果。


图3(a)


图3(b)

结果表明,HOG检测器要显著优于小波、PCA-SIFT、形状上下文方法,在MIT数据集上相比于其他方法有非常明显性能提升,在INRIA数据集上FPPW值有至少一个数量级的下降。我们的类Haar小波检测器比MIT的小波检测器效果好,因为我们使用了2阶微分并对输出向量进行了对比度归一化。图3(a)同样显示了MIT的最优方法及其集成的检测器的结果(从[17]的实验结果中插值计算得来),然而由于我们不知道[17]中的数据集如何划分为训练集和测试集,所以无法进行精确的对比。矩形块(R-HOG)和环形块(C-HOG)检测器表现相似,C-HOG有轻微的边缘信息。原始条形(定向2阶微分)扩展R-HOG检测器的特征维数增加了一倍,同时性能也有较大提升(在10-4FPPW时降低2%的漏检率)。如果将线性SVM替换为高斯核函数SVM,在10-4FPPW时有大约3%的性能提升,但以更高的运行时间为代价。以二值边缘投票(EC-HOG)代替梯度幅值权重投票(C-HOG)会在10-4FPPW时降低大约5%的性能,如果忽略方向信息性能下降会更多,即使增加更多的空间或径向bin也不管用。PCA-SIFT的表现很差劲,原因之一是,相比于[11],为了保留住同样的变化信息,需要更多的主向量,这可能是由于没有特征点检测器后空间配准能力变得更弱了。

6 算法实现和性能研究

在次节中我们会给出HOG算法的详细实现,并系统地分析不同的参数对性能的影响。检测器参数如下:无伽马校正的RGB颜色空间;梯度算子为[-1,0,1]并且无平滑;梯度方向离散化(投票)到0-180间的9个bin中;块(block)大小为16*16,细胞单元(cell)大小为8*8;高斯滤波参数σ为8;L2-Hys块归一化;块移动步长为8个像素;检测窗口为64*128;线性SVM分类器。

图4总结了不同的HOG参数对总体检测效果的影响,这些接下来我们会详细讨论,得出的结论是:要想检测器性能好,需要精细尺度的微分(不需要平滑),梯度方向直方图的bin尽量多,尺寸适度的、归一化的、重叠的描述子块。

6.1 伽马/颜色规范化

我们用不同的幂值(gamma参数)评价了几种颜色空间,有灰度空间、RGB、LAB,结果表明,这些规范化对结果影响很小,可能是由于随后的描述子归一化能达到相似的效果。如果颜色信息可用,我们的特征提取会使用颜色信息,RGB和LAB颜色空间的结果相似,但如果使用灰度空间,在10-4FPPW时有1.5%的性能下降。对每个颜色通道进行平方根gamma压缩(即gamma参数为1/2),会在10-4FPPW时有1%的性能提升;如果将gamma参数改为对数,则会造成2%的性能下降。

6.2 梯度计算

不同的梯度计算方法对检测器性能有很大影响,但事实证明最简单的梯度算子结果是最好的。我们先进行高斯平滑,然后应用几种离散的微分模版来计算梯度。我们测试了不同平滑尺度(包括σ=0即不平滑)的高斯平滑,也测试了不同的梯度模版,包括一维模版([-1,1]、[-1,0,1]、[1,-8,0,8,-1]),3*3的Sobel模版,以及2*2的对角线模版(最紧凑的中心二维微分模版)。简单的[-1,0,1]模版在σ=0时表现最好。使用更大的模版往往会降低性能,而且增加高斯平滑也会降低性能:当平滑尺度σ从0变为2时,10-4FPPW下的查全率(recallrate)从89%下降到80%,如图4(a)。在σ=0时,5个因子的一维模版[1,-8,0,8,-1]比[-1,0,1]模版在10-4FPPW下有1%的性能下降,2*2的对角线模版有1.5%的性能下降,无中心的[-1,1]模版也会导致1.5%的性能下降,推测是由于x和y方向上差分中心的不一致导致方向估计不准确。

对于带颜色的图像,分别计算每个颜色通道的梯度,以范数最大者作为该点的梯度向量。


图4(a)

6.3 空间/方向bin统计

计算细胞单元(cell)内每个像素的梯度,为某个基于方向的bin投票(vote),从而形成方向梯度直方图。细胞单元可以是矩形的或者环形(极坐标中的扇形)的。直方图的方向bin在0度-180度(无符号梯度)或者0度-360度(有符号梯度)之间均分。为了减少混叠现象,梯度投票在相邻bin的中心之间需要进行方向和位置上的双线性插值。投票的权重根据梯度幅值进行计算,可以取幅值本身、幅值的平方或者幅值的平方根。实践表明,使用梯度本身作为投票权重效果最好。

精细的方向编码对取得好的结果至关重要,然而空间采样可以做的相当粗糙。如图4(b)所示,增加方向bin的个数可以显著提高检测器的性能,直到大约9个bin为止,这里所用的是无符号梯度的0度-180度均分方向直方图。如果包括梯度符号信息(方向范围为0度-360度,类似SIFT描述子中使用的方向直方图)会导致性能下降,即使bin的个数加倍来保存原始方向信息也不行。对于人体检测来说,衣服和背景颜色的多变可能使得梯度符号信息无意义,但对于其他目标检测,例如汽车、摩托车,梯度符号信息是有用的。


图4(b)

6.4 归一化和描述子块

由于局部光照的变化,以及前景背景对比度的变化,使得梯度强度的变化范围非常大,这就需要对梯度做局部对比度归一化。我们测试了多种不同的归一化策略,大多数都是将细胞单元组成更大的空间块(block),然后针对每个块进行对比度归一化。最终的描述子是检测窗口内所有块内的细胞单元的直方图构成的向量。事实上,块之间是有重叠的,也就是说,每个细胞单元的直方图都会被多次用于最终的描述子的计算。此方法看起来有冗余,但可以显著的提升性能。图4(d)显示了将重叠区域从0增加到重叠3/4块时,10-4FPPW下有4%的性能提升。


图4(d)

我们测试了两种几何形状的块,一种是矩形的块,称为R-HOG;一种是极坐标中的环形块,称为C-HOG。

R-HOG

R-HOG块与SIFT[12]描述子中使用的块很相似,但用法不同。R-HOG块描述子在单一尺度的稠密网格空间中进行计算,无主方向,并且作为更大的检测窗口描述子的一部分被使用,检测窗口描述子中明确含有块之间的相对位置信息。而SIFT特征点描述子在多尺度空间下计算,具有尺度不变性,并需要旋转到其主方向上,而且SIFT描述子是独立使用的。SIFT描述子适合稀疏、宽基线的匹配,R-HOG描述子适合表示稠密空间的编码。其他的先例包括Freeman和Roth[4]的边缘方向直方图。R-HOG块可以用三个参数表示:ζ,η,β,块大小为ζ*ζ,细胞单元大小为η*η,每个细胞单元有β个方向bin。

图5显示了在10-4FPPW时漏检率随不同的细胞单元和块尺寸的变化情况。对于人体检测,每个块内含3*3个细胞单元,每个细胞单元含6*6个像素时最优,此时漏检率大约为10.4%。事实上,无论块尺寸为多大,细胞单元为6-8个像素宽时性能最优——巧合的是,我们的测试图片中人体大约也是6-8个像素宽。每个块内含2*2或3*3个细胞单元时最优。除此之外,结果不好:当块过大时,对局部图像的适应性变差;当块过小时,有价值的空间信息减少。

图5,10-4FPPW时漏检率随细胞单元和块尺寸的变化情况。块步长(块重叠区域)固定在块尺寸的一半(即重叠区域为1/2),细胞单元为6*6个像素,每个块内含3*3个细胞单元时性能最优,漏检率大约为10.4%

就像SIFT论文[12]中描述的,在统计直方图bin之前用高斯加权使得块边缘的像素的权重降低是有很用的。经试验,在10-4FPPW时使用σ =  0.5 *block_width的二维高斯核进行加权可使性能提升1%左右。

我们还测试了在描述子中使用不同的细胞单元尺寸和不同的块尺寸,性能有稍微的提高(在10-4FPPW时提高3%),但同时会大幅增加描述子尺寸。

此外,我们还测试了垂直块(含2*1个细胞单元)、水平块(含1*2个细胞单元)以及既有垂直块又有水平块的描述子。垂直块和垂直+水平块明显比只有水平块要好,但还是不如2*2的方形块好。

C-HOG

我们的环形块描述子与形状上下文[1]类似,只不过,每个细胞单元包含一个以梯度为权重的方向栈,而不是单纯的方向无关的边缘计数。极坐标网格的想法源于允许精细的相邻结构编码与粗糙的广域上下文编码相结合的思想,以及信号由视觉向人类大脑皮层的转换是对数级的这一事实[21]。实时证明,含有很少的半径bin的描述子结果最好,所以实际中几乎不会有不均匀的情况出现。可以将C-HOG简单看做中心环绕编码的一种高级形式。

C-HOG的块有两种形式,一种是中间有一个完整细胞单元的形式(类似[14]中的GLOH特征),另一种是中心单元被分为四个90度扇形的形式,类似形状上下文方法,如下图所示。

我们只提供中心有完整细胞单元的C-HOG的结果,相比于中心被分割的C-HOG,这种方法有更少的空间划分,但实际效果却是相同的。C-HOG可以用四个参数表示:角度bin的个数,半径bin的个数,中心圆的半径(以像素为单位),子半径的伸展因子。要想保证好的性能,至少需要两个半径bin(一个中心半径、一个周围的半径),四个角度bin。增加额外的半径bin并不能改善多少性能,如果增加角度bin的个数反而会降低性能(从4个增加到12个会在10-4FPPW时降低1.3%的性能)。中心圆的半径为4个像素时最好,但3或5像素结果相似。将伸展因子从2增加到3性能不会变化。为细胞单元的投票加上高斯权重或逆高斯权重不会改变性能。形状上下文方向(只含一个方向bin)需要更精细的空间子划分才能表现良好。

块归一化策略

我们对上面介绍的每种几何形状的块都测试了四种归一化方法。

假设v是未经归一化的描述子向量。

‖v‖k是v的k范数,k=1,2,是一个很小的常数

(L2 norm就是平方和开方,即欧氏距离;L1 norm就是绝对值相加,又称曼哈顿距离)

(a)L2-norm(L2范数):

(b)L2-Hys:先计算L2范数,然后进行限幅(限制v的最大值为0.2)和再归一化,[12]中有描述。

(c)L1-norm(L1范数):

(d)L1-sqrt:L1范数取平方根,即,实际上是将描述子向量看作是概率分布,然后计算它们之间的Bhattacharya(巴氏)距离。

图4(c)所示,L2-Hys、L2-norm、L1-sqrt的表现差不多一样好,简单的L1-norm会使性能下降5%,如果完全不进行归一化会导致性能下降27%(都是指10-4FPPW时)。我们还调整参数的值进行测试,但结果表明检测器性能对于值的变化并不敏感。


图4(c)

中心环绕归一化

我们研究了中心环绕式的细胞单元归一化方法,利用每个细胞单元和环绕其周围的细胞单元(利用二维高斯权重进行加权)的能量对该细胞单元进行归一化,然而结果如图4(c)中的”Window norm”曲线所示,这种方法相比于基于块的归一化方法会使性能下降(在10-4FPPW时降低2%)。其中一个原因是由于没有重叠的块,每个细胞单元仅在最终的描述子中被使用一次。改变高斯加权的参数也并不会引起结果的变化。

为了阐明这点,考虑有重叠块的R-HOG检测器。训练好的线性SVM分类器的参数会衡量每个块中的每个细胞单元在最终的判定决策中起多少作用。图6(b,f)表明最重要的细胞单元是包含主要的人体轮廓(特别是头部、肩部和足部)的那些,用这些细胞单元相对于轮廓外的块进行归一化。也就是说,不管训练图片中的背景如何复杂,检测器检测的主要是人体轮廓相对于背景的差异,而不是内部的边缘或轮廓相对于前景的差异。衣服上的图案和身体姿势的变化使得人体轮廓内部的区域不适合作为可靠的检测特征,而且前景到轮廓的过度可能由于平滑阴影而混淆。图6(c,g)表明人体轮廓内部的梯度(尤其是垂直梯度)一般都是有害的特征,可能是因为这些特征会引起误报,在这些误报中长的垂直条纹会被当做头部或腿。

图6,HOG描述子最有用的信息来自于人体轮廓周围(尤其是头部、肩部、足部),最有效的块是以人体轮廓外沿的背景为中心的那些块。(a)训练样本的平均梯度图,(b)每个像素表示块中以此像素为中心的最大正SVM权重,(c)与(b)类似,负SVM权重,(d)一张测试图,(e)计算得到的R-HOG描述子,(f)正SVM权重支持的R-HOG描述子,(g)负SVM权重支持的R-HOG描述子

6.5 检测窗口和上下文

我们用的64*128大小的检测窗口在人体周围会产生大约16个像素的空白边缘图4(e)表明此空白边缘增加了有助于检测的上下文信息。将空白边缘从16像素减少到8像素(48*112大小的检测窗口)会在10-4FPPW时导致6%的性能下降。保持窗口大小为64*128不变,增加人体的尺寸(同样会使空白边缘减少),虽然使得人体的解析度变高,但也会导致性能下降。


图4(e)

6.6 分类器

我们默认使用带有松弛变量(C=0.01)的线性SVM分类器SVMLight[10](在原版SVM上稍作改动使得处理大规模特征向量时可减少内存占用)。如果使用高斯核函数SVM可以在10-4FPPW时提高大约3%的性能,但需要以更多的运行时间为代价。

6.7 讨论

总体来说,此篇论文中有几个重要发现。HOG特征表现远好于小波,计算梯度前任何大尺度的平滑都会导致性能下降,大多数可用的图像信息都来自精细尺度中的陡峭边缘,为了减少对空间位置的敏感度而模糊陡峭边缘的做法都是错误的。相反,梯度应该在最精细尺度的金字塔层中计算,然后进行校正或用于方向bin的投票,只有在投票时才需要进行模糊。据此,相对粗糙的空间采样(8*8的细胞单元)也足够用,但方向采样需要相当精细,小波和形状上下文正是输在这点上。

另外,较强的局部对比度归一化对于取得好的结果至关重要,传统的中心环绕式归一化方法并不太好。要想取得更好的结果,可在不同的局部区域对每个元素(边、细胞单元)归一化多次。在我们的标准HOG检测器中,每个细胞单元在不同的归一化中出现4次,这种“冗余”的方法可在10-4FPPW时将性能由84%提高到89%。

7 总结和结论

在稠密重叠网格中使用类似SIFT描述子[12]的局部归一化的梯度方向直方图特征对于行人检测效果非常好,相比基于Haar小波特征的最好的检测器(来自[17])可以将误报率降低一个多数量级。我们研究了各种描述子参数对结果的影响,得出结论:小尺度梯度(fine-scale gradients),精细的方向采样(fine orientation binning),相对粗糙的空间采样(relatively coarse spatialbinning),和重叠描述子块中高质量的局部对比度归一化(high-quality localcontrast normalization in overlapping descriptor blocks)都对好的检测效果至关重要。我们还引入了一个新的更具挑战性的行人检测数据集,已公开下载。

今后的工作

虽然我们当前使用的线性SVM分类器已相当高效——处理一个320*240的尺度空间图像(4000个检测窗口)的时间少于1秒钟,但仍然有优化的空间。为了更深层次的加快检测速度,需要一个由粗到细的或者拒绝链式的基于HOG的检测器。我们也在研究基于HOG的,并同时包含基于块匹配或光流的运动信息的检测器。最后,虽然当前的固定模版检测器在全身可见的行人检测方面有不可比拟的优势,但由于人体是高度关节型的,所以我们相信具有更好的局部空间不变性的基于身体部分的模型可以在更一般的场景中改善行人检测效果。

致谢

此研究得到了欧洲联合研究项目组ACEMEDIA和PASCAL的支持。感谢Cordelia Schmid的大量有用建议。SVM-Light[10]保证了大规模样本训练的可靠性。

二、相关理解

1、HOG特征:

方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

(1)主要思想:

在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。

(2)具体的实现方法是:

首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。

(3)提高性能:

把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对比度归一化(contrast-normalized),所采用的方法是:先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。

(4)优点:

与其他的特征描述方法相比,HOG有很多优点。首先,由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。

2、HOG特征提取算法的实现过程:

大概过程:

HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):

1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);

2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;

3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。

4)将图像划分成小cells(例如6*6像素/cell);

5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;

6)将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。

7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。

 

具体每一步的详细过程如下:

(1)标准化gamma空间和颜色空间

为了减少光照因素的影响,首先需要将整个图像进行规范化(归一化)。在图像的纹理强度中,局部的表层曝光贡献的比重较大,所以,这种压缩处理能够有效地降低图像局部的阴影和光照变化。因为颜色信息作用不大,通常先转化为灰度图;

Gamma压缩公式:

比如可以取Gamma=1/2;

(2)计算图像梯度

计算图像横坐标和纵坐标方向的梯度,并据此计算每个像素位置的梯度方向值;求导操作不仅能够捕获轮廓,人影和一些纹理信息,还能进一步弱化光照的影响。

图像中像素点(x,y)的梯度为:

最常用的方法是:首先用[-1,0,1]梯度算子对原图像做卷积运算,得到x方向(水平方向,以向右为正方向)的梯度分量gradscalx,然后用[1,0,-1]T梯度算子对原图像做卷积运算,得到y方向(竖直方向,以向上为正方向)的梯度分量gradscaly。然后再用以上公式计算该像素点的梯度大小和方向。

(3)为每个细胞单元构建梯度方向直方图

第三步的目的是为局部图像区域提供一个编码,同时能够保持对图像中人体对象的姿势和外观的弱敏感性。

我们将图像分成若干个“单元格cell”,例如每个cell为6*6个像素。假设我们采用9个bin的直方图来统计这6*6个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,如图所示:例如:如果这个像素的梯度方向是20-40度,直方图第2个bin的计数就加一,这样,对cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量(因为有9个bin)。

像素梯度方向用到了,那么梯度大小呢?梯度大小就是作为投影的权值的。例如说:这个像素的梯度方向是20-40度,然后它的梯度大小是2(假设啊),那么直方图第2个bin的计数就不是加一了,而是加二(假设啊)。

细胞单元可以是矩形的(rectangular),也可以是星形的(radial)。

(4)把细胞单元组合成大的块(block),块内归一化梯度直方图

由于局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大。这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。

作者采取的办法是:把各个细胞单元组合成大的、空间上连通的区间(blocks)。这样,一个block内所有cell的特征向量串联起来便得到该block的HOG特征。这些区间是互有重叠的,这就意味着:每一个单元格的特征会以不同的结果多次出现在最后的特征向量中。我们将归一化之后的块描述符(向量)就称之为HOG描述符。

区间有两个主要的几何形状——矩形区间(R-HOG)和环形区间(C-HOG)。R-HOG区间大体上是一些方形的格子,它可以有三个参数来表征:每个区间中细胞单元的数目、每个细胞单元中像素点的数目、每个细胞的直方图通道数目。

例如:行人检测的最佳参数设置是:3×3细胞/区间、6×6像素/细胞、9个直方图通道。则一块的特征数为:3*3*9;

(5)收集HOG特征

最后一步就是将检测窗口中所有重叠的块进行HOG特征的收集,并将它们结合成最终的特征向量供分类使用。

(6)那么一个图像的HOG特征维数是多少呢?

顺便做个总结:Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元构成一个块(block),把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元。最后将所有块的特征串联起来,就得到了人体的特征。例如,对于64*128的图像而言,每8*8的像素组成一个cell,每2*2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64*128的图片,总共有36*7*15=3780个特征。

HOG维数,16×16像素组成的block,8x8像素的cell

注释:

行人检测HOG+SVM

总体思路:
1、提取正负样本hog特征
2、投入svm分类器训练,得到model
3、由model生成检测子
4、利用检测子检测负样本,得到hardexample
5、提取hardexample的hog特征并结合第一步中的特征一起投入训练,得到最终检测子。

深入研究hog算法原理:
一、hog概述

Histograms of Oriented Gradients,顾名思义,方向梯度直方图,是目标的一种描述的方式,既是描述子。

二、hog提出
hog是05年一位nb的博士提出来的,论文链接 http://wenku.baidu.com/view/676f2351f01dc281e53af0b2.html

三、算法理解
        终于到10月了,终于可以松一口气了,整理一下hog的算法流程。

首先要有一个整体的认识,每一个目标都对应一个一维特征向量,这个向量一共有n维,这个n不是凭空瞎猜的,是有理有据,打个比方,为什么opencv自带的hog检测子是3781维的?这个问题在初期确实比较头疼,纠结了好长的时间,不过别着急,

我们先来看一下opencv里的HOGDescriptor这个结构的构造函数HOGDescriptor(Size winSize,Size blocksize,Size blockStride,Size cellSize,...(后面的参数在这里用不到)),去查一下opencv默认的参数我们可以看到,winSize(64,128),blockSize(16,16),blockStride(8,8),cellSize(8,8),很显然hog是将一个特征窗口win划分为很多的块block,在每一个块里又划分为很多的细胞单元cell(即胞元),hog特征向量既是把这些所有的cell对应的小特征串起来得到一个高维的特征向量,那么这个窗口对应的一维特征向量维数n就等于窗口中的块数 x 块中的胞元数  x 每一个胞元对应的特征向量数。

写到这里,我们计算一下3781如何得到的,窗口大小64x128,块大小16x16,块步长8x8,那么窗口中块的数目是((64-16)/8+1)*((128-16)/8+1) = 7*15 =105个块,块大小为16x16,胞元大小为8x8,那么一个块中的胞元cell数目是 (16/8)*(16/8) =4个胞元,到这里我们可以看到要求最后需要的维数n,只需要计算每一个胞元对应的向量,这个参数在哪呢?别急,我们把每一个胞元投影到9个bin(如何投影?这里卡了很长一段时间,后面会说),那么每一个胞元对应的向量就是9维,每个bin对应该9维向量的一个数,现在看一下是不是计算窗口维数的三个需求量都知道了,n = 窗口中的块数 x 块中的胞元数  x 每一个胞元对应的特征向量数,带入看一下n= 105x4x9 = 3780,这就是这个窗口对应的特征了。有人会说,为什么opencv里的getDefaultPeopleDetector()得到的是3781维呢?这是因为另外一维是一维偏移,(很崩溃是吧,我也崩溃很久。。。,下一段解释)。

我们利用hog+svm检测行人,最终的检测方法是最基本的线性判别函数,wx + b = 0,刚才所求的3780维向量其实就是w,而加了一维的b就形成了opencv默认的3781维检测算子,而检测分为train和test两部分,在train期间我们需要提取一些列训练样本的hog特征使用svm训练最终的目的是为了得到我们检测的w以及b,在test期间提取待检测目标的hog特征x,带入方程是不是就能进行判别了呢?

相关博客:

http://blog.csdn.net/leonwei/article/details/5735015

http://blog.csdn.net/lxlclzy1130/article/details/50816967

http://blog.csdn.net/abcjennifer/article/details/7365651

http://blog.sina.com.cn/s/blog_60e6e3d50101bkpn.html

http://blog.csdn.net/liulina603/article/details/8291093

时间: 2024-10-26 08:41:30

第九弹:HOG的相关文章

Python3 学习第九弹: 模块学习二之文件管理模块

os模块 提供访问操作系统的接口 1> name 获得当前操作系统 其中 'nt' 是 windows 'posix' 是 linux 2> environ 获得当前系统的环境变量的字典,(变量名:变量值) 3> getcwd() 获得当前工作目录 4> getgid() 返回当前进程的真实组id 5> getlogin() 返回当前登录的用户名 6> getpid() 返回当前进程的pid 7> system(command) 运行shell命令 在linux下

重操JS旧业第九弹:函数表达式

函数表达式,什么概念,表达式中的函数表达式. 1 函数申明 function 函数名([函数参数]){ //函数体 } js中无论像这样的显示函数什么放在调用之前还是调用之后,都不影响使用,因为js解释引擎会将函数声明提前化,这点很好理解: 2 函数表达式 var functionV=function 函数名([函数参数]){ //函数体 }: 这种方式的一个变量指向了一个函数,仅此而已.js引擎只会把他当作一个函数类型的变量来处理,仅此而已. 3 递归调用 我们知道函数名仅仅是指向函数的指针,

Spring第九弹—使用CGLIIB实现AOP功能与AOP概念解释

JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理,原理之前我已经讲过.JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包. PS:需要引入com.springsource.net.sf.cglib-2.2.0.jar包. CGLIB是一个强大的高性能的代码生成包.它广泛的被许多AOP的框架使用,例如:Spring AOP和dynaop,为他们提供方法的int

C#学习第九弹之委托

先上委托的例子: 1 using System; 2 3 delegate int myDelegateHandler(int a, int b); 4 5 public class A 6 { 7 //静态方法 8 public static int M1(int a, int b) 9 { 10 return a + b; 11 } 12 } 13 14 public class Test 15 { 16 public static void Main() 17 { 18 //实例一个委托

【springmvc学习第九弹】对Ajax的支持

最直接的Ajax处理 只要在Controller的方法里面,直接使用response输出你要返回的的Ajax数据,然后return null就可以了,示例如下: Controller示例 1 @RequestMapping(value = "/hello") 2 public ModelAndView handleRequest(UserModel um,HttpServletResponse response) throws IOException { 3 response.setC

高并发第九弹:逃不掉的Map --> HashMap,TreeMap,ConcurrentHashMap

平时大家都会经常使用到 Map,面试的时候又经常会遇到问Map的,其中主要就是 ConcurrentHashMap,在说ConcurrentHashMap.我们还是先看一下, 其他两个基础的 Map 类: HashMap  和 TreeMap HashMap: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable,Serializable { // 这里有个很逗

『MXNet』专题汇总

MXNet文档 MXNet官方教程 框架介绍 『MXNet』第一弹_基础架构及API 『MXNet』第二弹_Gluon构建模型 『MXNet』第三弹_Gluon模型参数 『MXNet』第四弹_Gluon自定义层 『MXNet』第五弹_MXNet.image图像处理 『MXNet』第六弹_Gluon性能提升 『MXNet』第七弹_多GPU并行程序设计 『MXNet』第八弹_数据处理API_上 『MXNet』第九弹_分类器以及迁移学习DEMO 『MXNet』第十弹_物体检测SSD 『MXNet』第八

运维学习第四弹

运维学习第四弹之shell(bash): 一. hell可以翻译成壳,大多指能够对内部核心起到保护作用的一种装置或结构.在计算机科学中shell的实际意义为操作者提供的.能够通过系统调用或库调用使用整个计算机资源的访问接口. 它既是一种命令解析器又是一种程序设计语言.作为命令解析器,它可以解释和执行用户输入的命令,也可以自动地解释和执行预先编写好并保存在某个文本文件中的一系列的命令:作为程序设计语言,shell特别定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和条件分支

第九篇 Replication:复制监视器

本篇文章是SQL Server Replication系列的第九篇,详细内容请参考原文. 复制监视器允许你查看复制配置组件的健康状况.这一篇假设你遵循前八篇,并且你已经有一个合并发布和事务发布.启动复制监控器复制监视器不是SSMS的一部分,它是一个独立的可执行文件(SqlMonitor.exe).在一个标准的SQL Server安装中开始菜单下找不到复制监视器.启动复制监视器的最简单方法是:SSMS对象资源管理器下连接到发布服务器,右击你的发布选择"启动复制监视器",如图9.1所示:图