Issuu on Google+

 

  目   录   1 引言 ................................................................ 1 2 HOG 定义 ............................................................ 1 3 HOG 框架 ............................................................ 1 4 HOG 特征描述 ........................................................ 2 4.1 HOG 描述子 .................................................... 2 4.2 多层扫描 ...................................................... 3 5 HOG 各个阶段的具体过程 .............................................. 4 5.1 HOG 描述子的构建过程 .......................................... 4 5.2 SVM 分类器的构建过程 .......................................... 4 5.3 HOG 检测算法的过程 ............................................ 5 6 使用 HOG 方法训练 .................................................... 6 6.1 实验环境...................................................... 6 6.2 实验过程...................................................... 6 6.3 实验效果 ..................................................... 10

 


HOG识别方法总结 李洋

1 引言 现今在物体识别的方法中,绝大部分都是由这两步构成,第一步是建立图像的描述 子,第二部是根据第一步的描述子选择对应的平台进行检测,就是分类方法。本文 主要介绍HOG方法的原理,检测方法,训练过程,及一个简单物体的识别的完整过程 举例。

2 HOG 定义 HOG全名为Historgram of gradient,即方向梯度直方图,HOG可以解决两类问题, 一是静态图像上的人体检测,这时使用locally normalised Histograms of Oriented Gradients (HOG)作为特征描述子,本文以下内容均说明的是静态图像上的HOG方法。 二是检测视频上运动物体的检测。 要具有好的效果:未经平滑的梯度,较好的方向投票,较强的正规化,重叠块 SVM找到一个超平面,也就是在给定的特征空间上,寻找目标与非目标间的最大的gap (间隔)。

3 HOG 框架 HOG检测物体的框架: HOG检测物体的整体框架分为两个阶段:学习阶段与检测阶段。学习阶段是对固定大 小的图像区域进行有还是没有目标物体的判断,从而建立起一个二维的分类器。检 测阶段则是使用这个分类器在待测图像上进行多层的扫描,并在每个层上的各个位 置进行判断,找到分类器认为含有目标的区域,再加以融合(fuse)。每个阶段都 分为3部,具体如下图所示:

 

1  


学习阶段(learning): 1、训练样本,分为正负样本,其中正样本指的是含有目标物体的样本,理想情况下 只含有一个,负样本则不含。正样本的训练是使用固定大小的含有目标的窗口,而 负样本只需在不含目标的图像上随机地滑动出固定大小的窗口即可。 2、提取特征,这个过程把这些图像窗口映射到一个抽象的固定大小的特征向量空间 中。 3、把这个高维的特征向量输送到分类器中,并告诉它这个图像窗口有还是没有目标, 从而训练出一个分类器,这里用的是线性的SVM来当二维的分类器的,因为可以直接 地将特征向量输入到SVM中,与其他复杂的分类器相比,能得出相同的结果但是却更 快。 检测阶段(detection): 1、计算待测窗口的特征向量 2、把这个窗口的特征向量输入到已经训练好的分类器上,做出是否有目标的判断。 3、在检测过程中使用到了金字塔多层的检测,所以很可能会有重叠的窗口产生,这 一步做的就是融合成一个窗口。

4 HOG 特征描述 4.1 HOG 描述子 HOG描述子是通过密集且重叠的spatial block上的格点,图像梯度方向特征在固定 的分辨率上被提取,然后被收集到一个高维度的向量中去,这样形成的即为HOG描述 子。HOG描述器最重要的思想是:在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。具体的实现方法是:首 先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点 的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。

 

2  


