计算机视觉基础系列(python与opencv的操作与运用/tensorflow的基础介绍)(二十三)---Hog特征

特征?特征是某个像素经过某种运算得到的结果

 Hog特征:

1.模块的划分   2.根据Hog特征计算梯度和方向(模板特征)  3.bin投影    4.每个模块的Hog特征

1.模块的划分

这里有四个需要知道的知识点:image:图像模块;windows窗体(可以看作和图像模块大小一样,实际上是要小一些的);block模块,cell模块(下面的蓝色(image,windows窗体),红色(block模块)绿色(cell模块))

每个模块都有一个size,我们重点分析它们的size和它们之间的关系。 

image>windows>block>cell,都是包含关系,包含若干个模块。在窗口(windows)滑动的时候会有一个win step步长,在block滑动的时候也有一个步长block step,在cell中会出现一个bin。

窗体windows是特征计算最顶层的单元,比如说我们做车辆检测的时候,一个窗口会覆盖所有的车辆信息,即包含一个obj,这个obj包含了所有的图像信息,这些图像信息是通过计算得到的所有特征,这所有的特征加起来才能描述这个obj。

窗体的大小windows是任意大小的,一般来说,推荐的窗体大小是64x128,比如说车辆识别,行人识别等等。一般来说block的size必须比窗体要小,且窗体的size必须是block的大小的整数倍。一般来说是16x16。block step描述的是如何在窗体中进行移动,一般来说是8x8。计算block cout = ((64-16)/(8+1)*((128-16)/(8+1))=105block。cell的大小一般推荐为8x8,那么一个block中包含多少个cell呢?cell是和block不一样的,不是滑动的,而是并列放置的,每个cell之间是不能重合的,不可滑动的,那么一个block中可以包含4个cell,给它们一个标签cell1,cell2,cell3,cell4。

2.Bin的含义

cell和bin是紧紧关联的。

每个像素都有一个梯度,梯度有两个属性,第一个是大小,第二个是方向。当前的bin的大小和方向相关,0-360度划分为9块,每一块为40度即为9个bin,1个bin=40度。在cell中必须完整包含360度的信息,我们就需要包含9个bin就行了。所以一个cell中包含了9个bin。如上图的圆形座标系所示。

3.Hog特征的维度

harr特征得到的是一个值,因为是几个矩阵相乘,而hog特征得到的是一个向量,那么这个向量的维度是什么呢?

hog特征是为了进行分类来用的,所以它必须完全描述一个obj,必须完全包含obj的所有信息,而窗体又是包含了obj所有的信息,那么这个hog特征一定和窗体windows有关的,hog特征的维度等于窗体中所有block的个数乘以每个block中cell的个数再乘以bin的个数。这里设置的block为105,一个block是含有4个cell的,每个cell对应着9个bin。

维度=105*4*9=3780

4.梯度问题

梯度有大小和方向。如何计算?

每一个像素都有梯度,所以必须要以像素为单位计算,所有的这些像素构成了hog特征,总共有多少个像素呢?需要windows窗体下的所有像素共同在一起构成hog特征。窗体,block,cell这些都需要计算,那么计算量就很大。在harr讲解的时候,我们知道harr是利用模板来计算的,所以hog的梯度也可以利用模板来计算,这里就有特征模板了,和harr相似,有水平和竖直两种模型。在水平方向上的模板是:[1  0  -1];[[1]  [0]  [-1]]。对于水平模板来说,就是拿左中右三个像素分别与模板相乘。

a = p1*1+p2*0+p3*(-1) = 相邻像素之差

b=上下像素值之差 

这样可以得到幅值为f=根号下(a*a+b*b),方向为angle=arctan(a/b)

5.bin的投影

bin的投影和梯度有关,在bin中,将一个cell(360度)划分为9个,每个bin为40度,,其实这40度并不是连续的范围,一般来说是20度是连续的,比如说bin1的范围是0-20;180-200,就是一个180度对称的过程。

如果一个像素点的幅值为10,则它在bin1上,或者它为190,也在bin1上,但是如果幅值为25,则它的幅值可以重新计算。

6.整个窗体

整个窗体中包含的block和cell怎么组合在一起,它们的复用原理

整个特征为3780维,整体的特征描述的就是3780维的向量,我们通过其中一个维度的计算来推导其他3779维的计算。

这个3780维的向量来自哪里?

来源于windows窗体,这个窗体包含了block和cell以及bin,所以每一个维度就是其中的一个bin,所以计算的这个维度,就是某个窗体下的某个block下的某个cell下的某个bin。

我们把某一个block分解,我们把block下的第一个cell即cell1(cell1,cell2,cell3,cell4)进行分解为9份,分别为bin1-bin9。

cell1有九个bin:bin1-bin9,同理cell2,cell3,cell4也一样有九个bin

若某个像素(i,j)投影在了cell1下的bin1上,根据它的梯度,我们可以计算梯度的方向和它的幅值,它的幅值是f,它的方向是一个角度,这个角度投影在了cell1下的bin1上,那么这个时候bin1的内容变成了f1,bin1中描述了这个像素的梯度,所以bin1=f1。

第二个像素(i+1,j)这些像素都位于cell1上的,如果也投影在了bin1上,这时bin1=f2。

同时有很多个像素点,全部遍历完,遍历完后,我们利用sum累加的形式,将所有的bin1累加在一起(f1+f2+f3...)=bin1。实际上像素点(i,j)不仅仅只影响bin1,其实还可以影响到其他的bin,我们在计算bin1的时候不仅仅只是(f1+f2+f3..)还需要加上当前像素在其他像素的投影。即权重的累加。

cell的复用:在一个block中,存在着4个cell,一般情况下是并列排序的,比如说是cell1,cell2,cell3,cell4。对于cell1来说对应着自己的bin1-bin9。其实在正在的计算的过程中,我们还会进行另外一个维度的划分。例如cellx0,cellx2,cellx4

比如说在cellx0上,(i,j)计算出来的bin只对当前的这个cell起作用,虽然它会分解为bin1和bin2,无论是bin1还是bin2,还是只是对当前的cell起作用,cellx2,(i,j)计算出来的bin不只是对当前的cell1起作用,还对当前的cell3起作用,只通用在两个cell上,而每一个cell,又由两个bin进行分解,所以有(bin,bin+1,bin,bin+1)4个bin起作用,cellx4会分解为8个bin。

这就是其中的一维的分解,进行原理解释

 那么,把这个维度,将它们和4个cell组合在一起,共同构成了9维(9个bin),这9维又和block中的4个cell组合在一起,共同构成了36维,然后再和105个block组合在一起共同构成3780维。

这个就是所有的特征维度,那么怎么进行判决呢?

这就涉及到了SVM的相关知识,例如用SVM中的线性分类器来说,首先经过训练,会得到3780维的向量,用hog特征乘以3780维的向量,会得到一个具体的值,和最终的判决值进行比较。如果大于这个判决值就是目标,如果小于这个判决值就不是目标。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章