HOG--(二)正篇_0914_h的博客-程序员宅基地

技术标签: HOG  机器学习  图像处理  

1.介绍
HOG(Histogram of Oriented Gradient) 2005 CVPR 会议上,法国国家计算机科学及自动控制研究所的Dalal等人提出的一种解 决人体目标检测的图像描述子, 该方法使用 梯度方向直方图 (Histogram of Oriented Gradients,简称HOG)特征来表达人体,提取人体的外形信息和运动信息,形成丰富的特征集。

2.生成过程
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇
1)图像归一化
归一化图像的主要目的是提高检测器对光照的鲁棒性,因为实际的人体目标可能出现的各种不同的场合,检测器,必须对光照不太敏感才会有好的效果。

2)利用一阶微分计算图像梯度
图像平滑 
对于灰度图像,一般为了去除噪点,所以会先利用离散高斯平滑模板进行平滑:高斯函数在不同平滑的尺度下进行对灰度图像进行平滑操作,Dalal等实验表明在下,人体检测效果最佳(即不做高斯平滑),使得错误率缩小了约一倍。不做平滑操作,可能原因:图像时基于边缘的,平滑会降低边缘信息的对比度,从而减少图像中的信号信息。
梯度法求图像梯度
一阶微分处理一般对灰度阶梯有较强的响应  
一阶微分: 
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇


对于函数f(x,y),在其坐标(x,y)上的梯度是通过如下二维列向量定义的: 
这个向量的模值由下式给出:
  方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇

方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇

因为模值的计算开销比较大,一般可以按如下公式近似求解:
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇
Dalal等人利用许多一阶微分模板进行求梯度近似值,但在实验中表明模板[-1,0,1]效果最好。
采用模板[-1,0,1]为例计算图像梯度以及方向,通过梯度模板计算水平和垂直方向的梯度分别如下:
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇
其中,分别表示该像素点的水平,垂直梯度值。计算该 像素点的梯度值(梯度强度)以及梯度方向
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇 对于梯度方向的范围限定,一般采用无符号的范围,故梯度方向可表示为:
 
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇

3)基于梯度幅值的方向权重投影
HOG结构
通常使用的HOG结构大致有三种:矩形HOG(简称为R-HOG),圆形HOG和中心环绕HOG。它们的单位都是Block(即块)。Dalal的试验证明矩形HOG和圆形HOG的检测效果基本一致,而环绕形HOG效果相对差一些。
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇
矩形HOG块的划分:
一般一个块(Block)都由若干单元(Cell)组成,一个单元都有如干个像素点组成。
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇
在每个Cell中有独立做梯度方向统计,从而以梯度方向为横轴的的直方图,前面我们已经提到过,梯度方向可取0度到180度或0度~360度,但dalal实验表明,对于人体目标检测0度~180度这种忽略度数正负级的方向范围能够取得更好的结果。然后又将这个梯度分布平均分成 个方向角度(orientation bins),每个方向角度范围都会对应一个直方柱。
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇
根据Dalal等人实验,在人体目标检测中,在无符号方向角度范围并将其平均分成9份(bins)能取得最好的效果,当bin的数目继续增大效果改变不明显,故一般在人体目标检测中使用bin数目为9范围0~180度的度量方式。
Block中各个参数的最终选取:
对于人体对象检测,块的大小为3×3个单元格,单元格的大小为6×6个象素时,检测效果是最好的,错误率约为10%左右。块的大小为2×2个单元格,单元格大小为8×8个象素时,也相差无几。6-8个象素宽的单元格,2-3个单元格宽的块,其错误率都在最低的一个平面上。块的尺寸太大时标准化的作用被削弱了从而导致错误率上升,而如果块的尺寸太小时,有用的信息反而会被过滤掉。
在实际应用中,在Block和Cell划分之后,对于得到各个像区域中,有时候还会为了进行一次高斯平滑,但是对于人体目标检测等问题,该步骤往往可以忽略,实际应用效果不大,估计在主要还是去除区域中噪点,因为梯度对于噪点相当敏感。
对梯度方向的投影权重方式的选取: 
对于梯度方向的加权投影,一般都采用一个权重投影函数,它可以是像素点的梯度幅值,梯度幅值的平方根或梯度幅值的平方,甚至可以使梯度幅值的省略形式,它们都能够一定程度上反应出像素上一定的边缘信息。根据Dalal等人论文的测试结果,采用梯度幅值量级本身得到的检测效果最佳,使用量级的平方根会轻微降低检测结果,而使用二值的边缘权值表示会严重降低效果(约为5%个单位10-4FPPW(False Positives Per Window))。
4)HOG特征向量归一化
对block块内的HOG特征向量进行归一化。对block块内特征向量的归一化主要是为了使特征向量空间对光照,阴影和边缘变化具有鲁棒性。还有归一化是针对每一个block进行的,一般采用的归一化函数有以下四种:
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇在人体检测系统中进行HOG计算时一般使用L2-norm,Dalal的文章也验证了对于人体检测系统使用L2-norm的时候效果最好。
5)得出HOG最终的特征向量
方向梯度直方图(HOG,Histogram <wbr>of <wbr>Gradient)学习笔记二 <wbr>HOG正篇
3.HOG的应用:
主要用在object detection 领域,特别是行人检测,智能交通系统,当然也有文章提到把HOG用在手势识别,人脸识别等方面。

