大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。
1、HOG特征:
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检測的特征描写叙述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检測中获得了极大的成功。须要提醒的是,HOG+SVM进行行人检測的方法是法国研究人员Dalal在2005的CVPR上提出的,而现在尽管有非常多行人检測算法不断提出,但基本都是以HOG+SVM的思路为主。
(1)主要思想:
在一副图像中,局部目标的表象和形状(appearance and shape)可以被梯度或边缘的方向密度分布非常好地描写叙述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。
(2)详细的实现方法是:
首先将图像分成小的连通区域,我们把它叫细胞单元。然后採集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就能够构成特征描写叙述器。
(3)提高性能:
把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对照度归一化(contrast-normalized),所採用的方法是:先计算各直方图在这个区间(block)中的密度,然后依据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。
(4)长处:
与其它的特征描写叙述方法相比,HOG有非常多长处。首先,因为HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持非常好的不变性,这两种形变仅仅会出如今更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,仅仅要行人大体上能够保持直立的姿势,能够容许行人有一些细微的肢体动作,这些细微的动作能够被忽略而不影响检測效果。因此HOG特征是特别适合于做图像中的人体检測的。
2、HOG特征提取算法的实现过程:
大概过程:
HOG特征提取方法就是将一个image(你要检測的目标或者扫描窗体):
1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);
2)採用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对照度,减少图像局部的阴影和光照变化所造成的影响,同一时候能够抑制噪音的干扰;
3)计算图像每一个像素的梯度(包含大小和方向);主要是为了捕获轮廓信息,同一时候进一步弱化光照的干扰。
4)将图像划分成小cells(比如6*6像素/cell);
5)统计每一个cell的梯度直方图(不同梯度的个数),就可以形成每一个cell的descriptor;
6)将每几个cell组成一个block(比如3*3个cell/block),一个block内全部cell的特征descriptor串联起来便得到该block的HOG特征descriptor。
7)将图像image内的全部block的HOG特征descriptor串联起来就能够得到该image(你要检測的目标)的HOG特征descriptor了。这个就是终于的可供分类使用的特征向量了。
具体每一步的具体步骤例如以下:
(1)标准化gamma空间和颜色空间
为了降低光照因素的影响,首先须要将整个图像进行规范化(归一化)。在图像的纹理强度中,局部的表层曝光贡献的比重较大,所以,这样的压缩处理可以有效地降低图像局部的阴影和光照变化。由于颜色信息作用不大,通常先转化为灰度图;
Gamma压缩公式:
比方能够取Gamma=1/2;
(2)计算图像梯度
计算图像横坐标和纵坐标方向的梯度,并据此计算每一个像素位置的梯度方向值;求导操作不仅可以捕获轮廓,人影和一些纹理信息,还能进一步弱化光照的影响。
图像中像素点(x,y)的梯度为:
最经常使用的方法是:首先用[-1,0,1]梯度算子对原图像做卷积运算,得到x方向(水平方向,以向右为正方向)的梯度分量gradscalx,然后用[1,0,-1]T梯度算子对原图像做卷积运算,得到y方向(竖直方向,以向上为正方向)的梯度分量gradscaly。然后再用以上公式计算该像素点的梯度大小和方向。
(3)为每一个细胞单元构建梯度方向直方图
第三步的目的是为局部图像区域提供一个编码,同一时候可以保持对图像中人体对象的姿势和外观的弱敏感性。
我们将图像分成若干个“单元格cell”,比如每一个cell为6*6个像素。如果我们採用9个bin的直方图来统计这6*6个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,如图所看到的:比如:如果这个像素的梯度方向是20-40度,直方图第2个bin的计数就加一,这样,对cell内每一个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就能够得到这个cell的梯度方向直方图了,就是该cell相应的9维特征向量(由于有9个bin)。
像素梯度方向用到了,那么梯度大小呢?梯度大小就是作为投影的权值的。比如说:这个像素的梯度方向是20-40度,然后它的梯度大小是2(如果啊),那么直方图第2个bin的计数就不是加一了,而是加二(如果啊)。
细胞单元能够是矩形的(rectangular),也能够是星形的(radial)。
(4)把细胞单元组合成大的块(block),块内归一化梯度直方图
因为局部光照的变化以及前景–背景对照度的变化,使得梯度强度的变化范围很大。这就须要对梯度强度做归一化。归一化可以进一步地对光照、阴影和边缘进行压缩。
作者採取的办法是:把各个细胞单元组合成大的、空间上连通的区间(blocks)。这样,一个block内全部cell的特征向量串联起来便得到该block的HOG特征。这些区间是互有重叠的,这就意味着:每个单元格的特征会以不同的结果多次出如今最后的特征向量中。我们将归一化之后的块描写叙述符(向量)就称之为HOG描写叙述符。
区间有两个基本的几何形状——矩形区间(R-HOG)和环形区间(C-HOG)。R-HOG区间大体上是一些方形的格子,它能够有三个參数来表征:每一个区间中细胞单元的数目、每一个细胞单元中像素点的数目、每一个细胞的直方图通道数目。
比如:行人检測的最佳參数设置是:3×3细胞/区间、6×6像素/细胞、9个直方图通道。则一块的特征数为:3*3*9;
(5)收集HOG特征
最后一步就是将检測窗体中全部重叠的块进行HOG特征的收集,并将它们结合成终于的特征向量供分类使用。
(6)那么一个图像的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个特征。
HOG维数,16×16像素组成的block,8×8像素的cell
凝视:
行人检測HOG+SVM
整体思路:
1、提取正负样本hog特征
2、投入svm分类器训练,得到model
3、由model生成检測子
4、利用检測子检測负样本,得到hardexample
5、提取hardexample的hog特征并结合第一步中的特征一起投入训练,得到终于检測子。
深入研究hog算法原理:
一、hog概述
hog是05年一位nb的博士提出来的,论文链接
最终到10月了,最终能够松一口气了,整理一下hog的算法流程。
打个例如,为什么opencv自带的hog检測子是3781维的?这个问题在初期确实比較头疼,纠结了好长的时间,只是别着急,
我们计算一下3781怎样得到的,窗体大小64×128,块大小16×16,块步长8×8,
那么窗体中块的数目是((64-16)/8+1)*((128-16)/8+1) = 7*15 =105个块,块大小为16×16,胞元大小为8×8,那么一个块中的胞元cell数目是 (16/8)*(16/8) =
4个胞元,到这里我们能够看到要求最后须要的维数n,仅仅须要计算每个胞元相应的向量,这个參数在哪呢?别急,我们把每个胞元投影到9个bin(怎样投影?这里卡了非常长一段时间,后面会说),那么每个胞元相应的向量就是
9维,每个bin相应该9维向量的一个数,如今看一下是不是计算窗体维数的三个需求量都知道了,n =
窗体中的块数 x 块中的胞元数
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118641.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...