人工智慧人臉探測原理——方向梯度直方圖

給計算機輸入一套房的面積,位置,朝向,房間數目,計算機就可以自動給你算出它的價格;輸入一個人的學歷,住址,朋友數目,去過的地方,計算機也可以自動給你算出他/她的年收入;輸入一種植物的花瓣數目,花瓣寬度/長度,葉子長度/寬度,花香描述等,計算機就可以告訴我們這種植物的名稱;…… 這些問題都可以通過選擇一個機器學習算法,給它數據,然後等待輸出結果. 人臉探測也是可以通過機器學習算法來做的.它的目的就是找出圖片中的人臉.

人臉探測是人臉識別算法和圖片審核中所用的算法. 在區分人臉之前,首先要找出人臉在照片中的位置! 近幾年來的相機都有人臉探測的功能,它能找出人臉,以便可以對每張人臉對焦,從而得出更清晰的照片.我們這裡用來做識別人臉,而非得到更清晰的照片.

注:自從Paul Viola和Michael Jones 發明了能應用在一般照相機上的快速探測人臉的方法,人臉探測在上個時代初就成為主流技術. 現在,人們有了更好的方法用於快速探測人臉.

我們將用的方法----方向梯度直方圖(Histogram of Oriented Gradients, HOG, 2005). 首先將照片轉成黑白照片,因為色彩的信息我們不需要.然後,我們依次關注照片中的每一個像素點. 對每個像素點, 我們想看看那些直接包圍著它的像素點. 我們的目標:計算出當前像素相對於其周圍的像素有多暗. 然後我們想畫出像素由明到暗變化最快的方向:

人工智能人臉探測原理——方向梯度直方圖

對照片中的每一個像素點重複上述操作, 最終每一個像素都被一個箭頭取代了. 這些箭頭稱為梯度 ,它們顯示整張照片由明到暗變化最快的方向.

這樣做有什麼好處? 如果我們直接分析像素, 同一個人的非常暗的照片和非常亮的照片將具有完全不同的像素值. 但是考慮亮度改變的方向時,暗照片和兩照片將有幾乎一樣的表示! 所以我們不直接處理像素值信息,而是處理像素明暗的變化信息.

我們可以用梯度來看一些基本模式,而不是所有細節!為了達到這目的,我們將照片分成小方格,每個方格的大小為16x16像素. 在每一個小方格中,我們將計算在每個主要方向有多少個梯度點 .例如,可以考慮有多少個指向(0°,60°)區間,有多少個指向(60°,120°),有多少個指向(120°,180°),等等. 接下來,我們可以統計每個區間內方向梯度的個數(可以為方向梯度的絕對值作為權重),個數最多的區間就"勝出"了.我們以這個區間的箭頭方向去取代該小方格. 這樣,我們就將原圖片轉化成了非常簡單的表示. 它只以簡單的方式描述人臉的基本結構.

為了在這張HOG圖片中找到人臉, 我們只需找到我們的圖片中最像已知HOG 模式的那部分.已知HOG模式由大量其他照片訓練並提取出來,如圖所示.

人工智能人臉探測原理——方向梯度直方圖

為了計算一個HOG描述器, 我們首先需要計算水平梯度和豎直梯度;然後可求得方向梯度直方圖. 這可以由如下的核過濾該圖片而得:

人工智能人臉探測原理——方向梯度直方圖

我們也可用OpenCV中的Sobel算符來達到同樣的目的.

1.#Pythongradientcalculation

2.#Readimage

3.im=cv2.imread('li.jpg')

4.im=np.float32(im)/255.0

5.

6.#Calculategradient

7.gx=cv2.Sobel(img,cv2.CV_32F,1,0,ksize=1)

8.gy=cv2.Sobel(img,cv2.CV_32F,0,1,ksize=1)

然後,我們可以用gx, gy來計算梯度的大小和方向.如果我們用OpenCV, 可以應用函數cartToPolar來計算這兩個量.代碼如下.

