hog(圖像特征工程:HOG特征描述子介紹)

時間:2024-05-05 16:04:42 閱讀:7

圖像特性工程:HOG特性形貌子先容

先容

在機器學習算法的天下里,特性工程好壞常緊張的。實踐上,作為一名數據封建家,這是我最喜好的方面之一!從現有特性中計劃新特性并改良模子的功能,這就是我們舉行最多實行的場合。

天下上一些頂級數據封建家依托特性工程來提高他們在比賽排行榜得分。我信賴你乃至會在布局化數據上使用種種特性工程武藝。

我們可以將此武藝擴展到非布局化數據(比如圖像)嗎?關于盤算機視覺喜好者來說,這是一個幽默的成績,我們將在本文中處理這個成績。準備好對圖像數據舉行特性提取情勢的特性工程吧!

在本文中,我將向你先容一種盛行的圖像特性提取武藝——朝向梯度直方圖(Histogram of Oriented Gradients),或俗稱的HOG。我們將了解什么是HOG特性形貌子,它是怎樣事情的(算法眼前的完備數學原理),最初,用Python完成它。

目次

  1. 什么是特性形貌子?
  2. HOG特性形貌子簡介
  3. HOG的盤算歷程
  4. 預處理數據
  5. 盤算梯度
  6. 盤算幅值和朝向
  7. 使用梯度和朝向創建直方圖的辦法
  8. HOG的盤算歷程
  9. 盤算梯度直方圖
  10. 標準化梯度
  11. 一幅完備圖像的特性
  12. 在Python中完成HOG特性形貌子

什么是特性形貌子?

你約莫在閱讀標題時就以前碰到了這個成績。以是,在我們跳進文章的HOG局部之前,起主要清晰這一點。

看看底下體現的兩個圖像。你能區分出圖像中的物體嗎?

我們可以清晰地看到這里的右圖有狗,左圖有車。如今,讓我讓這項職責略微繁復一點,區分下圖所示的目標:

照舊挺容易的。你能猜出第一種和第二種情況之間有什么區別嗎?第一對圖像有很多信息,好比物體的外形,顏色,邊沿,背景等。

另一方面,第二對信息少得多(僅有外形和邊沿),但它仍舊足以區分這兩個圖像。

你曉得我想說什么嗎?在第二種情況下,我們照舊很容易區分目標,由于它具有識別目標所需的必要信息。這正是特性形貌子的作用:

它是圖像的簡化表現,僅包含有關圖像的最緊張信息。

以下是一些最受接待的的特性形貌子。

  • HOG:朝向梯度直方圖
  • SIFT:標準安定的特性變動
  • SURF:增速妥當特性

在本文中,我們將重點眷注HOG特性形貌子及其事情原理。讓我們開頭吧!

HOG特性形貌子簡介

HOG(Histogram of Oriented Gradients)是一種特性形貌子,通常用于從圖像數據中提取特性。它廣泛用于盤算機視覺職責的物體檢測。

讓我們看一下HOG的一些緊張方面,它們與其他特性形貌子不同:

  • HOG形貌符眷注目標的布局或外形。如今你約莫會問,這和我們為圖像提取的邊沿特性有什么不同?在邊沿特性的情況下,我們只識別像素對否是邊沿。HOG還可以提供邊沿朝向。這是經過提取邊沿的梯度和朝向(大概你可以說輕重和朝向)來完成的
  • 別的,這些朝向是在“局部”舉行局部盤算的。這意味著整個圖像被支解成更小的地區,關于每個地區,盤算梯度和朝向。我們將在接下去的末節中更具體地討論這個成績
  • 最初,HOG將分散為這些地區天生一個直方圖。直方圖是使用像素值的梯度和朝向創建的,因此得名“朝向梯度直方圖”。

給一個正式界說:

HOG特性形貌子盤算圖像局部地區中梯度朝向的顯現次數。

使用OpenCV等東西完成HOG十分簡便。這只是幾行代碼,由于我們在skimage.feature庫中有一個名為hog的預界說函數。但是,我們在本文中的重點是怎樣實踐盤算這些特性。

盤算朝向梯度直方圖(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朝向的厘革($G_x$)= 89-78 = 11
  • Y朝向的厘革($G_y$)= 68-56 = 8

這個歷程將給我們兩個新的矩陣,一個在x朝向上存儲梯度,另一個在y朝向上存儲梯度。這相似于使用輕重為1的Sobel內核。當產生劇烈厘革時(比如在邊沿四周),幅值(magnitude)會更高。

我們分散盤算了x和y朝向的梯度。對圖像中的一切像素反復相反的歷程。下一步是使用這些值找到幅值和朝向。

第三步:盤算幅值和朝向

使用我們在最初一步中盤算的梯度,我們如今將確定每個像素值的輕重和朝向。關于這一步,我們將使用勾股定理(是的,與你在學校學習的誰人相反!)。

看看底下的圖片:

在之前的例子中,Gx和Gy分散是11和8。使用勾股定理盤算總梯度輕重:

  • 總梯度幅值=√[(G_x)^2 +(G_y)^2]
  • 總梯度幅值=√[(11)^2 +(8)^2]= 13.6

接下去,盤算相反像素的朝向。我們曉得我們可以把角度寫成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特性,并驗證我們對否在最初取得相反數目標特性。

在Python中完成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)

在持續之前,讓我先先容一下這些超參數代表什么。大概,你可以在此處查察官方文檔中的界說。

  • orientations是我們要創建桶的數目。由于我想要一個9 x 1矩陣,我將orientations設置為9
  • pixelspercell界說我們為其創建直方圖的單位格的輕重。在我們在本文中先容的示例中,我們使用了8 x 8個單位格,在這里我將設置相反的值。如前所述,你可以選擇變動此值
  • 我們有另一個超參數cellperblock,它是我們對直方圖舉行標準化的塊的輕重。這個參數是每個塊的單位格數目而不是像素的數目。因此,我們將使用2 x 2而不是16 x 16

函數的特性矩陣存儲在變量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特性,并查察模子功能對否有所改良。

版權聲明:本文來自互聯網整理發布,如有侵權,聯系刪除

原文鏈接:http://www.freetextsend.comhttp://www.freetextsend.com/qingganjiaoliu/46542.html


Copyright ? 2021-2022 All Rights Reserved 備案編號:閩ICP備2023009674號 網站地圖 聯系:dhh0407@outlook.com

www.成人网