《计算机视觉工程师纳米课程》第1篇 HOG算法(exercise_1_4_Feature_Vectors_3_1 HOG)

Histograms of Oriented Gradients (HOG)  定向梯度直方图(HOG)

正如我们在ORB算法中看到的那样,我们可以使用图像中的关键点来进行基于关键点的匹配,以检测图像中的对象。 当您想要检测具有许多不受背景影响的一致内部特征的对象时,这些类型的算法非常有用。 例如,这些算法适用于面部检测,因为面部具有许多不受图像背景影响的一致内部特征,例如眼睛,鼻子和嘴巴。 然而,当尝试进行更一般的对象识别时,这些类型的算法不能很好地工作,例如,图像中的行人检测。 原因是人们没有像脸一样的内部特征,因为每个人的体形和风格都不同(见图1)。 这意味着每个人都将拥有不同的内部特征,因此我们需要一些可以更一般地描述一个人的东西。

图1   行人

 一种选择是尝试通过轮廓检测行人。 通过轮廓(边界)检测图像中的对象是非常具有挑战性的,因为我们必须处理由背景和前景之间的对比带来的困难。 例如,假设您想要检测在白色建筑物前行走的图像中的行人,并且她穿着白色外套和黑色裤子(参见图2)。 我们可以在图2中看到,由于图像的背景大部分是白色,因此黑色裤子将具有非常高的对比度,但是由于它也是白色的,因此具有非常低的对比度。 在这种情况下,检测裤子的边缘将是容易的,但检测外套的边缘将是非常困难的。 这就是** HOG 的用武之地.HOG代表直方图的直方图**,它是由Navneet Dalal和Bill Triggs于2005年首次推出的。

 

图2  高低对比度

HOG算法通过创建图像中梯度方向分布的直方图,然后以非常特殊的方式对它们进行标准化来工作。 即使在对比度非常低的情况下,这种特殊的标准化也使HOG在检测物体边缘时非常有效。 这些归一化的直方图被放在一个特征向量中,称为HOG描述符,可用于训练机器学习算法,例如支持向量机(SVM),以根据它们的边界(边缘)检测图像中的对象。。 由于其巨大的成功和可靠性,HOG已成为用于物体检测的计算机视觉中最广泛使用的算法之一。

在这个笔记本中,您将学到:

①HOG算法如何工作
②如何使用OpenCV创建HOG描述符
③如何可视化HOG描述符。

The HOG Algorithm

顾名思义,HOG算法基于从图像梯度的方向创建直方图。 HOG算法通过一系列步骤实现:

1.给定特定对象的图像,设置覆盖图像中整个对象的检测窗口(感兴趣的区域)(参见图3)。

2.计算检测窗口中每个像素的梯度大小和方向。

3.将检测窗口划分为连接的像素*单元格,所有单元格大小相同(参见图3)。单元格的大小是一个自由参数,通常选择它以匹配想要检测的特征的比例。例如,在64×128像素检测窗口中,6到8个像素宽的正方形单元适合于检测人体肢体。

4.为每个单元格创建直方图,首先将每个单元格中所有像素的渐变方向分组为特定数量的方向(角度)区域;然后将每个角度箱中梯度的梯度大小相加(见图3)。直方图中的区间数是一个自由参数,通常设置为9个角度区间。

5.将相邻单元分组为块*(参见图3)。每个块中的单元数是一个自由参数,所有块必须具有相同的大小。每个块之间的距离(称为步幅)是一个自由参数,但通常设置为块大小的一半,在这种情况下,您将获得重叠块(见下面的视频*)。已经凭经验显示HOG算法以更好地与重叠块一起工作。

6.使用每个块中包含的单元格来规范化该块中的单元格直方图(参见图3)。如果您有重叠块,这意味着大多数单元格将根据不同的块进行标准化(请参见下面的视频)。因此,相同的单元可以具有几种不同的标准化。

7.将所有块中的所有标准化直方图收集到称为HOG描述符的单个特征向量中。

8.使用来自相同类型对象的许多图像的结果HOG描述符来训练机器学习算法(例如SVM)以检测图像中的那些类型的对象。例如,您可以使用来自行人的许多图像的HOG描述符来训练SVM以检测图像中的行人。训练是通过您想要在图像中检测到的对象的正面负面示例完成的。

9.一旦训练了SVM,就会使用滑动窗口方法来尝试检测和定位图像中的对象。检测图像中的对象需要找到与SVM所学习的HOG图案类似的图像部分。

Fig. 3. - HOG Diagram.

为什么HOG算法有效

如上所述,HOG通过在图像的局部部分(称为* cells *)中添加特定方向的渐变幅度来创建直方图。通过这样做,我们保证更强的梯度将对其各自的角度仓的大小做出更多贡献,同时由噪声导致的弱和随机定向梯度的影响被最小化。以这种方式,直方图告诉我们每个细胞的主要梯度方向。

处理对比度

现在,由于局部照明的变化以及背景和前景之间的对比度,主导方向的大小可以广泛变化。

为了解释背景 - 前景对比度差异,HOG算法尝试在本地检测边缘。为了做到这一点,它定义了一组称为块**的单元格,并使用这个本地单元格组对直方图进行标准化。通过局部归一化,HOG算法可以非常可靠地检测每个块中的边缘;这称为块规范化**。

除了使用块规范化之外,HOG算法还使用重叠块来提高其性能。通过使用重叠块,每个单元向最终HOG描述符贡献若干独立分量,其中每个分量对应于相对于不同块标准化的单元。这似乎是多余的,但是,经验证明,通过相对于不同的本地块对每个小区进行几次归一化,HOG算法的性能显着提高。

加载图像和导入资源

构建我们的HOG描述符的第一步是将所需的包加载到Python中并加载我们的图像。

我们首先使用OpenCV加载三角形图块的图像。 因为cv2.imread()`函数将图像加载为BGR,我们将把图像转换为RGB,这样我们就可以用正确的颜色显示它。 像往常一样,我们会将BGR图像转换为Gray Scale进行分析。

import cv2
import numpy as np
import matplotlib.pyplot as plt


# Set the default figure size
plt.rcParams['figure.figsize'] = [17.0, 7.0]

# Load the image 
image = cv2.imread('./images/triangle_tile.jpeg')

# Convert the original image to RGB
original_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Convert the original image to gray scale
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Print the shape of the original and gray scale images
print('The original image has shape: ', original_image.shape)
print('The gray scale image has shape: ', gray_image.shape)

# Display the images
plt.subplot(121)
plt.imshow(original_image)
plt.title('Original Image')
plt.subplot(122)
plt.imshow(gray_image, cmap='gray')
plt.title('Gray Scale Image')
plt.show()

猜你喜欢

转载自www.cnblogs.com/Edison25/p/10901801.html
今日推荐