1. #PythonCalculategradientmagnitudeanddirection(indegrees)

2.mag,angle=cv2.cartToPolar(gx,gy,angleInDegrees=True)

我們也可以用skimage模塊來計算和顯示一幅圖的方向梯度直方圖.示例代碼如下:

1.#TocalculateHOGanddisplaytheHOGimage

2.importmatplotlib.pyplotasplt

3.fromskimage.featureimporthog

4.fromskimageimportdata,exposure

5.fromskimageimportcolor

6.

7.image=color.rgb2gray(data.astronaut())#tochangetogray,afterimportingcolor

8.#image=data.astronaut()

9.

10.fd,hog_image=hog(image,orientations=8,pixels_per_cell=(16,16),

11.cells_per_block=(1,1),visualise=True)

12.#fd,hog_image=hog(image,orientations=8,pixels_per_cell=(16,16),

13.#cells_per_block=(1,1),visualise=True, multichannel=True)

14.#BothvisulaizeorvisualiseisOK,butforthisversionofskimage,use'visualise'.

15.

16.fig,(ax1,ax2)=plt.subplots(1,2,figsize=(8,4),sharex=True,sharey=True)

17.ax1.axis('off')

18.ax1.imshow(image,cmap=plt.cm.gray)

19.ax1.set_title('Inputimage')

20.

21.#Rescalehistogramforbetterdisplay

22.hog_image_rescaled=exposure.rescale_intensity(hog_image,in_range=(0,10))

23.

24.ax2.axis('off')

25.ax2.imshow(hog_image_rescaled,cmap=plt.cm.gray)

26.ax2.set_title('HistogramofOrientedGradients')

27.plt.show()

結果如下,左邊為原圖(已經轉成黑白照片),右圖為方向梯度直方圖.

人工智能人臉探測原理——方向梯度直方圖

我們也可以利用io.imread()導入圖片,使之稱為numpy.ndarray型的數據. 然後也可對圖片進行同樣的操作,得到方向梯度直方圖. 代碼和上面的代碼只在導入圖片時有細微差別.代碼和結果依次如下:

1.importmatplotlib.pyplotasplt

2.fromskimageimportcolor

3.fromskimage.featureimporthog

4.fromskimageimportdata,exposure

5.

6.fromskimageimportio

7.

8.image=io.imread('./li_00.jpg')

9.image=color.rgb2gray(image)

10.

11.print("typeofimageis:{}".format(type(image)))

12.print("imageis:{}".format(image))

13.print("no.ofcolumnsofimageis:{}".format(len(image[0])))

14.print("no.ofrowsofimageis:{}".format(len(image)))

15.

16.fd,hog_image=hog(image,orientations=8,pixels_per_cell=(8,8),

17.cells_per_block=(1,1),visualise=True)

18.

19.fig,(ax1,ax2)=plt.subplots(1,2,figsize=(8,4),sharex=True,sharey=True)

20.

21.ax1.axis('off')

22.ax1.imshow(image,cmap=plt.cm.gray)

23.ax1.set_title('Inputimage')

24.

25.#Rescalehistogramforbetterdisplay

26.hog_image_rescaled=exposure.rescale_intensity(hog_image,in_range=(0,10))

27.

28.ax2.axis('off')

29.ax2.imshow(hog_image_rescaled,cmap=plt.cm.gray)

30.ax2.set_title('HistogramofOrientedGradients')

31.plt.show()

人工智能人臉探測原理——方向梯度直方圖

參考文獻

1.Dalal, N. and Triggs, B., “Histograms of Oriented Gradients for Human Detection,” IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 2005, San Diego, CA, USA.

2.David G. Lowe, “Distinctive image features from scale-invariant keypoints,” International Journal of Computer Vision, 60, 2 (2004), pp. 91-110.

感謝源碼時代教學講師提供此文章!


分享到:


相關文章: