Datawhale 計算機視覺基礎-圖像處理(下)-Task04 HOG特征描述算子-行人檢測

1效斑、HOG特征

方向梯度直方圖(Histogram of Oriented Grandient,HOG)特征是一種在計算機視覺和圖像處理中用來進行物體檢測的特征描述子泵三。它通過計算和統(tǒng)計圖像局部區(qū)域的梯度方向直方圖來構建特征喘帚。HOG特征結合SVM分類器已經(jīng)廣泛應用于圖像識別中矾踱,尤其在行人檢測中獲得了極大的成功户辱。
HOG特征是一種圖像局部特征鸵钝,其基本思路是對圖像局部的梯度幅值和方向進行投票統(tǒng)計,形成基于梯度特性的直方圖庐镐,然后將局部特征拼接起來作為總特征恩商。局部特征在這里指的是將圖像劃分為多個子塊(Block),每個Block內(nèi)的特征進行聯(lián)合以形成最終的特征必逆。
HOG+SVM的工作流程如下:


image.png

首先對輸入的圖片進行預處理怠堪,然后計算像素點的梯度特性韧献,包括梯度幅值和梯度方向。然后投票統(tǒng)計形成梯度直方圖研叫,然后對Blocks進行normalize锤窑,最后收集到HOG feature(其實是一行多維的vector)放到SVM里進行監(jiān)督學習,從而實現(xiàn)行人的檢測嚷炉。

2渊啰、HOG特征提取算法的實現(xiàn)過程

HOG特征提取方法就是將一個image(你要檢測的目標或者掃描窗口):
1)灰度化(將圖像看做一個x,y,z(灰度)的三維圖像);
2)采用Gamma校正法對輸入圖像進行顏色空間的標準化(歸一化)申屹;目的是調(diào)節(jié)圖像的對比度绘证,降低圖像局部的陰影和光照變化所造成的影響,同時可以抑制噪聲的干擾哗讥;
3)計算圖像每個像素的梯度(包括大小和方向)嚷那;主要是為了捕獲輪廓信息,同時進一步弱化光照的干擾杆煞。
4)將圖像劃分成小cells(例如66像素/cell)
5)統(tǒng)計每個cell的梯度直方圖(不同梯度的個數(shù))魏宽,即可形成每個cell的descripto;
6)將每幾個cell組成一個block(例如3
3個cell/block)决乎,一個block內(nèi)所有cell的特征descriptor串聯(lián)起來便得到該block的HOG特征descriptor队询。
7)將圖像image內(nèi)的所有block的HOG特征descriptor串聯(lián)起來就可以得到該image(你要檢測的目標)的HOG特征descriptor了。這個就是最終的可供分類使用的特征向量了构诚。

image.png

具體每一步的詳細過程如下:
1)標準化gamma空間和顏色空間
為了減少光照因素的影響蚌斩,首先需要將整個圖像進行規(guī)范化(歸一化)。在圖像 的紋理強度中范嘱,局部的表層曝光貢獻的比重較大送膳,所以狠鸳,這種壓縮處理能夠有效地降低圖像局部的陰影和光照變化椒拗。因為顏色信息作用不大腹泌,通常先轉(zhuǎn)化為灰度圖慎框;
Gamma壓縮公式:
image.png

比如可以去Gamma=1/2涡扼;
2)計算圖像梯度
計算圖像橫坐標和縱坐標方向的梯度摘投,并據(jù)此計算每個像素位置的梯度方向值妄帘;求導操作不僅能夠捕獲輪廓唆鸡,人影和一些紋理信息名斟,還能進一步弱化光照的影響脑慧。
圖像中像素點(x,y)的梯度為:
image.png

最常用的方法是:首先用[-1,0,1]梯度算子對原圖像做卷積運算,得到x方向(水平方向砰盐,以向右為正方向)的梯度分量gradscalx闷袒,然后用[1,0,-1]的轉(zhuǎn)置梯度算子對原圖像做卷積運算,得到y(tǒng)方向(豎直方向岩梳,以向上為正方向)的梯度分量gradscaly囊骤。然后再用以上公式計算該像素點的梯度大小和方向晃择。

為了得到梯度直方圖,那么首先需要計算圖像水平方向和垂直方向梯度也物。
一般使用特定的卷積核對圖像濾波實現(xiàn)宫屠,可選用的卷積模板有:soble算子,Prewitt算子滑蚯,Roberts算子模板等等浪蹂。
一般采用sobel算子,opencv也是如此告材,利用sobel水平和垂直算子與輸入圖像卷積計算dx坤次,dy:


image.png

image.png
image.png

image.png

進一步可以得到圖像梯度的幅值:


image.png

為了簡化計算,幅值也可以作如下近似:


image.png

角度為:
image.png

這里需要注意的是:梯度方向和圖像邊緣方向是相互正交的斥赋。


image.png

3)為每個細胞單元構建梯度方向直方圖
第三步的目的是為局部圖像區(qū)域提供一個編碼缰猴,同時能夠保持對圖像中人體對象的姿態(tài)和外觀的弱敏感性。
我們將圖像分成若干個“單元格cell”疤剑,例如每個cell為66個像素滑绒。假設我們采用9個bin的直方圖來統(tǒng)計這66個像素的梯度信息。也就是將cell的梯度方向360度分成9個方向塊骚露,如圖所示:例如:如果這個像素的梯度方向是20-40度蹬挤,直方圖第2個bin的計數(shù)就加一,這樣棘幸,對cell內(nèi)每個像素用梯度方向在直方圖中進行加權投影(映射到固定的角度范圍),就可以得到這個cell的梯度方向直方圖了倦零,就是該cell對應的9維特征向量(因為有9個bin)误续。

像素梯度方向用到了,那么梯度大小呢扫茅?梯度大小就是作為投影的權值的蹋嵌。例如說:這個像素的梯度方向是20-40度,然后它的梯度大小是2(假設昂丁)栽烂,那么直方圖第2個bin的計數(shù)就不是加一了,而是加二(假設傲到拧)腺办。


image.png

細胞單元可以是矩形(rectangular),也可以是星形的(radial)
4)把細胞單元組合成大的塊(block)糟描,塊內(nèi)歸一化梯度直方圖
由于局部光照的變化以及前景-背景對比度的變化怀喉,使得梯度強度的變化范圍非常大。這就需要對梯度強度做歸一化船响。歸一化能夠進一步地對光照躬拢、陰影和邊緣進行壓縮躲履。

作者采取的辦法是:把各個細胞單元組合成大的、空間上連通的區(qū)間(blocks)聊闯。這樣工猜,一個block內(nèi)所有cell的特征向量串聯(lián)起來便得到該block的HOG特征。這些區(qū)間是互有重疊的菱蔬,這就意味著:每一個單元格的特征會以不同的結果多次出現(xiàn)在最后的特征向量中篷帅。我們將歸一化之后的塊描述符(向量)就稱之為HOG描述符。


image.png

區(qū)間有兩個主要的幾何形狀——矩形區(qū)間(R-HOG)和環(huán)形區(qū)間(C-HOG)汗销。R-HOG區(qū)間大體上是一些方形的格子犹褒,它可以有三個參數(shù)來表征:每個區(qū)間中細胞單元的數(shù)目、每個細胞單元中像素點的數(shù)目弛针、每個細胞的直方圖通道數(shù)目叠骑。

例如:行人檢測的最佳參數(shù)設置是:3×3細胞/區(qū)間、6×6像素/細胞削茁、9個直方圖通道宙枷。則一塊的特征數(shù)為:339;
5)收集HOG特征
最后一步就是將檢測窗口中所有重疊的塊進行HOG特征的收集茧跋,并將它們結合成最終的特征向量供分類使用慰丛。
6)那么一個圖像的HOG特征維數(shù)是多少呢?
順便做個總結:Dalal提出的Hog特征提取的過程:把樣本圖像分割為若干個像素的單元(cell)瘾杭,把梯度方向平均劃分為9個區(qū)間(bin)诅病,在每個單元里面對所有像素的梯度方向在各個方向區(qū)間進行直方圖統(tǒng)計,得到一個9維的特征向量粥烁,每相鄰的4個單元構成一個塊(block)贤笆,把一個塊內(nèi)的特征向量聯(lián)起來得到36維的特征向量,用塊對樣本圖像進行掃描讨阻,掃描步長為一個單元芥永。最后將所有塊的特征串聯(lián)起來,就得到了人體的特征钝吮。例如埋涧,對于64128的圖像而言,每1616的像素組成一個cell奇瘦,每22個cell組成一個塊棘催,因為每個cell有9個特征,所以每個塊內(nèi)有49=36個特征链患,以8個像素為步長巧鸭,那么,水平方向?qū)⒂?個掃描窗口麻捻,垂直方向?qū)⒂?5個掃描窗口纲仍。也就是說呀袱,64128的圖片,總共有367*15=3780個特征郑叠。

