在机器学习算法的天下里,特性工程好坏常紧张的。实践上,作为一名数据封建家,这是我最喜好的方面之一!从现有特性中计划新特性并改良模子的功能,这就是我们举行最多实行的场合。
天下上一些顶级数据封建家依托特性工程来提高他们在比赛排行榜得分。我信赖你乃至会在布局化数据上使用种种特性工程武艺。
我们可以将此武艺扩展到非布局化数据(比如图像)吗?关于盘算机视觉喜好者来说,这是一个幽默的成绩,我们将在本文中处理这个成绩。准备好对图像数据举行特性提取情势的特性工程吧!
在本文中,我将向你先容一种盛行的图像特性提取武艺——朝向梯度直方图(Histogram of Oriented Gradients),或俗称的HOG。我们将了解什么是HOG特性形貌子,它是怎样事情的(算法眼前的完备数学原理),最初,用Python完成它。
你约莫在阅读标题时就以前碰到了这个成绩。以是,在我们跳进文章的HOG局部之前,起主要清晰这一点。
看看底下体现的两个图像。你能区分出图像中的物体吗?
我们可以清晰地看到这里的右图有狗,左图有车。如今,让我让这项职责略微繁复一点,区分下图所示的目标:
照旧挺容易的。你能猜出第一种和第二种情况之间有什么区别吗?第一对图像有很多信息,好比物体的外形,颜色,边沿,背景等。
另一方面,第二对信息少得多(仅有外形和边沿),但它仍旧足以区分这两个图像。
你晓得我想说什么吗?在第二种情况下,我们照旧很容易区分目标,由于它具有识别目标所需的必要信息。这正是特性形貌子的作用:
它是图像的简化表现,仅包含有关图像的最紧张信息。
以下是一些最受接待的的特性形貌子。
在本文中,我们将重点眷注HOG特性形貌子及其事情原理。让我们开头吧!
HOG(Histogram of Oriented Gradients)是一种特性形貌子,通常用于从图像数据中提取特性。它广泛用于盘算机视觉职责的物体检测。
让我们看一下HOG的一些紧张方面,它们与其他特性形貌子不同:
给一个正式界说:
HOG特性形貌子盘算图像局部地区中梯度朝向的显现次数。
使用OpenCV等东西完成HOG十分简便。这只是几行代码,由于我们在skimage.feature库中有一个名为hog的预界说函数。但是,我们在本文中的重点是怎样实践盘算这些特性。
我们如今应该对HOG特性形貌子的基本看法有所了解。是时分深化研讨本文眼前的中心头脑了。让我们讨论HOG的渐渐盘算历程。
思索底下的尺寸图像(180 x 280)。让我们具体了解怎样以此图像创建HOG特性:
第一步:预处理数据(64x128)
这是大大多人都十分熟习的一步。预处理数据是任何机器学习项目中的紧张步调,即使在处理图像时也没有什么不同。
我们必要对图像举行预处理,并将宽高比低落到1:2。图像轻重最好是64 x 128。这是由于我们将图像分红88和1616小块来提取特性。具有指定的轻重(64 x 128)将使我们的一切盘算相当简便。内幕上,这正是原始论文中使用的值。
回到我们的例子,让我们将轻重为64x128作为现在的标准图像轻重。以下是调停后的图像:
第二步:盘算梯度(x和y朝向)
下一步是盘算图像中每个像素的梯度。梯度是x和y朝向上的小厘革。这里,我要从图像中取一小块,然后盘算它的梯度:
我们将取得这个局部的像素值。假定我们为给定的局部天生底下的像素矩阵(这里的矩阵只是作为一个例子,这些并不是给定局部的原始像素值):
我突出体现了像素值85。如今,要确定x朝向上的梯度,我们必要从右方的像素值减去右方的值。相似地,为了盘算y朝向的梯度,我们将从所选像素上的像素值减去底下的像素值。
因此,该像素的x和y朝向的梯度为:
这个历程将给我们两个新的矩阵,一个在x朝向上存储梯度,另一个在y朝向上存储梯度。这相似于使用轻重为1的Sobel内核。当产生剧烈厘革时(比如在边沿四周),幅值(magnitude)会更高。
我们分散盘算了x和y朝向的梯度。对图像中的一切像素反复相反的历程。下一步是使用这些值找到幅值和朝向。
第三步:盘算幅值和朝向
使用我们在最初一步中盘算的梯度,我们如今将确定每个像素值的轻重和朝向。关于这一步,我们将使用勾股定理(是的,与你在学校学习的谁人相反!)。
看看底下的图片:
在之前的例子中,Gx和Gy分散是11和8。使用勾股定理盘算总梯度轻重:
接下去,盘算相反像素的朝向。我们晓得我们可以把角度写成tan
tan(Φ)= Gy/Gx
因此,角度的值将是:
Φ= atan(Gy/Gx)
当我们代入这些值时,角度是36°。如今,关于每个像素值,我们有总梯度(幅值)和朝向。我们必要使用这些梯度和朝向天生直方图。
但是请稍等——在深化研讨HOG特性形貌子中怎样创建直方图之前,我们必要稍作休憩。把这看作是整个历程中的一小步。我们将起首讨论一些简便的办法来创建直方图使用两个值,梯度和朝向。
直方图是体现一组一连数据的频率分布的图。变量(以箱子的情势)在x轴上,频率在y轴上。这里,我们设x轴上为角度,y轴为频率。
办法1:
让我们从天生直方图的最简一办法开头。我们将取每个像素值,找到像素的朝向并更新频率表。
底下是高亮像素(85)的处理历程。由于该像素的角度为36°,我们将对角度值36添加一个数字,表现频率:
对一切像素值反复相反的历程,最初取得一个频率表,表现角度以及这些角度在图像中的显现情况。这个频率表可用于天生在x轴上有角度值的直方图和在y轴上有频率值的直方图。
这是创建直方图的一种办法。注意,这里直方图的bin值(角度的距离)为1。因此我们取得约莫180个不同的桶,每个桶代表一个角度值。另一种办法是为更大的角度值距离创建直方图特性。
办法2:
这个办法与前方的办法相似,不同之处在于我们的bin值为20。因此,我们在这里取得的桶数是9。
相反,关于每个像素,我们将反省角度,并以9 x 1矩阵的情势存储角度值的频率。绘制这个将给我们直方图:
办法3:
上述两种办法仅使用角度值来天生直方图,并且不思索梯度值。这是我们可以天生直方图的另一种办法 - 我们可以使用梯度幅值(magnitude)来添补矩阵中的值,而不是使用频率。以下是示例:
办法4:
让我们对外表的办法做一个小修正。在这里,我们将像素梯度的奉献添加到像素梯度两侧的区间。请记取,更接近角度的bin值有更高的奉献。
这正是在HOG特性形貌子中创建直方图的办法。
第4步:盘算8×8单位(9×1)中梯度的直方图
HOG特性形貌子中创建的直方图不会为整个图像天生。将图像支解为8×8个单位格,盘算每个单位格的朝向梯度直方图。
经过如此做,我们取得了代表整个图像的小块的特性(或直方图)。我们固然可以把这个值从8 x 8换成16 x 16大概32 x 32。
假如我们将图像区分为8×8个单位格并天生直方图,我们使用我们在上一节中讨论的办法4天生该矩阵,将为每个单位格取得9 x 1矩阵。
一旦我们为图像中的8×8小块天生了HOG,下一步就是对直方图举行标准化。
步调5:将16×16单位(36×1)中的梯度标准化
在我们了解这是怎样做到的之前,起首了解为什么要如此做是很紧张的。
固然我们以前为图像的8×8单位创建了HOG特性,但是图像的梯度对全体光照很敏感。这意味着关于特定的图像,图像的某些局部与其他局部比拟会十分亮堂。
我们不克不及从图像中完全消弭这个。但是我们可以经过使用16×16个块来对梯度举行归一化来变小这种光照厘革。底下的例子可以表明怎样创建16×16块:
在这里,我们将组合四个8×8单位来创建一个16×16块。并且我们以前晓得每个8×8单位具有效于直方图的9×1矩阵。因此,我们将有四个9×1矩阵或一个36×1矩阵。为了标准化该矩阵,我们将这些值中的每一个除以值的平方和的平方根。在数学上,关于给定的向量V:
V = [a1,a2,a3,... a36]
我们盘算平方和的根:
k =√(a1)2+(a2)2+(a3)2+ .... (A36)2
并将向量V中的一切值除以此值k:
后果将是尺寸为36×1的归一化向量。
第6步:完备图像的特性
我们如今正处于为图像天生HOG特性的最初一步。到现在为止,我们以前为16×16块图像创建了特性。如今,我们将团结一切这些来取得终极图像的特性。
你能猜出我们将为给定图像提供的特性总数是几多?我们起首必要找出一个64×128图像可以取得几多如此的16×16块:
我们将有105(7×15)块16×16。这105个块中的每一个都具有36×1的向量作为特性。因此,图像的总特性将是105×36×1 = 3780个特性。
我们如今将为单个图像天生HOG特性,并验证我们对否在最初取得相反数目标特性。
是时分完成了!我敢一定,这是本文中最受渴望的局部。让我们开头吧。
我们将看到如安在单个图像上天生HOG特性,以及对否可以在更大的数据集上使用相反的HOG特性。我们将起首加载所需的库和我们要为其创建HOG特性的图像:
#导入所需的库 from skimage.io import imread, imshow from skimage.transform import resize from skimage.feature import hog from skimage import exposure import matplotlib.pyplot as plt %matplotlib inline #读入图片 img = imread('puppy.jpeg') imshow(img) print(img.shape) (663,459,3)
我们可以看到图像的外形是663 x 459.我们将不得不将此图像调停为64 x 128.请注意,我们使用的是skimage,它将输入作为高度x宽度。
#调停图像轻重 resized_img = resize(img, (128,64)) imshow(resized_img) print(resized_img.shape) (128,64,3)
在这里,我将直接使用skimage.features的hog函数。因此,我们不必单独盘算梯度,幅值(总梯度)和朝向。hog函数将在内里盘算它并前往特性矩阵。
别的,假如你设置参数'visualize = True',它将前往HOG的图像。
#创建hog特性 fd, hog_image = hog(resized_img, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(2, 2), visualize=True, multichannel=True)
在持续之前,让我先先容一下这些超参数代表什么。大概,你可以在此处查察官方文档中的界说。
函数的特性矩阵存储在变量fd中,图像存储在hog_image中。让我们反省一下特性矩阵的外形:
fd.shape (3780) ''' HOG FEATURES ''' # 导入必要的包 from skimage.io import imread, imshow from skimage.transform import resize from skimage.feature import hog from skimage import exposure #读取图片 img = imread('puppy.jpeg') #改动图片尺寸 resized_img = resize(img, (128,64)) #产生HOG特性 fd, hog_image = hog(resized_img, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(2, 2), visualize=True, multichannel=True) print('\n\nShape of Image Features\n\n') print(fd.shape) Shape of Image Features (3780,)
正如预期的那样,我们有3,780个图像特性,这验证了我们之前在步调7中所做的盘算。你可以选择变动超参数的值,这将为你提供不同轻重的特性矩阵。
让我们最初看看HOG图像:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8), sharex=True, sharey=True) ax1.imshow(resized_img, cmap=plt.cm.gray) ax1.set_title('Input image') # 缩放直方图以便更好地体现 hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 10)) ax2.imshow(hog_image_rescaled, cmap=plt.cm.gray) ax2.set_title('Histogram of Oriented Gradients') plt.show()
本文眼前的想法是让你了解HOG特性形貌子眼前的实践原理以及怎样盘算特性。整个历程分为7个简便步调。
下一步,我勉励你实验在简便的盘算机视觉成绩上使用HOG特性,并查察模子功能对否有所改良。
版权声明:本文来自互联网整理发布,如有侵权,联系删除
原文链接:https://www.yigezhs.comhttps://www.yigezhs.com/qingganjiaoliu/46542.html