HOG-定向梯度直方圖(汽車標識識別)

方向梯度直方圖(簡稱HOG)是主要用於計算機視覺和機器學習以進行物體檢測的描述符。但是,我們也可以使用HOG描述符來量化和表示

形狀紋理

HOG特徵首先由Dalal和Triggs在其CVPR 2005論文“人體檢測的方向梯度直方圖”中引入。在他們的工作中,Dalal和Triggs提出了HOG和一個5階描述符來對靜止圖像中的人進行分類。

這5個階段包括:

  1. 在描述之前歸一化圖像。
  2. 計算xy 方向的梯度 。
  3. 獲得單元格在空間和方向權重。
  4. 對歸一化的重疊空間進行比較。
  5. 收集所有定向梯度直方圖以形成最終特徵向量。

HOG描述符的最重要參數是 方向 - orientations , pixels_per_cell 和 cells_per_block 。這三個參數(連同輸入圖像的大小)有效地控制了所得特徵向量的維數。我們將在本文後面回顧這些參數及其含義。

在大多數實際應用中,HOG與線性SVM結合使用以執行目標檢測。HOG被如此大量利用的原因是因為可以使用局部強度梯度的分佈來表徵局部物體外觀和形狀。實際上,這些是我們在

Gradients課程中學到的完全類似的圖像梯度,但是現在我們將採用這些圖像梯度並將它們轉換為強大的圖像描述符。

我們將在本課程後面討論將HOG和線性SVM組合成對象分類器所需的步驟。但是現在才明白HOG主要用作對象檢測的描述符,後來這些描述符可以被輸入到機器學習分類器中。

HOG在OpenCV和scikit-image中實現。OpenCV實現不如scikit-image實現靈活,因此我們將主要在本課程的其餘部分中使用scikit-image實現。

目標:

在本課中,我們將詳細討論HOG描述子。

什麼是用於描述的HOG描述子?

HOG描述符主要用於描述圖像中對象的結構形狀和外觀,使其成為對象分類的優秀描述子。由於HOG可以捕獲局部強度梯度和邊緣方向,因此它也是獲取良好紋理的描述子。

HOG描述子返回實值特徵向量。該特徵向量的維度取決於為上述方向,可選參數有:pixels_per_cell 和 cells_per_block。

HOG描述子如何工作?

HOG描述子算法的基石是可以通過圖像的矩形區域內的強度梯度的分佈來構建對象的外觀:

HOG-定向梯度直方圖(汽車標識識別)

圖1: 計算圖像的特定區域的定向梯度的直方圖的示例


實現該描述子需要將圖像劃分為稱為單元的小連接區域,然後對於每個單元,計算每個單元內的像素的定向梯度的直方圖。然後我們可以在多個單元格中累積這些直方圖以形成我們的特徵向量。

Dalal和Triggs還證明我們可以執行 塊規範化 以提高性能。為了執行塊歸一化,我們採用重疊單元組,連接它們的直方圖,計算標準化值,然後對比度標準化直方圖。通過對多個重疊塊進行歸一化,得到的描述符對於照明和陰影的變化更加穩健。此外,執行這種類型的歸一化意味著每個單元將在最終特徵向量中多次表示,但由稍微不同的相鄰單元組進行歸一化。

現在,讓我們回顧一下計算HOG描述符的每個步驟。

步驟1:在描述之前標準化圖像。

此規範化步驟完全是可選的,但在某些情況下,此步驟可以提高HOG描述符的性能。我們可以考慮三種主要的規範化方法:

  • 伽馬/冪定律歸一化: 在這種情況下,我們取輸入圖像中log(p)的每個像素p。然而,正如Dalal和Triggs所證明的那樣,這種方法可能導致“過度修正”並且會傷害性能。
  • 平方根歸一化:這裡,我們取輸入圖像中√(p) 的每個像素p。根據定義,平方根歸一化壓縮輸入像素強度遠小於伽馬歸一化。而且,正如Dalal和Triggs所證明的那樣,平方根歸一化實際上提高了準確性而不會降低性能。
  • 方差歸一化:稍微不太常用的歸一化形式是方差歸一化。在這裡,我們計算輸入圖像的均值 μ 和標準差 σ 。通過從像素強度中減去平均值,所有像素以均值為中心,然後通過除以標準偏差歸一化:p' = ( p
    - μ ) / σ 。Dalal和Triggs沒有報告方差歸一化的準確性; 然而,這是我喜歡錶現的一種規範化形式,並認為值得嘗試。

在大多數情況下,最好從沒有規範化或平方根規範化開始。方差歸一化也值得考慮,但在大多數情況下,它將以與平方根歸一化類似的方式執行。

第2步:梯度計算

HOG描述子中的第一個實際步驟是計算xy 方向上的圖像梯度 。這些計算看似熟悉,因為我們已經在Gradients課程中對它們進行了驗證。我們將應用卷積運算來獲得梯度圖像:

Gx = I * Dx Gy = I * Dy I 輸入圖像在哪裡,DX

x 方向, Dy 的濾波器,是 y 方向的濾波器。下面是計算 輸入圖像的 xy 梯度的示例:

HOG-定向梯度直方圖(汽車標識識別)

圖2:分別 計算沿X和Y軸的梯度幅度表示。


現在我們有了漸變圖像,我們可以計算圖像的最終梯度幅度表示:

HOG-定向梯度直方圖(汽車標識識別)

我們可以在下面看到:

HOG-定向梯度直方圖(汽車標識識別)

圖3: 獲取最終的梯度幅度圖像。


最後,輸入圖像中每個像素的漸變方向可以通過以下方式計算:

HOG-定向梯度直方圖(汽車標識識別)

給定兩者|G| 和 θ,我們現在可以計算定向梯度的直方圖,其中直方圖基於

θ 和給定的添加到直方圖的貢獻權重基於 |G|。

第3步:每個單元格中的加權投票

現在我們有了梯度幅度和方向表示,我們需要將圖像分成單元格和塊。

“單元”是由屬於每個單元的像素數定義的矩形區域。例如,如果我們有一個 128 x 128的 圖像並將pixel_per_cell定義 為 4 x 4,那麼我們將有 32 x 32 = 1024個 單元格:

HOG-定向梯度直方圖(汽車標識識別)

圖4: 定義4 X 4像素單元產生32 X 32 = 1024個總單元。

如果我們將pixels_per_cell定義 為 32 x 32, 我們將有 4 x 4 = 16個 總單元格:

HOG-定向梯度直方圖(汽車標識識別)

圖5: 定義32 X 32像素單元產生4 X 4 = 16個總單元。

如果我們將pixels_per_cell定義為 128 x 128,那麼我們只有 1個

總單元格:

HOG-定向梯度直方圖(汽車標識識別)

圖6: 為128 X 128像素圖像定義128 X 128像素單元,產生1 X 1 = 1個總單元

顯然,這是一個誇張的例子; 我們可能永遠不會對1 x 1 單元格表示感興趣 。相反,這演示了我們如何根據每個單元的像素數將圖像劃分為單元格。

現在,對於圖像中的每個單元,我們需要使用上面提到的梯度幅度 |

G| 和方向來構建定向梯度的直方圖 θ。但在構建此直方圖之前,我們需要定義orientations 數量。orientations數量決定了直​​方圖中的區間數。漸變角度在 [0,180](無符號)或 [0,360](帶符號)範圍內。在一般情況下,最好使用unsigned梯度 [0,180] 並選擇[9,12] 範圍的orientations數量。但根據您的應用,使用無符號漸變的相較於有符號漸變可以提高精度。最後,每個像素對直方圖貢獻一定的權重 - |G|即給定像素處的梯度大小。

讓我們通過查看分成16 x 16 像素單元格的示例圖像來更清楚地說明這一點 :

HOG-定向梯度直方圖(汽車標識識別)

圖7: 首先,讓我們將圖像分成16 X 16像素單元。

然後對於每個細胞單元,我們將使用 每個直方圖的9個方向(或區間)計算定向梯度的 直方圖:

HOG-定向梯度直方圖(汽車標識識別)

圖8: 使用方向作為區間的梯度直方圖的示例。我們將為16 X 16像素單元中的每一個構建這樣的直方圖

這是一個更具啟發性的動畫,我們可以直觀地看到為每個單元格計算的不同直方圖:

HOG-定向梯度直方圖(汽車標識識別)

圖9: 計算圖像中每個單元的定向梯度的直方圖。

此時,我們可以收集並連接這些直方圖中的每一個以形成我們的最終特徵向量。但是,應用塊歸一化是有益的,我們將在下一節中進行討論。

第4步:對比塊的對比度歸一化

為了解釋光照和對比度的變化,我們可以在

local歸一化梯度值 。這需要將“單元”組合成更大的連接“block”。這些塊通常是 重疊的,這意味著每個單元不止一次地對最終特徵向量做出貢獻。

同樣,塊的數量是矩形的; 但是,我們的單位不再是像素 - 它們就是細胞單元!Dalal和Triggs報告說,在大多數情況下,使用 2 x 23 x 3 cells_per_block可以獲得合理的準確度。

下面是我們拍攝圖像的輸入區域,為每個單元格計算梯度直方圖,然後將單元格局部分組為重疊塊的示例 :

HOG-定向梯度直方圖(汽車標識識別)

圖10: 在多個重疊細胞上進行對比度歸一化。使用該方案,每個單元在直方圖中多次表示; 但是,這種冗

對於當前塊中的每個單元,我們連接它們相應的梯度直方圖,然後是L1或L2歸一化整個連接的特徵向量。同樣,執行這種類型的歸一化意味著每個單元將在最終特徵向量中多次表示,但通過不同的值進行歸一化。雖然這種多表示是多餘的並且浪費空間,但它實際上提高了描述子的性能。

最後,在對所有塊進行歸一化後,我們將得到的直方圖,連接它們,並將它們視為我們的最終特徵向量。

HOG描述子在哪裡實現?

HOG描述子在OpenCV和scikit-image庫中實現。但是,OpenCV實現不是很靈活,主要面向Dalal和Triggs實現。scikit-image實現更加靈活,因此我們將主要使用整個課程中的scikit-image實現。

我如何使用HOG描述子?

以下是如何使用scikit-image計算HOG描述符的示例:

Extracting HOG Features

Python

from skimage import feature
H = feature.hog(logo, orientations=9, pixels_per_cell=(8, 8),
\tcells_per_block=(2, 2), transform_sqrt=True, block_norm="L1")

我們還可以看到生成的HOG圖像:

Visualizing HOG features

Python

from skimage import exposure
from skimage import feature
import cv2

(H, hogImage) = feature.hog(logo, orientations=9, pixels_per_cell=(8, 8),
\tcells_per_block=(2, 2), transform_sqrt=True, block_norm="L1",
\tvisualize=True)
hogImage = exposure.rescale_intensity(hogImage, out_range=(0, 255))
hogImage = hogImage.astype("uint8")

cv2.imshow("HOG Image", hogImage)

(2017-11-28)skimage的更新 在 scikit - image == 0.12中 , normalize 參數已更新為 transform_sqrt 。該 transform_sqrt 執行完全一樣的操作,只是用不同的名稱。如果您使用的是較舊版本的 scikit - image(同樣,在v0.12版本之前),那麼您需要將transform_sqrt更改為 normalize 。在 scikit - image == 0.15 中,block_norm =“L1”的默認值 已被棄用並更改為 block_norm = “L2-Hys” 。因此,對於本課,我們將明確指定 block_norm = “L1” 。這樣做可以避免在 我們不知道的情況下使用版本更新切換到 “L2-Hys”(並且會產生錯誤的汽車徽標識別結果)。您可以 在此處閱讀有關L1和L2規範的內容。

(2019年1月6日)更新skimage: 該 visualise 參數已被棄用,變為 visualize 。

HOG-定向梯度直方圖(汽車標識識別)

圖11: 可視化HOG描述符。它不是HOG特徵向量的完美表示,但它可以讓您深入瞭解參數選擇所產生的

使用HOG描述子識別汽車徽標

在本課程的剩餘部分中,我將演示如何使用“直方圖梯度”描述子來描述汽車品牌的徽標。就像在 Haralick紋理 課程中一樣,我們將利用一些機器學習來幫助我們進行分類(這在識別非常規的形狀和對象時非常常見)。

同樣,我將不會深入研究我們將在本課中使用的(非常少量的)機器學習 - 我們有完整的 圖像分類 模塊。如果在本課程結束時有幾行代碼感覺有點像“黑盒魔術”給你,那沒關係,並且可以預料到。請記住,這些圖像描述課程的重點是快速演示如何在自己的應用程序中使用它們。但在深入研究這個項目之前,讓我們看一下我們的數據集。

數據集

我們的汽車標識數據集包括五個品牌的車輛: 奧迪福特本田斯巴魯

大眾

對於這些品牌中的每一個,我都 從Google 收集了五張 培訓圖片。這些圖像是 我們將用於教授我們的機器學習算法的 示例圖像,每個汽車徽標都是這樣的。我們的培訓數據集如下所示:

HOG-定向梯度直方圖(汽車標識識別)

圖11: 我們的汽車品牌標識培訓數據集,涵蓋5個品牌,每個品牌有5個圖像。

在收集了谷歌的圖像後,我走出去,在當地的停車場漫步,拍下七張汽車標識照片。這些徽標將作為我們的 測試集 ,我們可以用它來評估分類器的性能。七個測試圖像顯示如下:

HOG-定向梯度直方圖(汽車標識識別)

圖12: 在真實條件下捕獲的7個汽車徽標的測試數據集。

我們的目標

該項目的目標是:

  1. 從我們的訓練集中提取HOG功能,以表徵和量化每個汽車徽標。
  2. 訓練機器學習分類器以區分每個汽車標誌。
  3. 應用分類器來識別新的,看不見的汽車標識。

識別汽車標識

好吧,說夠了。讓我們開始編寫這個例子。打開一個新文件,將其命名為 recogn_car_logos 。py ,讓我們得到編碼:

recognize_car_logos.py

Python

# import the necessary packages
from sklearn.neighbors import KNeighborsClassifier
from skimage import exposure
from skimage import feature
from imutils import paths
import argparse
import imutils
import cv2

# construct the argument parse and parse command line arguments
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--training", required=True, help="Path to the logos training dataset")
ap.add_argument("-t", "--test", required=True, help="Path to the test dataset")
args = vars(ap.parse_args())

# initialize the data matrix and labels
print("[INFO] extracting features...")

data = []
labels = []

此代碼看起來應該與Haralick紋理示例中的代碼非常相似 。解析我們的命令行參數,我們可以看到我們需要兩個開關。第一個是 - 培訓 ,這是示例汽車徽標駐留在磁盤上的路徑。第二個開關是 - test ,我們將用於評估我們的汽車徽標分類器的測試圖像目錄的路徑。我們還將初始化 數據 和 標籤 ,兩個列表分別包含我們訓練集中每個圖像的HOG功能和汽車品牌名稱。讓我們繼續從我們的訓練集中提取HOG功能:

recognize_car_logos.py

Python

# loop over the image paths in the training set
for imagePath in paths.list_images(args["training"]):
\t# extract the make of the car
\tmake = imagePath.split("/")[-2]

\t# load the image, convert it to grayscale, and detect edges
\timage = cv2.imread(imagePath)
\tgray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
\tedged = imutils.auto_canny(gray)

\t# find contours in the edge map, keeping only the largest one which
\t# is presmumed to be the car logo
\tcnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
\t\tcv2.CHAIN_APPROX_SIMPLE)
\tcnts = imutils.grab_contours(cnts)
\tc = max(cnts, key=cv2.contourArea)

\t# extract the logo of the car and resize it to a canonical width
\t# and height
\t(x, y, w, h) = cv2.boundingRect(c)
\tlogo = gray[y:y + h, x:x + w]
\tlogo = cv2.resize(logo, (200, 100))


\t# extract Histogram of Oriented Gradients from the logo
\tH = feature.hog(logo, orientations=9, pixels_per_cell=(10, 10),
\t\tcells_per_block=(2, 2), transform_sqrt=True, block_norm="L1")

\t# update the data and labels
\tdata.append(H)
\tlabels.append(make)

第22行,我們開始循環遍歷培訓目錄中的每個圖像路徑。示例圖像路徑如下所示: car_logos / audi / audi_01 .png

使用此圖像路徑,我們可以通過拆分路徑並提取第二個子目錄名稱(在本例中為 audi)來提取第24行 的汽車品牌 。

從那裡,我們將執行一些預處理並準備使用直方圖梯度描述符描述的汽車徽標。我們需要做的就是從磁盤加載圖像,將其轉換為灰度,然後使用我們方便的 auto_canny 函數來檢測品牌徽標中的邊緣:

HOG-定向梯度直方圖(汽車標識識別)

圖13: 可視化AUTO_CANNY函數檢測到的汽車徽標邊緣。

請注意我們如何能夠找到汽車標誌的輪廓。

無論何時我們 檢測到輪廓,您都可以確保下一步(幾乎總是) 找到輪廓的輪廓。實際上,這正是 第33-36行 所做的 - 提取邊緣圖中最大的輪廓,假設是汽車標識的輪廓。

然後,第40和41行採用最大輪廓區域,計算邊界框,並提取ROI。

一定要注意 第42行 因為它 非常重要。正如我在本課程前面提到的,對於您的圖像具有不同的寬度和高度可以導致不同大小的 HOG特徵向量 - 在幾乎所有情況下,這不是您想要的預期行為!