4.HOG与SIFT区别
HOG和SIFT都属于描述子,以及由于在具体操作上有很多相似的步骤,所以致使很多人误认为HOG是SIFT的一种,其实两者在使用目的和具体处理细节上是有很大的区别的。HOG与SIFT的主要区别如下:
① SIFT是基于关键点特征向量的描述。
② HOG是将图像均匀的分成相邻的小块,然后在所有的小块内统计梯度直方图。
③ SIFT需要对图像尺度空间下对像素求极值点,而HOG中不需要。
④ SIFT一般有两大步骤,第一个步骤是对图像提取特征点,而HOG不会对图像提取特征点。

5.HOG的优点:
HOG表示的是边缘(梯度)的结构特征,因此可以描述局部的形状信息;
位置和方向空间的量化一定程度上可以抑制平移和旋转带来的影响;
采取在局部区域归一化直方图,可以部分抵消光照变化带来的影响。
由于一定程度忽略了光照颜色对图像造成的影响,使得图像所需要的表征数据的维度降低了。
而且由于它这种分块分单元的处理方法,也使得图像局部像素点之间的关系可以很好得到的表征。

6.HOG的缺点:
描述子生成过程冗长,导致速度慢,实时性差;
很难处理遮挡问题。
由于梯度的性质,该描述子对噪点相当敏感

此文属于转载加整理,参考地址已找不到,请见谅

间接转自:http://blog.sina.com.cn/s/blog_60e6e3d50101bkpn.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huanhuanq1209/article/details/79832853

智能推荐

django权限系统实现步骤_RBAC权限系统实现步骤-初版-程序员宅基地

1. 在rbac APP下创建middleware中间库目录2. 创建中间件rbac.py"""自定义RBAC中间件功能描述:根据用户角色实现权限控制"""from django.utils.deprecation importMiddlewareMixinfrom django.shortcuts importrender, redirect, HttpResponseimportrefrom ..._django rbac教程

pyecharts 显示在 Jupyter NoteBook 或 Jupyter Lab_cnv. 显示在jupyterlab-程序员宅基地

pyecharts 显示在 Jupyter NoteBook 或 Jupyter Lab显示在 浏览器上pyecharts 官方所提供的基础范例如下,官方提供一个 Faker 模块用来生成虚拟的数据,方便初学者可以快速的观看范例效果,但是此范例会把范例成果输出到 bar_base.html 这个网页文件中,使用者需要使用浏览器才可以观看结果。from pyecharts import options as optsfrom pyecharts.charts import Barfrom pyec_cnv. 显示在jupyterlab

计算机科学与技术基础(技术简介):-程序员宅基地

计算机科学与技术基础(技术简介):本文中所有相关软件网上均有下载,但请到对应官网下载然后自行破解,网上均有可用破解教程,如还是不行,请联系发件人来联系本文的编写者;基础web项目结构:一般存在三个主要模块:前端页面、服务器、数据库:前端页面—通过http请求—》服务器—通过jdbc连接—》数据库一般web项目所用语言:Html->css渲染->展示页面Html->js代码(控制页面交互逻辑,发送请求到后端)->java项目Java代码(作为前端项目的后端服务器,与数

struts2中怎么把action中的值传递到jsp页面-程序员宅基地

对于如何把struts2的action中的值传到jsp页面中,主要的方法有2种:使用转发视图利用request域中储存所需的值使用重定向时存储数据进入session使其在jsp中可以获得下面,让我们分先后的讲解这2种方法!一、转发到jsp:准备步骤:jsp页面随时准备使用el表达式获取request中的值,action中的值分2种,一种是在方法中诞生的,作用域也是方法内;一种是定义为类成员(并带有...

数组filter、find、map、some、every、reduce的用法_数组some,find,reduce,every_web码到功成的博客-程序员宅基地

一、filter数组的过滤或筛选功能,根据筛选条件返回一个包含符合条件元素的新数组,不影响原数组,筛选条件写在一个函数中let arr= [ {id:1,name: "a", age: 18}, {id:2,name: "b", age: 15}, {id:3,name: "c", age: 16}, {id:4,name: "d", age: 17}, {id:5,name: "e", age: 19}]let newarr=arr.f..._数组some,find,reduce,every

第四周讨论记录_王材荣-程序员宅基地

讨论记录:讨论的主题是使我们的软件的两个系统之间更有关联。因为已经想了好几天,很快就有了结论。我们决定将论坛部分的功能具体化,让其更有针对性,表现为:每个管理员(一般是老师)可以创建论坛版块供同学们交流,这样也方便其他同学的查看,版块成员来自聊天系统,论坛版块不再单独设置个人信息及关注功能。同样为了避免各人理解和设计的差异,细节全部由组长敲定,再分别指导其他成员,与其他成员就各自完成部分进行交..._王材荣

随便推点

linux bcm43142无线网卡驱动安装,debian BCM 43142无线驱动安装,debianbcm43142_温绚的博客-程序员宅基地

debian BCM 43142无线驱动安装,debianbcm43142debian BCM 43142无线驱动安装最近安装 debian 9.3 ,进入系统没有无线网卡驱动。综合网上的一些观点,最后得到:1.*维基百科 wl debianInstallationAdd a “non-free” component to /etc/apt/sources.list for your Debian..._debian12 bcm43142

JZOJ 1163. 第K短路(A*)-程序员宅基地

JZOJ 1163. 第K短路题目DescriptionBessie 来到一个小农场,有时她想回老家看看她的一位好友。她不想太早地回到老家,因为她喜欢途中的美丽风景。她决定选择K短路径,而不是最短路径。农村有 R (1≤R≤100,000) 条单向的路,每条路连接 N (1≤N≤10000) 个结点中的两个。结点的编号是 1…N。Bessie 从结点 1出发,她的朋友(目的地)在结点 N。...

java8 steam 把对象集合中某一属性拆解成单独集合-程序员宅基地

List<MoocSchoolRecord> coursePeriod = new ArrayList<>(); coursePeriod.add(new MoocSchoolRecord().setCreditHour(10d)); coursePeriod.add(new MoocSchoolRecord().setCreditHour(20d)); coursePeriod.add(new MoocSchoolRecord()..

BFC、IFC、FFC、GFC、_cfcfcccccf-程序员宅基地

1.BFC简介BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等)Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的。元素的类型和 display 属性,决定了这个 Box 的类型。 不同类型的 Box, 会参与不同的 Formatting Con..._cfcfcccccf

scrollview 显示在顶部-程序员宅基地

不解释 肯定用的到 就是在scrollview里面的第一个控件,设置 android:focusable=”true” android:focusableInTouchMode=”true” 就是这么简单

托管C++函数定义输出参数(ref)-程序员宅基地

有时候我们为了调用系统底层的API,为UI(C#)提供服务,那么要以把这些方法放在托管工程中(CLR),这样既可以调用API,又可以供.NET上层使用,这的确是一个很好的方法,CLR工程就像是一个桥梁,连接C++与.NET?但有时候会有这么一个问题:在托管工程中的方法,如何声明输出参数?举个例子:有这样一个函数:GetTimeStampFormat_r(UINT &Fo