HOG特征向量的运算可以分为5个过程: 1、对图像做一个归一化,来减小光照的影响。实际中使用了gamma压缩,就是对每 个色彩频道计算平方根或log值,因为图像纹理的强度越大,局部表面的光照影响就 越大,所以这种压缩回会减小局部阴影与光照变化带来的影响。可能的话,保留颜 色信息的图像,如RGB和LAB会比灰度图效果更好。根据实验,对于人来说,使用平 方根会比log的灰度校正效果要好。 2、计算一阶的图像梯度,能反映图像的内容,边缘信息,部分纹理信息等。计算梯 度时,使用高斯平滑滤除噪声效果会更差,原因是滤除噪声的同时,重要边缘信息 也被弱化。简单地使用一个一维的离散微分模板效果更好。 3、为局部图像区域提供一个编码,把图像窗口划分成若干小的空域,称为cell,然 后将每个单元格中所有象素的一维梯度直方图或者边缘方向累加到其中。最后将这 个基本的方向直方图映射到固定的角度上,就形成了最终的特征。细胞单元中的每 一 个 像 素 点 都 为 某 个 基 于 方 向 的 直 方 图 通 道 ( orientation-based histogram channel)投票。投票是采取加权投票(weighted voting)的方式,即每一票都是 带权值的,这个权值是根据该像素点的梯度幅度计算出来。可以采用幅值本身或者 它的函数,如平方或平方根来表示这个权值,实际测试表明:使用幅值来表示权值 能获得最佳的效果,当然,也可以选择幅值的函数来表示,比如幅值的平方根(square root)、幅值的平方(square of the gradient magnitude)、幅值的截断形式(clipped version of the magnitude)等。细胞单元可以是矩形的(rectangular),也可以 是星形的(radial)。直方图通道是平均分布在0-180°(无向)或0-360°(有向) 范围内。作者发现,采用无向的梯度和9个直方图通道,能在行人检测试验中取得最 佳的效果。颜色差别重要的时候使用邮箱的角度范围是更好的,但对于检测人类来 说,无向的经过实验效果更好。 4、对比度归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。通常,每个 单元格由多个不同的块共享,即重叠块(overlapping of the blocks),但它的归 一化是基于不同块的,所以计算结果也不一样。因此,一个单元格的特征会以不同 的结果多次出现在最后的向量中。我们将归一化之后的块描述符就称之为HOG描述 符。 5、将检测窗口中所有重叠的块进行HOG特征的收集,并将它们结合成最终的特征向 量供分类器使用。

4.2 多层扫描 对于多层扫描产生的重叠的检测结果,作者提出了non-maximum suppression,此方 法基于一下两点假设: 此解决方案的基于的两点假设:

 

3  


1、若检测器精确,则检测窗口也是精确的,即使会有一点点的偏离中心或大小稍有 偏差。 2、一个可靠的检测器,在没有目标的窗口上,不会与相同的频率和可靠度的冲突。 思路是,把SVM的score映射为正数,即根据max(score, 0) 来取值, 然后是将(x,y,scale)投射到一个三维空间这样便形成了一个金字塔形的结构,即 scale越小的越在上面,x,y差不多的聚在一块,就构成了若干个金字塔,然后应用 mean shift mode 算法到每个检测结果上,最终的结果是,重叠的检测会聚在一起。 理想的融合算法应具有的三个特性: 1、最底下的那个detection的score越高,这块区域就越有可能是一个对的positive。 2、一个图像块的邻近范围内越多的重叠的detection就表明这个图像块越有可能是 true positive。 3、邻近的重叠的detetions应该被融合到一块,但是scale或positive positions 差太大的不应该被融合。

5 HOG 各个阶段的具体过程 5.1 HOG 描述子的构建过程 输入:一幅在当前缩放因子下和当前窗口大小下的图像 输出:在用户给定位置处的高维的特征向量 初始化步骤: 1、(可选)对每个颜色频道的gamma修正。 2、首先用[-1,0,1]梯度算子沿x,y轴对原图像做卷积运算,选取最大量级的channel 作为来计算像素梯度的方向和幅值。 描述子计算过程: a)划分cn*cn个像素的方形图像区域成为cell b)对块中的梯度应用sigma=0.5*cn的高斯窗口 c)创建一个c*c*b的方向梯度直方图 d)对快中的每个像素,使用三线性插值根据梯度幅值投票到直方图中。 最后的步骤: 使用L2-Hys规范化每个block,并计算所有block的梯度方向直方图到一个大的描述 向量中。

5.2 SVM 分类器的构建过程 输入:含有目标的固定大小(Wn,Hn)的窗口与不含目标的任意图像 输出:训练好的判断固定大小窗口图像有无目标的二维分类器 第一阶段学习:

 

4  


计算所有含有目标图像的描述向量,并输入到线性的SVM中。 产生hard negative examples: 对所有的不含目标图像的来进行多层的扫描,来找到分错的例子,即认为含有目标 的样本。 a)开始的缩放因子Ss是1,结束的是Se = min( Wi/Wn, Hi/Hn),Hi和Wi是不含目标 图像的长宽。 b)计算步数,

