关于hist3dbig:
这是一个三维的矩阵,用来存储三维直方图。最常见的一维的直方图是这个样子,
二维直方图呢?是这个样子,一个一个的柱子是一个统计bin,柱子的高低代表统计值的大小
三维直方图呢?是这个样子,立体的一个一个的小格子,每个小格子是一个统计bin, 小格子用来装统计值。以上面的例子,那么对一个block来说,它的直方图是下面这样的:
再来说线性插值,线性插值时,一个统计值需被“按一定比例分配”到这个统计点最邻近的区间中去,下面的图显示了一维直方图时,落在虚线标记范围内的统计点,它最近邻的区间就是标有红色圆点的两个区间
若是二维直方图,那落在如下虚线矩形中的统计点,周围的这四个统计区间就是它最近邻的区间。这个虚线矩形由四个统计区间各自的1/4组成。
三维直方图,对一个统计点来说,它的最近邻的区间有八个,如下图,可以想象一下,只有当这个统计点落在由如下八个统计区间各自的1/8组成的一个立方体内内时,这八个区间才是对统计点最近邻的。
统计时如何分配权重呢?以一维直方图简单说一下线性插值的意思,对于下面绿色小方点(x)的统计值来说,假设标红点的两个bin的中心位置分别为x1,x2,那么对于x,它的分配权重为左边bin: 1-(x-x1)/s, 即 1-a/s = b/s, 右边bin: 1-(x2-x)/s, 即1-b/s = a/s.
类似,那么对三维直方图来说,统计时的累积式(从Dalal的论文里截来的)就是:
三线插值
三线性插值的结果与插值计算的顺序没有关系,也就是说,按照另外一种维数顺序进行插值,例如沿着 、 、 顺序插值将会得到同样的结果。这也与张量积的交换律完全一致。
原因:
A naive distribution scheme such as voting the nearest orientation bin would
result in aliasing effects. Similarly, pixels near the cell boundaries would produce aliasing along
spatial dimensions. Such aliasing effects can cause sudden changes in the computed feature。
最近邻点可能引入噪声影响,在胞元边界处可能产生噪声沿着空间维度。
For example, if a strong edge pixel is at the boundary of a cell in one image and due
to slight change in imaging conditions it falls into the neighbouring cell in the next, the naive
voting scheme assign the pixel’s weight to different histograms bins in the two cases.
vector.(就是说一个胞元中存在的边缘点,在此次插值有了权重,但在下一个胞元中,此边缘点不存在了,这样在另一个胞元中的影响没有了,)
To avoid this, we use 3-D linear interpolation of the pixel weight into the spatial orientation histogram.
In the 3-D space the linear interpolation algorithm is know astrilinearinterpolation.
三线插值理解: 对一个三维随机向量调整其直方图概率估计的过程
参考:http://hi.baidu.com/timehandle/blog/item/366ad357eda594d0b645ae4b.html
cell 有交互:还要兼顾相邻的cell,这样做可以提高计算出来的特征向量的鲁棒性,不然的话两个差不多的图,如果有一个强梯度点在两个图中分别落在两个相邻的cell里,但偏差不是太多的话,计算出来的HOG特征向量差别会很大。
那为什么线性插值呢?
我记得图像配准时,浮动图像向参考图像映射时,用到双线性插值,就是映射点不在参考图像的整数位置,所以利用映射点周围的邻近4个点确定这个点的灰度值。我想道理应该很类似。但这里为什么线性插值呢?
:嗯,是那个意思。 这里的线性插值是为了提高最终特征向量的鲁棒性,假设一个大梯度点落在两个相邻的cell1与cell2的边境附近,那么它落在cell1或cell2里这两种情况计算
出来的特征向量差别就比较大,加上插值,会弱化这种大梯度点对特征向量最终结果的强烈影响,即使大梯度点的位置变化一两个像素,最终特征向量差不多
问题2:
hist3dbig(biny1,binx1,binz1) =...
hist3dbig(biny1,binx1,binz1) + gs*gaussweight...
* (1-(jorbj-x1)/cellpw)*(1-(iorbi-y1)/cellph)...
*(1-(go-z1)/(or*pi/nthet));
结构体hist3dbig里存储的就是加了权重的统计频数吧?
为什么由梯度模值、高斯权重、以及后面的 (1-(jorbj-x1)/cellpw)*(1-(iorbi-y1)/cellph)*(1-(go-z1)/(or*pi/nthet))三维插值系数共同决定呢?
解答:
梯度模值我理解是为了体现出图像中的主要的边缘信息,因为梯度模越大,这些信息越明显。高斯权重的话我理解是这样,block中中心位置处的点被作者当做重要信息了,离得越远越可能不是人身上的点(如果当前block确实框在人身体上的话)。这个不是一定要这么做,我觉得没有很强的依据说必须得这么做,也许是原作者根据自己的直觉慢慢试出来的,发现这样效果比较好。。。
问题3:
那大梯度点是指模值很大么?不管怎样,它要么属于cell1,要么属于cell2,统计时,如果属于cell1只需根据角度,选择cell1中的【0-9】角度区间中的某一个,为甚吗您说“落入两个cell的边境附近”呢,实在不明白。
利用gaussweight的16*16权值矩阵,它有个特点就是中心点的值很大,几乎为1,边缘的比较小。这样会弱化第1,或16列,第1,或16行的点。这样对8*8的像素也起您说的弱化作用?
谢谢指点
解答:
复vivienlw:嗯,是那个频数了
回复vivienlw:是指模值大。是这样的,假设说你使用hog特征做目标跟踪,当前帧时你的跟踪结果框中这个大梯度模值点的空间位置在cell1里,但这个位置就在cell1的边上,再有2个像素,它就被框在cell2里了,再假设这个点对应的角度落在的cell1里的【0-9】某个角度区间了,那么cell1里的这个角度区间就会因为大梯度点带来的大权重而使得频数变得很大。到下一帧的时候,因为人的姿势稍微动了下(位置没动),扫描的时候这个大梯度模值点结果与原来位置相比移动了两个像素,结果它的空间位置跑cell2里了,这样它把的那个相当大的权重又给了cell2对应的【0-9】区间的某个区间。最终导致:人的位置没动,就可能胳膊稍微动了下,咱们肉眼看得话觉得可以算作“差不多”一样了,但结果使得前后两帧中一个特征向量里cell1里的某个角度区间频数很大,另一个特征向量里cell2里的某个角度区间频数很大,本来两个从“差不多”的人体提取出来的特征向量应该差不多,最后变得差别很大了。
回复vivienlw:嗯,那个高斯模板是干这个的。线性插值的目的就是每个点的梯度模值不仅仅给自己所在的cell里的角度区间提供权重,还要分出去点给邻近的cell,大家共同致富。。
感谢博主的细心解答。我终于明白了。
为了避免相邻两帧的图像的两个相邻cell的特征向量差别不要太大,所以就需要对block中的每个像素进行插值。
由于每个像素由x方向、y方向、和角度区间三个坐标确定,所以就有三维插值。
插值时需要确定前一个区间的中心点,和后一个区间的中心点,x方向:最左边的4列像素,其前一个区间的中心点超出了图像的范围,所以您扩展了左边一个cell,那么中心店为-3.5,同理y方向,最上边的4列像素的前一个区间的中心店也是-3.5. 同理,角度方向的第一个区间的前一个区间的中心点是-10°。
同理,可确定后一个区间的中心点。
是这样吧,博主!