HOG+SVM

什么是HOG特征?

特征就是某个像素进行四则运算后得到的结果,HOG特征也满足这个定义。梯度直方图特征(HOG) 是一种对图像局部重叠区域的密集型描述符它通过计算局部区域的梯度方向直方图来构成特征。

HOG特征的计算步骤

  1. 模块划分(image win block cell)
  2. 梯度 方向 模板
  3. bin 投影
  4. 每个模块hog

模块划分(image win block cell)

HOG+SVM

从图中我们可以看出image>win>block>cell,win是特征涉及最顶层单元---》obj

涉及滑窗,自然有步长:block step 、win step 、cell bin

win size 是任意的,常用的是64*128

block位于蓝色窗体中,一般win宽高一般是block的整数倍  配套64*128时block是16*16,block要在win中滑动,每次滑动多少个像素,这是它的步长step,假设为8*8的话,计算block要在win窗体中能存在多少个((64-16)/8+1)*((128-16)/8+1)=105个block

当block大小为16*16时,cell size一般设置为8*8,block在窗体win中是滑动的概念,所以在图中红色的block是重叠放置的,但是可以看到在block中cell是并列放置的,这就说明cell并不具备滑动的概念,从而一个16*16的block中可以放置4个8*8的cell

梯度 方向 模板

每个像素都有梯度:大小 f 、方向 angle

若将360度按90度进行划分,可以划分9块,也就是0-360/40=9bin

由此,可以得出HOG特征(即可以完全描述一个obj的所有信息),它的维度=105*4*9=3780

每个像素都有一个梯度》HOG==win窗体下所有像素的特征组合在一起

特征模版-》haar类似

【1 0 -1】【【1】【0】【-1】】

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

b = 上下像素之差

f = 根号下(a方+b方)

angle = arctan(a/b)

bin 投影 梯度

bin 0-360划分为9bin,每个bin的范围是0-40度,但是每个bin不是连续的,被分为两个连续的范围,如下的bin1

bin1 第一个连续的范围是0-20度,第二个连续的范围是180-200度

如果我们知道某一个像素具体位于哪一个bin内我们是知道的,但是它的投影是多少,怎么计算,到底投影多少?对于像素ij f a = 10° ,10°刚好位于0-20°之间,那么我们可以认为它投影在了bin1上,190°位于180°-200°之间也可以认为是在bin1上。当一个像素的角度并不在某一个bin的中心时,这是它会被分解到相邻的两个bin上,例如a=

25°,被分解在 bin1和bin2上

在bin1上的幅值:f1 = f*f(θ)

在bin2上的幅值:f2 = f*(1-f(θ))          

其中f(θ)的值在0-1.0之间 (此方法一般计算量比较大,可以采用投影到某个区间+1 hog)

在前面的讲解中,我们要明确特征是3780维的,整体的HOG特征描述的就用这个3780维的向量,3780维来自于win窗体

《-win(block cell bin,其实每一个维度,就是一个bin

下面将某一个block进行分解:

cell0: bin0 bin1 。。。bin8

cell1: bin0 bin1 。。。bin8

cell2: bin0 bin1 。。。bin8

cell3: bin0 bin1 。。。bin8

对于cell中的每一个元素来说,bin代表了梯度,可以将这一点的幅值记录下来例如对于像素ij在cell0上,梯度为bin0,幅值为f0。同时,对于一些像素来说,会在投影在两个bin中,有两个幅值,需要讲这些梯度权重累加sumbin0(f0+f1.。)= bin0

cell复用

我们知道一个block 4个cell,在进行计算的时候,我们还将block进行另外一个维度的划分cellx0 cellx2 cellx4

cellx0:ij-》bin bin+1  (只对当前cell起作用,分解成2个bin)

cellx2:ij -》 cell2 cell3-》bin bin+1 bin bin+1   (作用在两个cell上,分解成4个bin)

cellx4:ij       (作用在4个cell上,分解成8个bin)

判决

【bin 9】【4cell】【105】 = 3780

【3780】hog -->svm line训练,得到一个【3780】维的向量

【3780】hog *svm【3780】维的向量 = 值

当这个值大于某一阈值时判定为目标obj