天天看点

行人检测之初相见

现状,大致分为两类:

(1)基于背景建模的方法

分割出前景,提取其中的运动目标。进一步提取特征,分类判别。

缺点:

1)在存在下雨、下雪、刮风、树叶晃动、灯光忽明忽暗等场合,该方法的鲁棒性不高,抗干扰能力较差。

2)且背景建模方法的模型过于复杂,对参数较为敏感。

(2)基于统计学习的方法

根据大量训练样本构建行人检测分类器。

1)提取的特征一般有目标的灰度、边缘、纹理、形状、梯度直方图等信息,

2)分类器包括神经网络、SVM,adaboost等

该方法存在难点:

(a)行人的姿态、服饰各不相同;

(b)提取的特征在特征空间中的分布不够紧凑;

(c)分类器的性能受训练样本的影响较大;

(d)离线训练时的负样本无法涵盖所有真实应用场景的情况;

HOG算子

梯度直方图特征(HOG)

Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。

HOG特征是一种局部区域描述符,它通过计算局部区域上的梯度方向直方图来构成人体特征,

能够很好地描述人体的边缘。它对光照变化和小量的偏移不敏感。

行人检测HOG+SVM,总体思路:

1)提取正负样本hog特征

2)投入svm分类器训练,得到model

3)由model生成检测子

4)利用检测子检测负样本,得到hardexample

5)提取hardexample的hog特征并结合第一步中的特征一起投入训练,得到最终检测子。

为什么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对应的小特征串起来得到一个高维的特征向量

窗口中块的数目是((64-16)/8+1)((128-16)/8+1) = 715 =105个块,

块大小为16x16,胞元大小为8x8,

那么一个块中的胞元cell数目是 (16/8)*(16/8) =4个胞元

每一个胞元对应的向量就是9维,每个bin对应该9维向量的一个数

n= 105x4x9 = 3780

我们利用hog+svm检测行人,最终的检测方法是最基本的线性判别函数,wx + b = 0,刚才所求的3780维向量其实就是w,而加了一维的b就形成了opencv默认的3781维检测算子,

而检测分为train和test两部分,

在train期间我们需要提取一些列训练样本的hog特征使用svm训练最终的目的是为了得到我们检测的w以及b,在test期间提取待检测目标的hog特征x

HOG特征只关注物体的边缘和形状信息,对目标的表观信息并没有有效记录,所以很难处理遮挡问题,而且由于梯度的性质,该特征对噪点敏感。

行人检测中的一大难题是遮挡问题,为了解决这一问题,出现了采用部件检测的方法,把人体分为头肩,躯干,四肢等部分,对这些部分分别进行检测,然后将结果组合起来,使用的典型特征依然是HOG,采用的分类器有SVM和AdaBoost