可以這樣想:讓我們假設我從圖像A中提取了大小為1,024-d的HOG特徵向量。然後我從圖像B中提取了一個具有不同維度的HOG特徵向量(使用完全相同的HOG參數)(即寬度和高度)比圖像A,留給我一個512-d大小的特徵向量。

我將如何比較這兩個特徵向量?

簡短的回答是,你做不到。

請記住,我們提取的特徵向量應該用於表徵和表示圖像的可視內容。如果我們的特徵向量不是相同的維度,則無法比較它們的相似性。如果我們無法比較我們的特徵向量的相似性,我們無法比較我們的兩個圖像!

因此,在從圖像數據集中提取HOG要素時,您需要定義 規範的已知大小 ,以便將每個圖像調整大小。在許多情況下,這意味著您將丟棄圖像的縱橫比。通常,應該避免破壞圖像的縱橫比 - 但是在這種情況下我們很樂意這樣做,因為它確保(1)我們的數據集中的每個圖像以一致的方式描述,以及(2)每個特徵向量具有相同的維度。當我們到達

自定義對象檢測器模塊時,我們將更多地討論這一點 。

無論如何,既然我們的標誌被調整至一已知的,預先定義的 200×100 個像素,我們就可以利用應用HOG描述符 取向=9 , pixels_per_cell = (10 ,10 ) , cells_per_block = (2 ,2 ) ,和方 - 根規範化。這些參數是通過實驗和檢查分類器的準確性獲得的 - 無論何時使用HOG描述符,您都應該期望這樣做。運行實驗並根據這些參數調整HOG參數是獲得精確分類器的關鍵組成部分。

最後,給定HOG特徵向量,然後我們 分別用特徵向量和car make 更新我們的 數據 矩陣和 標籤列表。

根據我們的數據和標籤,我們現在可以訓練我們的分類器:

recognize_car_logos.py

Python

# "train" the nearest neighbors classifier
print("[INFO] training classifier...")
model = KNeighborsClassifier(n_neighbors=1)
model.fit(data, labels)
print("[INFO] evaluating...")

為了識別和區分我們的五個汽車品牌之間的差異,我們將使用scikit- learnns KNeighborsClassifier。

k-最近鄰分類器是一種“懶惰學習”算法,其中實際上沒有“學習”。相反,k-最近鄰(k-NN)訓練階段只接受一組特徵向量和標籤並存儲它們 - 就是這樣!然後,當需要對新特徵向量進行分類時,它接受特徵向量,計算到所有存儲的特徵向量的距離(通常使用歐幾里德距離,但可以使用任何距離度量或相似度量),按距離對它們進行排序,並將前

k個 “鄰居” 返回 到輸入要素向量。從那裡,k個 鄰居中的每一個都 投票決定他們認為分類的標籤是什麼。您可以在本課中閱讀有關k-NN算法的更多信息 。

在我們的例子中,我們只是將HOG特徵向量和標籤傳遞給我們的k-NN算法,並要求它使用k = 1個 鄰居向我們的查詢要素報告最接近的徽標 。

讓我們看看我們如何使用我們的k-NN分類器識別各種汽車標識:

recognize_car_logos.py

Python

# loop over the test dataset
for (i, imagePath) in enumerate(paths.list_images(args["test"])):
\t# load the test image, convert it to grayscale, and resize it to
\t# the canonical size
\timage = cv2.imread(imagePath)
\tgray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
\tlogo = cv2.resize(gray, (200, 100))

\t# extract Histogram of Oriented Gradients from the test image and
\t# predict the make of the car
\t(H, hogImage) = feature.hog(logo, orientations=9, pixels_per_cell=(10, 10),
\t\tcells_per_block=(2, 2), transform_sqrt=True, block_norm="L1", visualize=True)
\tpred = model.predict(H.reshape(1, -1))[0]

\t# visualize the HOG image
\thogImage = exposure.rescale_intensity(hogImage, out_range=(0, 255))
\thogImage = hogImage.astype("uint8")
\tcv2.imshow("HOG Image #{}".format(i + 1), hogImage)

\t# draw the prediction on the test image and display it
\tcv2.putText(image, pred.title(), (10, 35), cv2.FONT_HERSHEY_SIMPLEX, 1.0,
\t\t(0, 255, 0), 3)
\tcv2.imshow("Test Image #{}".format(i + 1), image)
\tcv2.waitKey(0)

第59行 開始循環遍佈測試集中的圖像。對於每個圖像,我們將從磁盤加載它; 將其轉換為灰度; 將其調整為已知的固定大小; 然後以與我們在訓練階段完成相同的方式從中提取HOG特徵向量(第62-69行)。

