原文链接:https://www.jianshu.com/p/395f0582c5f7
要查看更多专业文章,请移至“人工智能LeadAI”微信官方账号查看更多课程信息和产品信息,并请移至新创建的官网:www.leadai.org。
好久没写东西了。由于楼主换了一个城市的工作,发现工作量在蹭来蹭去,周末喜欢出去吃饭,所以学习时间不长。今天准备了一篇水的文章来翻译如何理解HOG。这篇文章主要是翻译了这篇文章,也是我最喜欢的博主之一。
特征描述符
特征描述符是图像的表示,提取有用信息,丢弃无关信息。通常,特征描述符会将w*h*3的图像转换成长度为n的向量/矩阵,例如,对于64*128*3的图像,转换后的输出图像向量的长度可以是3780。
有哪些特点有用?假设我们要预测一张图片中衣服上的纽扣,通常是圆形的,上面有几个孔,那么你可以用边缘检测器把图片变成只有边缘的图像,然后就可以很容易的分辨出来,所以边缘信息对于这张图片是有用的,而颜色信息是没用的。而且好的功能应该能区分纽扣和其他圆形的东西。
在方向梯度直方图中,梯度的方向分布被用作特征。沿着图片的x轴和y轴的渐变非常有用,因为棱角处的渐变值非常大,我们知道棱角包含了很多物体的形状信息。
方向梯度直方图怎么计算?
我们将首先用图像的一小块来解释它。
1.预处理
Patch可以是任何大小,但它有一个固定比率列。例如,当面片的长宽比为1:2时,面片大小可以是100*200、128*256或1000*2000,但不能是101*205。
这是一张720*475的图片。我们选择一个大小为100*200的补丁来计算HOG特征,从图片中抠出这个补丁,然后调整大小为64*128。
hog _预处理
2.计算梯度图像
总理,我们计算水平和垂直梯度,然后计算梯度的直方图。可以用下面两个核来计算,也可以用OpenCV中核大小为1的Sobel算子直接计算。
水平_垂直_渐变_内核
调用OpenCV代码如下:
// C++ gradient calculation.// Read imageMat img = imreadMat mag,anglecartToPolar;# Python计算梯度大小和方向mag,angle = cv2 . carttoplar
计算的梯度图如下:
左边:X轴梯度绝对值中间:Y轴梯度绝对值右边:梯度幅度
从上图可以看出,X轴方向的梯度主要突出垂直线,Y轴方向的梯度突出水平梯度,梯度幅度突出像素值的急剧变化。
图像的渐变去除了大量不必要的信息,突出了轮廓。换句话说,你能从梯度图像中轻易找到人吗?
每个像素点都有一个大小和方向。对于带有颜色的图片,将在所有三个通道上计算渐变。那么对应的幅度就是三个通道上的最大幅度,角度就是最大幅度对应的角度。
3.计算8*8网络中的梯度直方图
在这一步中,上面的面片图像将被分成8*8个网格,每个网格将计算一个梯度直方图。那为什么要分成8*8呢?使用特征描述符的主要原因之一是它提供了一种紧凑的/压缩的表示。8*8图像有8*8*3=192个像素值,每个像素有两个值,加起来是8*8*2=128。稍后,我们将看到如何将这128个数字表示为9个数字的数组,直方图为9格。用直方图表示一个面片,不仅可以表达紧凑,还可以更抗噪。梯度可能有噪声,但用直方图表示时,对噪声不会那么敏感。
这个补丁的大小是64*128,分为8*8个单元,所以有64/8 * 128/8 = 8*16=128个网格。
对于这个64*128的面片,8*8的网格足够大,可以表示人脸、头部等有趣的特征。
直方图是一个有9个面元的向量,代表角度0,20,40,60...160.
让我们首先看看每个8*8单元格的梯度是什么样的:
中间:有箭头表示渐变的网格;右图:带有数字渐变的网格
中间图中的箭头是梯度的方向,长度是梯度的大小。可以发现,箭头指向的方向是像素强度变化的方向,幅度是强度变化的幅度。
在右边的梯度方向矩阵中,我们可以看到角度是0-180度,而不是0-360度。这种梯度被称为“无符号”梯度,因为一个梯度和它的负数用同一个数表示,也就是说,一个梯度的箭头和它旋转180度后的箭头方向被认为是相同的。那为什么不用0-360度呢?结果发现,在行人检测中,无符号梯度优于有符号梯度。一些HOG实现允许你指定有符号的渐变。
下一步是为这8*8个网格创建直方图,其中包含9个对应于0,20,40,...160.
下图说明了这个过程。我们使用了上图中网格的梯度幅度和方向。根据方向选择使用哪个仓,根据二级值确定这个仓的大小。先看蓝色圈起来的像素,它的角度是80°,二次值是2,所以在第五个bin上加2。然后看红色圈出的像素,它的角度是10,二次值是4。因为角度10在0-20度之间,振幅被分成两个仓,0和20。
梯度直方图
这里有一个细节需要注意。如果一个角度大于160度,也就是在160度到180度之间,我们知道这里的0度和180度是相同的。因此,在下面的例子中,当像素角度为165度时,幅度应该按比例放入0和160的bin中。
当角度大于160°时,
将8*8单元格中的所有像素添加到9个面元中,并构建一个9面元直方图。对应于上面网格的直方图如下:
8*8网格直方图
这里,在我们的表示中,y轴是0度。你可以看到有很多值分布在0,180的bin中,这实际上意味着这个网格中的很多梯度方向不是向上就是向下。
4.16*16块的规范化
在上面的步骤中,我们基于图片创建了一个梯度直方图,但是一个图片的梯度对整个图片的光线很敏感。如果把所有像素除以2,梯度的幅度会减半,直方图中的值也会减半,所以光的影响无法消除。因此,理想情况下,我们希望我们的特征描述符独立于光线变换,因此我们希望我们的直方图标准化,以便不受光线变化的影响。
考虑用l2归一化向量的步骤:
V = 0.5 = 146.64。将V中的每个元素除以146.64,得到。考虑另一个向量2 *你可以理解归一化去除了尺度。
你可能想直接在9*1的直方图上归一化,这是可以的,但是更好的方法是从一个16*16的块开始归一化,也就是把4个9*1的直方图合并成一个36*1的向量,然后归一化,然后把窗口向后移动8个像素。重复这个过程,将整个图形移动到一边。
hog-16x16块标准化
5.计算HOG特征向量
为了计算整个面片的特征向量,需要将36*1的所有向量组合成一个巨大的向量。矢量大小可以计算如下:
我们有多少个16*16的街区?有7个水平移动和15个垂直移动,总共7*15=105个移动。
每个16*16的块代表一个36*1的向量。所以把它们放在一起,就是36*105=3780维向量。
可视化HOG
通常,HOG特征描述符在8*8的网格中绘制一个9*1的归一化直方图,如下图所示。你可以发现直方图的主方向捕捉到了这个人的身材,尤其是躯干和腿部。
可视化直方图
1.《hog 图像学习-HOG特征》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《hog 图像学习-HOG特征》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/1756841.html