image.png

3夜赵、基于opencv的行人檢測代碼實現(xiàn)

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    src = cv.imread("*.jpg")
    cv.imshow("input", src)

    hog = cv.HOGDescriptor()
    hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
    # Detect people in the image
    (rects, weights) = hog.detectMultiScale(src,
                                        winStride=(2,4),
                                        padding=(8, 8),
                                        scale=1.2,
                                        useMeanshiftGrouping=False)
    for (x, y, w, h) in rects:
        cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv.imshow("hog-detector", src)
    cv.imwrite("hog-detector.jpg",src)
    cv.waitKey(0)
    cv.destroyAllWindows()

原圖顯示如下:


image.png

結果顯示如下:


image.png

可視化代碼:
from skimage import feature, exposure
from matplotlib import pyplot as plt
import cv2
image = cv2.imread('sp_g.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

fd, hog_image = feature.hog(image, orientations=9, pixels_per_cell=(8, 8),
                cells_per_block=(2, 4), visualise=True)

# Rescale histogram for better display
hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 10))

cv2.namedWindow("img",cv2.WINDOW_NORMAL)
cv2.imshow('img', image)
cv2.namedWindow("hog",cv2.WINDOW_NORMAL)
cv2.imshow('hog', hog_image_rescaled)
cv2.waitKey(0)==ord('q')

可視化結果:


image.png

4、總結

HOG優(yōu)點:
與其他的特征描述方法相比乡革,HOG有很多優(yōu)點寇僧。首先,由于HOG是在圖像的局部方格單元上操作沸版,所以它對圖像幾何的和光學的形變都能保持很好的不變性嘁傀,這兩種形變只會出現(xiàn)在更大的空間領域上。其次视粮,在粗的空域抽樣细办、精細的方向抽樣以及較強的局部光學歸一化等條件下,只要行人大體上能夠保持直立的姿勢蕾殴,可以容許行人有一些細微的肢體動作笑撞,這些細微的動作可以被忽略而不影響檢測效果。因此HOG特征是特別適合于做圖像中的人體檢測的钓觉。
HOG缺點:
特征描述子獲取過程復雜茴肥,維數(shù)較高,導致實時性差荡灾,遮擋問題很難處理瓤狐,對噪聲比較敏感。

參考連接:
https://blog.csdn.net/zouxy09/article/details/7929348?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare

https://github.com/datawhalechina/team-learning/blob/master/03%20%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%9F%BA%E7%A1%80%EF%BC%9A%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%EF%BC%88%E4%B8%8B%EF%BC%89/Task04%20HOG%E7%89%B9%E5%BE%81%E6%8F%8F%E8%BF%B0%E7%AE%97%E5%AD%90.md

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末批幌,一起剝皮案震驚了整個濱河市芬首,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逼裆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赦政,死亡現(xiàn)場離奇詭異胜宇,居然都是意外死亡,警方通過查閱死者的電腦和手機恢着,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門桐愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掰派,你說我怎么就攤上這事从诲。” “怎么了靡羡?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵系洛,是天一觀的道長俊性。 經(jīng)常有香客問我,道長描扯,這世上最難降的妖魔是什么定页? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮绽诚,結果婚禮上典徊,老公的妹妹穿的比我還像新娘。我一直安慰自己恩够,他們只是感情好卒落,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜂桶,像睡著了一般儡毕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屎飘,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天妥曲,我揣著相機與錄音,去河邊找鬼钦购。 笑死檐盟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的押桃。 我是一名探鬼主播葵萎,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唱凯!你這毒婦竟也來了羡忘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤磕昼,失蹤者是張志新(化名)和其女友劉穎卷雕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體票从,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡漫雕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了峰鄙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浸间。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吟榴,靈堂內(nèi)的尸體忽然破棺而出魁蒜,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布兜看,位于F島的核電站锥咸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铣减。R本人自食惡果不足惜她君,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葫哗。 院中可真熱鬧缔刹,春花似錦、人聲如沸劣针。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捺典。三九已至鸟廓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間襟己,已是汗流浹背引谜。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擎浴,地道東北人员咽。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像贮预,于是被迫代替她去往敵國和親贝室。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359