行人识别

来源:互联网 发布:马尔科夫矩阵 编辑:程序博客网 时间:2024/06/09 16:54

行人识别这一块主要的研究是基于HoG特征+SVM分类器判断图像中是否存在行人。

我们先给出行人识别的过程:
1. 数据训练(OpenCV 中有自带的已经训练好了的,设置参数为Default就是使用的默认的)。当然你可以自己根据手里的数据进行训练,如果你的数据有代表性,这样其实往往可能的效果比默认的会好,因为你的训练数据是自己的项目实际需求得到的。你的测试数据也是该环境下的。出现误差的概率会下降。
2. 正负样本训练好之后,我们对新出现的可能含有行人的图像进行多尺度迭代扫描(多尺度检测)。
下面是使用了默认SVM的。

   // 1. 定义HOG对象      cv::HOGDescriptor hog; // 采用默认参数      // 2. 设置SVM分类器      hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());   // 采用已经训练好的行人检测分类器      // 3. 在测试图像上检测行人区域      std::vector<cv::Rect> regions;      hog.detectMultiScale(image, regions, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 1);      // 显示      for (size_t i = 0; i < regions.size(); i++)      {          cv::rectangle(image, regions[i], cv::Scalar(0,0,255), 2);      }  

如果你需要自己训练,你要调用
hog.setSVMDetector()这里面的参数就是你训练产生的结果值。参数就是一个Mat类型(具体说是InputArray),我们知道Mat类型是可以被保存及读取的。所以训练可以被保存。
检测函数原型如下:

HOGDescriptor::detectMultiScale(const GpuMat& img, vector<Rect>& found_locations, doublehit_threshold=0, Size win_stride=Size(), Size padding=Size(), double scale0=1.05, int group_threshold=2)

该函数表示对输入的图片img进行多尺度行人检测 img为输入待检测的图片;found_locations为检测到目标区域列表;参数3为程序内部计算为行人目标的阈值,也就是检测到的特征到SVM分类超平面的距离;参数4为滑动窗口每次移动的距离。它必须是块移动的整数倍;参数5为图像扩充的大小;参数6为比例系数,即滑动窗口每次增加的比例;参数7为组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用,为0时表示不起调节作用。

下面我们看下HoG特征具体是怎么产生及如何被训练的。

梯度直方图特征(HoG)是一种对图像局部重叠区域的密集型描述符,它通过计算局部区域的梯度方向直方图来构成特征。HoG+SVM进行行人检测的方法是在2005年的CVPR被提出,现在OpenCV中已经集成了。

HoG特征是一种局部区域描述符,它通过计算局部区域上的梯度方向直方图来构成人体特征,能够很好地描述人体的边缘。它对光照变化和少量的偏移不敏感。

这里写图片描述

Dalal提出的HoG特征提取的过程如下:
1. 对灰度化图像采用Gamma校正法对输入图像进行颜色空间的标准化(归一化)。目的是调节图像的对比度,降低突显局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰。
2. 计算机图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰
3. 将图像划分为小的cells(例如每个cell是6*6的区域)
4. 统计每个cell的梯度直方图,即可形成每个cell的特征
5. 将每几个cell组成一个block(如一个block包含了3*3cell),一个block内所有特征串联起来就是该block的HoG特征。
6. 将图像image内所有block的HoG特征串联起来就是该image的HoG特征。这个就是最终的可供于分类和预测的特征向量。

我们看下对每个cell单元简历梯度方向直方图:

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

像素梯度方向用到了,那么梯度大小呢?梯度大小就是作为投影的权值的。由于局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大,这就需要对梯度强度做归一化,归一化能够进一步对光照阴影和边缘进行压缩。通常,每个单元格由多个不同的块共享,但它的归一化是基于不同块的,所以计算结果也不一样。因此,一个单元格的特征会以不同的结果多次出现在最后的向量中。我们将归一化之后的块描述符就称之为HOG描述符。
一个图像的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个特征。(这个画一个图就很好理解了)。
对于每个单元的维数及值还是要强调理解下:
比如8*8pix的cell中的某一个点的梯度方向是9个方向bins的一个,那么这个值是多少呢?不是1,而是这个梯度的大小,也就是图片中的G(x,y)。

0 0
原创粉丝点击