zoukankan      html  css  js  c++  java
  • 目标检測的图像特征提取之(一)HOG特征

    1HOG特征:

           方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检測的特征描写叙述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检測中获得了极大的成功。须要提醒的是,HOG+SVM进行行人检測的方法是法国研究人员Dalal2005CVPR上提出的,而现在尽管有非常多行人检測算法不断提出,但基本都是以HOG+SVM的思路为主。

    1)主要思想:

           在一副图像中,局部目标的表象和形状(appearance and shape)可以被梯度或边缘的方向密度分布非常好地描写叙述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。

    2)详细的实现方法是:

           首先将图像分成小的连通区域,我们把它叫细胞单元。然后採集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就能够构成特征描写叙述器。

    3)提高性能:

           把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对照度归一化(contrast-normalized),所採用的方法是:先计算各直方图在这个区间(block)中的密度,然后依据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。

    4)长处:

           与其它的特征描写叙述方法相比,HOG有非常多长处。首先,因为HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持非常好的不变性,这两种形变仅仅会出如今更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,仅仅要行人大体上能够保持直立的姿势,能够容许行人有一些细微的肢体动作,这些细微的动作能够被忽略而不影响检測效果。因此HOG特征是特别适合于做图像中的人体检測的。

     

    2HOG特征提取算法的实现过程:

    大概过程:

    HOG特征提取方法就是将一个image(你要检測的目标或者扫描窗体):

    1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);

    2)採用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对照度,减少图像局部的阴影和光照变化所造成的影响,同一时候能够抑制噪音的干扰;

    3)计算图像每一个像素的梯度(包含大小和方向);主要是为了捕获轮廓信息,同一时候进一步弱化光照的干扰。

    4)将图像划分成小cells(比如6*6像素/cell);

    5)统计每一个cell的梯度直方图(不同梯度的个数),就可以形成每一个celldescriptor

    6)将每几个cell组成一个block(比如3*3cell/block),一个block内全部cell的特征descriptor串联起来便得到该blockHOG特征descriptor

    7)将图像image内的全部blockHOG特征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”,比如每一个cell6*6个像素。如果我们採用9bin的直方图来统计这6*6个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,如图所看到的:比如:如果这个像素的梯度方向是20-40度,直方图第2bin的计数就加一,这样,对cell内每一个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就能够得到这个cell的梯度方向直方图了,就是该cell相应的9维特征向量(由于有9bin)。

            像素梯度方向用到了,那么梯度大小呢?梯度大小就是作为投影的权值的。比如说:这个像素的梯度方向是20-40度,然后它的梯度大小是2(如果啊),那么直方图第2bin的计数就不是加一了,而是加二(如果啊)。

             细胞单元能够是矩形的(rectangular),也能够是星形的(radial)。

     

    4)把细胞单元组合成大的块(block),块内归一化梯度直方图

           因为局部光照的变化以及前景-背景对照度的变化,使得梯度强度的变化范围很大。这就须要对梯度强度做归一化。归一化可以进一步地对光照、阴影和边缘进行压缩。

            作者採取的办法是:把各个细胞单元组合成大的、空间上连通的区间(blocks)。这样,一个block内全部cell的特征向量串联起来便得到该blockHOG特征。这些区间是互有重叠的,这就意味着:每个单元格的特征会以不同的结果多次出如今最后的特征向量中。我们将归一化之后的块描写叙述符(向量)就称之为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*2cell组成一个块,由于每一个cell9个特征,所以每一个块内有4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗体,垂直方向将有15个扫描窗体。也就是说,64*128的图片,总共同拥有36*7*15=3780个特征。

    HOG维数,16×16像素组成的block,8x8像素的cell

     

    凝视:

    行人检測HOG+SVM

    整体思路:
    1、提取正负样本hog特征
    2、投入svm分类器训练,得到model
    3、由model生成检測子
    4、利用检測子检測负样本,得到hardexample
    5、提取hardexample的hog特征并结合第一步中的特征一起投入训练,得到终于检測子。

    深入研究hog算法原理:
    一、hog概述

    Histograms of Oriented Gradients,顾名思义,方向梯度直方图,是目标的一种描写叙述的方式,既是描写叙述子。
    二、hog提出
    hog是05年一位nb的博士提出来的,论文链接 http://wenku.baidu.com/view/676f2351f01dc281e53af0b2.html
    三、算法理解
            最终到10月了,最终能够松一口气了,整理一下hog的算法流程。
    首先要有一个总体的认识,每个目标都相应一个一维特征向量,这个向量一共同拥有n维,这个n不是凭空瞎猜的,是有理有据,打个例如,为什么opencv自带的hog检測子是3781维的?这个问题在初期确实比較头疼,纠结了好长的时间,只是别着急,
    我们先来看一下opencv里的HOGDescriptor这个结构的构造函数HOGDescriptor(Size winSize,Size blocksize,Size blockStride,Size cellSize,...(后面的參数在这里用不到)),去查一下opencv默认的參数我们能够看到,winSize(64,128),blockSize(16,16),blockStride(8,8),cellSize(8,8),非常显然hog是将一个特征窗体win划分为非常多的块block,在每个块里又划分为非常多的细胞单元cell(即胞元),hog特征向量既是把这些全部的cell相应的小特征串起来得到一个高维的特征向量,那么这个窗体相应的一维特征向量维数n就等于窗体中的块数 x 块中的胞元数  x 每个胞元相应的特征向量数。
    写到这里,我们计算一下3781怎样得到的,窗体大小64x128,块大小16x16,块步长8x8,那么窗体中块的数目是((64-16)/8+1)*((128-16)/8+1) = 7*15 =105个块,块大小为16x16,胞元大小为8x8,那么一个块中的胞元cell数目是 (16/8)*(16/8) =4个胞元,到这里我们能够看到要求最后须要的维数n,仅仅须要计算每个胞元相应的向量,这个參数在哪呢?别急,我们把每个胞元投影到9个bin(怎样投影?这里卡了非常长一段时间,后面会说),那么每个胞元相应的向量就是9维,每个bin相应该9维向量的一个数,如今看一下是不是计算窗体维数的三个需求量都知道了,n = 窗体中的块数 x 块中的胞元数  x 每个胞元相应的特征向量数,带入看一下n= 105x4x9 = 3780,这就是这个窗体相应的特征了。有人会说,为什么opencv里的getDefaultPeopleDetector()得到的是3781维呢?这是由于另外一维是一维偏移,(非常崩溃是吧,我也崩溃非常久。。。,下一段解释)。
    我们利用hog+svm检測行人,终于的检測方法是最主要的线性判别函数,wx + b = 0,刚才所求的3780维向量事实上就是w,而加了一维的b就形成了opencv默认的3781维检測算子,而检測分为train和test两部分,在train期间我们须要提取一些列训练样本的hog特征使用svm训练终于的目的是为了得到我们检測的w以及b,在test期间提取待检測目标的hog特征x,带入方程是不是就能进行判别了呢?
    **************************************************************************************************
                                               华丽的切割线
    写到这里,至少对hog的运作流程有了一个大概的认识,在网上能看到非常多的hog计算方法,神马归一化,计算梯度,对每一个胞元进行投影,千篇一律,对刚開始接触的人来说,看完善像懂了,但就是不知道怎么用,hog和svm怎样配合,并且那些东西对我们的初期的学期全然没用,优点就是会用hog了,再回过头去看原理,才有收获,那些资料网上一堆,这里就不画蛇添足了。
    另外值得一提的是在计算胞元特征的时候,须要向各个bin投影,这个投影里面大有文章,师兄毕业论文里就提到了,取名叫‘三维一次线性插值’,假设想深入了解hog的能够细致琢磨去。
    **************************************************************************************************
                                             继续华丽的切割
    以下说一下libsvm和CvSVM的使用,我认为libsvm更好用,只是cvsvm也是基于libsvm2.6(没记错的话)改写的,这两个的差别就是libsvm训练得到的是一个model,而cvsvm是xml文件,在计算最后的wx+b=0中的w向量的时候,对于libsvm直接处理model文件就可以,可是对于cvsvm则能够跳过产生xml文件,直接使用cvsvm的对象中的属性就可以(这里说的有点模糊,二者选一个就可以,关系倒不是非常大)
    欢迎大家批评指正、交流学习

     

  • 相关阅读:
    (Java) LeetCode 44. Wildcard Matching —— 通配符匹配
    (Java) LeetCode 30. Substring with Concatenation of All Words —— 与所有单词相关联的字串
    (Java) LeetCode 515. Find Largest Value in Each Tree Row —— 在每个树行中找最大值
    (Java) LeetCode 433. Minimum Genetic Mutation —— 最小基因变化
    (Java) LeetCode 413. Arithmetic Slices —— 等差数列划分
    (Java) LeetCode 289. Game of Life —— 生命游戏
    (Java) LeetCode 337. House Robber III —— 打家劫舍 III
    (Java) LeetCode 213. House Robber II —— 打家劫舍 II
    (Java) LeetCode 198. House Robber —— 打家劫舍
    (Java) LeetCode 152. Maximum Product Subarray —— 乘积最大子序列
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3854219.html
Copyright © 2011-2022 走看看