之前的文章行人计数、计次提到HOG特征这个概念,这两天看了一下原版的论文,了解了一下HOG特征的原理,并依据自己的理解将这种方法的流程写了下来,假设有不正确的地方欢迎指正。

HOG(Histograms of Oriented Gradients)特征的基本思想:The basic idea is that local object appearance and shape can often be characterized rather well by the distribution of local intensity gradients or edge
directions, even without precise knowledge of the corresponding gradient or edge positions.即使不知道(图像间)准确的对齐的梯度或边缘位置,局部目标的外观和形状信息也能通过局部梯度密度或边缘方向来表征。以下是HOG特征的提取过程。參考文献[1]里将HOG特征用作行人检測,事实上假设将以下的步骤读完,你会发现HOG不止能够用来检測行人,也能够检測狗、猫等等差点儿不论什么物体,所做的工作仅仅是训练样本的不同,所以HOG特征能够称为object检測方法。

1、色彩归一化(Gamma/Color Normalization)

作者測试了RGB、LAB还有灰度空间内的图像,发现RGB和LAB空间内的測试图像取得的结果基本同样,而灰度空间内的图像识别率又1.5%下降。所以这几种色彩空间的效果大体同样,不是必需将RGB转化到LAB或反之。所以这一步的归一化基本能够省略,可是測试图像和训练的图像总得是一个颜色空间的,这点没问题吧。

2、计算梯度值(Gradient Computation)

离散集上计算梯度值的方式有非常多种,比方以待測像素为中心,用中心的右邻值减去左邻值或者下邻值减去上邻值,用论文里的说法就是用mask[-1,0,1]对横向或纵向的像素做卷积,分别能够得到中心像素的梯度x分量和y分量。有了这两个分量,梯度值和方向不难确定了吧。当然论文里还提到了其它方法,比方cubic-corrected[1,-8,0,8,-1],uncentred[-1,1]等。作者发现-1,0,1]的效果最好。

对于彩色图像,作者分别计算每一个颜色通道的梯度值,选取三个通道里最大值作为该点的像素值,而不是简单粗暴的将彩色图像转化为灰度图像再求梯度值。

3、构建直方图(或称空间分级,Spatial/Orientation Binning)

计算得到了每一个点的梯度值和方向,接下来就是怎样利用梯度了。作者考虑梯度是向量,所以梯度会有0-360度的方向取值(signed gradient),或者是0-180度的取值(unsigned gradient)。以20度作为一个bin(就是直方图里的一个竖条),能够构成含有9个bin的直方图。等等,假设你想把把图像的全部梯度都放到一个直方图里,那你就大错特错了。作者将图像划分成了一个个小的cell,每一个cell里包括4x4,6x6...个像素,以每一个cell做为一个单元,这样每一个cell就能得到一个统计直方图了。这样就相当于保留了图像局部的特征。经过试验发现,6x6大小的cell效果最好,例如以下图(1)(先忽略block)。在将梯度放到bin里时,依据梯度值的不同对bin的贡献也应该不同,比方能够将梯度值开方平方等等。经过測试作者发现最简单的才是最有效的,比方某个像素的梯度值为10,方向为15度,那就将0-20度的bin加10就好了,就这么简单。只是在计算bin之前,还须要考虑第4步归一化。

图(1)

4、区间归一化(Normalization and Descriptor Blocks)

考虑到同一幅图像中的光照强度可能不同,那么势必会造成不同区域的梯度变化剧烈程度不同,来看作者是怎样消除影响的。前文讲到了像素构成的cell,作者将多个cell构成一个block,在某个block内能够觉得是光照不变的,所以在block内进行梯度值的归一化,比方block内像素的梯度值构成的向量为v=(10,20,30),那么归一化后:v=v/(||v||+E)当中E是一个非常小的常数,作者測试了四种归一化方法,详细能够查看论文[1]。须要注意的是,为了进一步去除光照影响,每一个block的位置是有交叉的,比方某个cell可能属于block1也属于block2。经过測试,作者发现一个Block内有3x3个cell,每一个cell有6x6个像素效果最好如上图(1)。

5、检測窗体(Detector and Context)

以上步骤能够得到一幅图像的hog描写叙述,可是不要忘了初衷:检測行人。准确的说是将一幅图像中的行人圈出来,假设将整幅图像取hog特征进行比对就不是行人检測了。因为行人在图像的位置不固定,所以作者提出了64x128检測窗体的概念,将这个固定大小的窗体在图像上滑动,没滑动一次做一次相似度匹配,匹配的方法在步骤6内。

6、分类器

作者採用SVM作为分类器,将事先标定好的行人和非行人图像依照如上步骤获取hog特征,用svm获取两类的最优间隔。当有一幅待检測图像时,获取步骤5内检測窗体的hog特征,然后利用最优间隔做出分类的判别。