第70行 然後調用我們的k-NN分類器,傳遞我們的HOG特徵向量用於當前測試圖像並詢問分類器它認為徽標是什麼。

我們還可以 在73-75行可視化我們的直方圖梯度圖像 。這在調試HOG參數時尤其有用,以確保我們的圖像內容得到充分量化。以下是我們測試汽車標識的HOG圖像的一些示例:

HOG-定向梯度直方圖(汽車標識識別)

圖14: 可視化的HOG圖像樣本。你能說出哪個徽標只基於可視化的HOG圖像嗎?仔細看。我打賭你可以

注意HOG圖像總是 200 x 100 像素,這是我們調整大小的測試圖像的尺寸。我們還可以看到pixel_per_cell 和 orientationations 參數如何在 這裡發揮作用,以及每個單元的主導方向,其中單元的大小由pixels_per_cell定義 。pixel_per_cell中的像素 越多,我們的表示就越粗糙。並且類似地,較小的pixels_per_cell值 將產生更細粒度的表示。可視化HOG圖像是“查看”HOG描述符和參數集描述的內容的絕佳方式。

最後,我們採用分類結果,將其繪製在我們的測試圖像上,並將其顯示在78-81行的屏幕上 。

要試一下我們的汽車徽標分類器,只需打開終端並執行以下命令:

recognize_car_logos.py

shell

$ python recognize_car_logos.py --training car_logos --test test_images

在下面你會看到我們的輸出分類:

HOG-定向梯度直方圖(汽車標識識別)

圖15: 僅基於HOG功能對汽車品牌進行分類對於您的K-NN分類器而言是一項簡單的任務,因為HOG

在每種情況下,我們都能夠使用HOG功能正確地對汽車品牌進行分類!

當然,這種方法只能起作用,因為我們的車標很緊。如果我們描述 了汽車的 整體形象,我們就不太可能正確地對品牌進行分類。但同樣,當我們進入自定義對象檢測器 模塊時,我們可以解決這個問題 ,特別是 滑動窗口和圖像金字塔

與此同時,這個例子仍然能夠演示如何使用Oriented Gradients描述符直方圖和k-NN分類器來識別汽車的標識。這裡的關鍵點是,如果您可以一致地檢測並提取圖像數據集的ROI,那麼HOG描述符肯定應該在您要應用的圖像描述符列表中,因為它非常強大並且能夠獲得良好的結果,尤其是在應用於與機器學習相結合。

使用HOG描述符時的建議:

HOG描述符非常強大; 但是,為方向數 , pixels_per_cell 和 cells_per_block選擇正確的參數可能會很繁瑣 ,尤其是在您開始使用對象分類時。

為起點,我傾向於使用 取向= 9 , pixels_per_cell = (4 ,4 ) ,和 cells_per_block = (2 ,2 ) ,然後再從那裡。您的第一組參數不太可能產生最佳性能; 但是,重要的是從某處開始並獲得基線 - 可以通過參數調整來改善結果。

將圖像大小調整到合理的大小也很重要。如果輸入區域為32 x 32 像素,則生成的維度為1,764-d。但是如果您的輸入區域是 128 x 128 像素並且您再次使用上述參數,則您的特徵向量將為34,596-d!通過使用大圖像區域而不關注HOG參數,最終可以得到極大的特徵向量。

我們將在本課程後期使用HOG描述符進行對象分類,所以如果你對如何正確調整參數有點困惑,請不要擔心 - 這不是你最後一次看到這些描述符!

HOG優點和缺點

優點:

  • 很強大的描述符。
  • 非常出色的代表當地外觀。
  • 非常適用於表示沒有表現出形式上的實質性變化的結構物體(即建築物,走在街上的人,靠在牆上的自行車)。
  • 對象分類非常準確。

缺點:

  • 可能導致非常大的特徵向量,導致大的存儲成本和計算上昂貴的特徵向量比較。
  • 調整方向 , pixel_per_cell 和 cells_per_block 參數通常非常重要 。
  • 不是最慢的計算描述符,但也不是最快的。
  • 如果要描述的對象表現出實質的結構變化(即,對象的旋轉/方向始終不同),那麼HOG的標準香草實現將不會很好地執行。

(原文地址:https://gurus.pyimagesearch.com/lesson-sample-histogram-of-oriented-gradients-and-car-logo-recognition/#)


分享到:


相關文章: