基于方向梯度直方图的行人检测

来源:互联网 发布:从零开始学linux编程 编辑:程序博客网 时间:2024/05/29 04:46

Dalal等提出的方向梯度直方图(HOG)是目前广泛使用的行人特征描述子。HOG刻画图像的局部梯度幅值和方向特征,基于梯度特征、对块的特征向量进行归一化处理、允许块之间相互重叠,使得对光照变化和小量的偏移有很好的鲁棒性,能有效地刻画出人体的边缘特征。

HOG的特征提取过程如下:

这个过程的基本思想是局部对象外貌和形状可以通过局部亮度梯度或边缘方向的分布来描述,甚至无需精确的知道相应的梯度和边缘位置。实际上它是这样实现的:将图像窗口分为一些小的空间区域(单元格),对每一个单元格,可以计算出关于它的像素的梯度方向或边缘方向的一维直方图,这些直方图的联合就构成了上面的描述。为了更好的实现对光照和阴影的鲁棒性,在使用它们前进行对比归一化。计算稍微大一点的空间区域(块)的局部直方图'energy',并用此结果来归一化块中的每一个单元格,此时归一化后的块即为HOG 描述子。然后便将所有块的HOG描述子构成特征向量,训练SVM 线性分类器。用一个检测窗口来扫描整幅图像,根据分类器来判断该窗口中是否为行人。

该方法分别在MIT行人数据库和'INRIA'数据库上进行了测试。MIT行人数据库为城市场景中的行人图像,包括509幅训练图像和200幅测试图像。它们基本上都是正面或背面图像,姿态范围有限,因此测试结果很完美。'INRIA' 数据库包括1805 幅64*128 的行人图像。它们通常都是站立的,但出现在各种不同方向,并且有许多不同的背景包括拥挤的背景。

MIT行人数据库下载地址:http://cbcl.mit.edu/software-datasets/PedestrianData.html

'INRIA'数据库下载地址:http://pascal.inrialpes.fr/data/human/

Opencv 2.4实现的HOG行人检测代码如下:

int main(int argc, char** argv)
{
    Mat img;
    img = imread("E:/Mypic/2.png");
    HOGDescriptor hog;
    hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    namedWindow("people detector", 1);
        vector<Rect> found, found_filtered;
        // 检测窗口使用缺省值。
        hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);
        size_t i, j;
for( i = 0; i < found.size(); i++ )
        {
Rect r = found[i];
            //  HOG 检测返回的矩形框比实际人体要稍微大些,所以我们调整其大小使输出更美观
            r.x += cvRound(r.width*0.1);
            r.width = cvRound(r.width*0.8);
            r.y += cvRound(r.height*0.07);
            r.height = cvRound(r.height*0.8);
            rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 3);
        }
        imshow("people detector", img);
        waitKey(0);
    return 0;
}

测试图像来自'INRIA'数据库。运行结果:


从上图中可以看出在拥挤场景存在漏检,而对类似行人的柱状物可能出现错检,如上图的伞。

0 0