假设给如上步骤画一个流程图,基本就是:

OpenCV里有实现hog行人检測的代码,效果大体例如以下图(自己的图找不到了,下图在网上找的),事实上误检率还是蛮高的,部分误检能够通过差分解决,可是在拥挤的人群效果仅仅能呵呵了。

參考文献:

[1]Navneet Dalal and Bill Triggs:Histograms of Oriented Gradients for Human Detection

[2]http://www.zhizhihu.com/html/y2010/1690.html

[3]http://hi.baidu.com/nokltkmtsfbnsyq/item/f4b73d06f066cd193a53eec3

行人检測之HOG特征(Histograms of Oriented Gradients)的更多相关文章

  1. 【特征检測】BRIEF特征点描写叙述算法

    简单介绍 BRIEF是2010年的一篇名为<BRIEF:Binary Robust Independent Elementary Features>的文章中提出,BRIEF是对已检測到的特 ...

  2. OpenCV特征点检測------Surf(特征点篇)

    Surf(Speed Up Robust Feature) Surf算法的原理                                                              ...

  3. (转)梯度方向直方图HOG(Histograms of Oriented Gradients )

    HOG(Histograms of Oriented Gradients )梯度方向直方图 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视 ...

  4. SIFT(Scale-invariant feature transform) & HOG(histogram of oriented gradients)

    SIFT :scale invariant feature transform HOG:histogram of oriented gradients 这两种方法都是基于图像中梯度的方向直方图的特征提 ...

  5. Face recognition using Histograms of Oriented Gradients

    Face recognition using Histograms of Oriented Gradients 这篇论文的主要内容是将Hog算子应用到人脸识别上. 转载请注明:http://blog. ...

  6. HOG特征-理解篇

    网上去找关于HOG的资料,发现理解性的较少,并且较为冗长,为方便大家理解便自己写了篇,希望能对奋斗在特征提取第一线的同志们有所帮助: HOG即histogram of oriented gradien ...

  7. 目标检測的图像特征提取之(一)HOG特征

    1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检測的特征描写叙述子.它通过计算和统计图像局部区 ...

  8. paper 80 :目标检测的图像特征提取之(一)HOG特征

    1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的 ...

  9. 图像特征提取之(一)HOG特征

    1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的 ...

随机推荐

  1. SRM 588 D2 L2:GUMIAndSongsDiv2,冷静思考,好的算法简洁明了

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12707 算法决定一切,这道题目有很多方法解,个人认为这里 ve ...

  2. unity3d 学习笔记(一)

    操作:按下shit 点击坐标轴中心 切换透视图 动画烘焙的概念:相当于把原来的控制器动画或者IK(骨骼)动画所有塌陷为逐帧动画,导出的时候必须选这一项 着色器:从技术的角度来看,着色器是渲染器的一个部 ...

  3. Android服务Service总结

    转自 http://blog.csdn.net/liuhe688/article/details/6874378 富貴必從勤苦得,男兒須讀五車書.唐.杜甫<柏學士茅屋> 作为程序员的我们, ...

  4. JS高级程序设计学习笔记之基本包装类型

    概述 基本类型:string.boolean.number 每当读取一个基本类型的值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据. 使用new操作符创建的 ...

  5. SqlBulkCopy的一个例子

    public bool InsertAll(IList<NewStockLuoPan> list) { DataTable dt = new DataTable(); dt.Columns ...

  6. 《第一行代码》学习笔记4-活动Activity(2)

    1.Toast是Android系统中一种好的提醒方式,程序中使用它将一些短小的信 息通知给用户,信息会在不久自动消失,不占用任何屏幕空间. 2.定义一个弹出Toast的出发点,界面有按钮,就让点击按钮 ...

  7. 第一篇文章-VS的Local DB数据库连接失败,创建实例失败的解决方案

    用了很久的LocalDB了,不用装那么多的SQL组件感觉很不错,前不久调试代码碰到一个问题 ,VS突然就连接不上LocalDB了,琢磨了一下午,其实有个很简单的方法. 第一步,先找到SQL Local ...

  8. C#中子窗体获取父窗体中控件的内容

    今天在做一个联系人管理的C#设计时,遇到了这个问题,我需要将父窗体中的textBox中的值传到子窗体并进行数据库查询操作,我用了new 父窗体().textBox.text;来进行值传递,然而并无卵用 ...

  9. system进程启动普通用户进程调研

    system进程启动普通用户进程 关键函数是CreateProcessAsUser 主要思路是先取得目的用户的token,然后用上面的函数启动 1.从explorer中取token BOOL GetT ...

  10. python 杂记

    class TestA(object): def __init__(self): print("A is initing"); def foo(self): print(" ...