每一步的缩放因子(即S(i+1)=S(i)*Sr) c)循环n次,并在每次循环中,用双线性插值放大图片,并以每次滑动Ns个像素来计 算特征描述子,给出有没有目标的判断,把所有检测错误的判断输出到一个表里。 第二阶段学习: 使用positive,negative and hard examples来重新训练SVM。 多层扫描的目标定位

5.3 HOG 检测算法的过程 输入: a)待测图像 b)训练好的检测Wn和Hn窗口大小的训练器 输出:目标检测框 初始化: a)使开始的缩放因子为1,结束的缩放因子为Se = min Wi/Wn, Hi/Hn b)

根据层数及stride,循环求出每个像素点对应的每个HOG描述向量

 

5  


c)把特征向量输入给SVM分类器,将所有的检测结果(t(wi) > c)输出到一个列表 中。 融合: 采用Non-maximum suppression算法融合多个detection,并输出最终结果。

6 使用 HOG 方法训练 使用HOG方法训练样本来识别一个小瓶子的简单训练及识别过程:

6.1 实验环境 Ubuntu 11.04 1、 所需软件包: imlib2,安装这个包时还需要3个依赖包,分别是libjpeg、libpng、freetype2.1.x 这 三 个 包 的 安 装 都 可 以 用 ./configure,make,make install 来 完 成 , 之 后 安 装 imlib2,在configure时需要按提示配置不含有x-windows,安装完后就可以使用 OLTbinaries里面的脚本了,但是我的libjpeg明明在命令行下可以使用,但是执行 脚本时却表明无法读取jpeg类型的图片,原因没找到,没办法只能下载批量格式转 换工具了。 OLTbinaries 在 作 者 提 供 的 网 址 可 http://pascal.inrialpes.fr/soft/olt/ 如果想实验作者训练的样本可以下载 http://pascal.inrialpes.fr/soft/olt/ 这里由于训练自己的样本,因此不需要下载这个样本库。

Imageclipper,这个工具是用来抓取图片中的某部分区域并自动截图保存到某个位 置,有linux和windows的版本,其中windows有现成的binaries,而linux版本则需 要自己去编译。

6.2 实验过程 ① 获取样本,此实验要检测的目标是一个小瓶子,因此首先要拍摄含有此瓶子的 若干图像样本,样本取得越多自然越好,我看到有人说最起码也要几千张,这里由 于时间有限,只取了24张含有瓶子的照片,29张不含瓶子。 正样本如下图,

 

6  


选取的样本都是在同一光照下,背景有一定的变化。

 

7  


负样本如下图,

② 对获得的正样本,使用imageclipper裁剪出含有瓶子的固定宽高的图片,如果 不是64*128则需要在runall.sh脚本文件里修改, WIDTH=64; export WIDTH HEIGHT=128; export HEIGHT 然后进行左右对称,这样共有了24*2=48张正样本,负样本不需要处理。 如下图

 

8  


③ 对与固定大小的正样本使用: ls | cut -d ' ' -f 1 > pos.lst 将对应的名字输入到pos.lst中, 对与负样本: ls | cut -d ' ' -f 1 > neg.lst 输入到neg.lst中去。 ④ 完成了上面的几部后,在OLTbinaries的文件夹下,就新建一个train的文件夹, 里面再新建pos和neg文件夹分别存放待训练的正负样本,然后把两个列表文件也一 同放入。如果需要,可以在建立test文件夹,放置类似的文件,不过是用来测试了, 之后可以用matlab查看效果的曲线图。

 

9  


⑤ 执行OLTbinaries下的runall.sh脚本文件,即可开始训练了 经过不长的等待, First  iteration  complete   Hard  examples  created   Doing  second  learning   Second  iteration  complete   显示如上信息即表示成功训练完成,如果有exception::caught或者caught等提 示,表示训练是有问题的,需要检查imlib软件包是否安装正确,或者重新安装。   在HOG文件夹下会有model_4BiSVMLight.alt,这个模型文件,即此为训练的结 果。

6.3 实验效果 使用一张测试图片来检验一下效果, 输入./runonimage.sh 1.png 1.txt result.png 可看到如图效果:

 

10  


Hog总结