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

2020-12-08 源碼時代

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

 

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

 

<src='https://www.learnopencv.com/wp-content/uploads/2016/11/gradient-kernels.jpg' width='350'>

 

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

 

1. # Python gradient calculation     

2. # Read image  

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

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

5.   

6. # Calculate gradient   

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.  # Python Calculate gradient magnitude and direction ( in degrees )   

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

 

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

1. # To calculate HOG and display the HOG image  

2. import matplotlib.pyplot as plt  

3. from skimage.feature import hog  

4. from skimage import data, exposure  

5. from skimage import color  

6.   

7. image = color.rgb2gray(data.astronaut()) #to change to gray, after importing color  

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. # Both visulaize or visualise is OK, but for this version of skimage, 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('Input image')  

20.   

21. # Rescale histogram for better display  

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('Histogram of Oriented Gradients')  

27. plt.show()  

 

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

 

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

 

1. import matplotlib.pyplot as plt  

2. from skimage import color  

3. from skimage.feature import hog  

4. from skimage import data, exposure  

5.   

6. from skimage import io  

7.   

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

9. image = color.rgb2gray(image)  

10.   

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

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

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

14. print("no. of rows of image is:{}".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('Input image')  

24.   

25. # Rescale histogram for better display  

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('Histogram of Oriented Gradients')  

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.

 

 

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

  本文為原創文章,轉載請註明出處!


相關焦點

  • 圖像學習之如何理解方向梯度直方圖(Histogram Of Gradient)
    而且好的特徵應該能夠區分紐扣和其它圓形的東西的區別。方向梯度直方圖(HOG)中,梯度的方向分布被用作特徵。沿著一張圖片X和Y軸的方向上的梯度是很有用的,因為在邊緣和角點的梯度值是很大的,我們知道邊緣和角點包含了很多物體的形狀信息。(HOG特徵描述子可以不局限於一個長度,也可以用很多其他的長度,這裡只記錄一種計算方法。)怎麼計算方向梯度直方圖呢?
  • 人臉識別技術原理與工程實踐(10個月人臉識別領域實戰總結)
    「人臉驗證」拿現場人臉跟用戶所宣稱的人臉做1比1的比較,而「人臉識別」是拿現場人臉跟後臺註冊人臉庫中的所有人臉比較,是1比N的搜索。可以看出,兩種場景的技術原理一致,但是難度不同,第二頁場景的難度普遍比第一頁高得多。4 人臉識別原理計算機是怎麼識別人臉的呢?如果我們大家是人臉識別系統的設計者,我們應用怎樣來設計這個系統?
  • 硬核科普:一文看懂人臉識別技術流程
    HOG特徵也叫方向梯度直方圖,它是由Navneet Dalal和Bill Triggs在2005年的一篇博士論文中提出的。我們簡單來看它是怎麼進行的。我們以這張照片為例,第一步是要將它變成黑白的照片,因為色彩信息在這裡對識別並沒有幫助。在這張黑白照片中,我們從單個像素看起,觀察它周圍的像素,看它是往哪個方向逐漸變暗的,然後用箭頭表示這個像素變暗的方向。
  • 以SVM和HOG特性實現實時人臉檢測和識別
    之後,從大量臉部影像中擷取「定向梯度直方圖」(Histogram of Oriented Gradients;HOG)特徵,作為識別機制的一部份。然後將這些HOG特徵一併標記為某一個人臉/使用者,並且訓練支持向量機(SVM)模型以預測饋送到系統中的臉部。
  • 梯度原理:梯度在每一點上都指向函數增長最快的方向
    已知梯度和方向,我們可以立即得到函數在該方向上的斜率所以,至少我們知道如何描繪梯度;對於二維函數,它將在平面上顯示為一連串的箭頭。實際上,我們可以做的更好,梯度的向量場有一個非常特殊且易於解釋的形狀:梯度場總是指向上坡,即函數在該點處的方向導數沿著該方向取得最大值。
  • OpenCV-Python 直方圖-2:直方圖均衡|二十七
    因此,您需要將這個直方圖拉伸到兩端(如下圖所示,來自wikipedia),這就是直方圖均衡化的作用(簡單來說)。這通常會提高圖像的對比度。我建議您閱讀直方圖均衡化上的Wikipedia頁面,以獲取有關它的更多詳細信息。它很好地解釋了示例,使您在閱讀完之後幾乎可以理解所有內容。相反,在這裡我們將看到其Numpy實現。之後,我們將看到OpenCV功能。
  • 黑客如何用一副紙眼鏡,就「弄瞎」人臉識別算法?
    這兩種算法可能不是同一個模型,背後原理是抓住了人臉模型之間的相似性(雖然人臉識別模型各有千秋,但是都屬於深度學習模型,免不了會有相似性)。攻擊算法尋找、挖掘、抓住不同人臉識別模型之間的相似性,同時放大,這樣就有攻擊的機會。換句話說,只要攻擊者能夠從人臉識別模型裡面挖掘出漏洞(相似性),就能夠攻擊模型。研發攻擊算法的過程中,挖掘相似性是一件很耗神、很熬人的事。
  • 為什麼梯度的方向與等高線切線方向垂直
    梯度下降的算法中學習中,會使用三維曲面去描述梯度的更新。而在三維曲面上的梯度更新過程中,很多地方出現梯度的下降方向是如下這樣走的:從圖上能夠看出,梯度下降的方向與等高線的切線方向垂直。那麼為什麼會垂直呢?這是由公式推出的。
  • 方向導數和梯度是什麼?
    為什麼梯度的方向是函數在該點的方向導數最大的方向,梯度的模是最大方向導數的值?大家在看複習全書時,有認真想過這個問題嗎?小編在本文以二元函數為例詳細講解方向導數和梯度,並試圖以儘可能通俗地語言回答上述問題。
  • 新京報:防範人臉識別濫用 該建個人信息梯度保護制度
    來源:新京報網原標題:防範人臉識別濫用,該建個人信息梯度保護制度 根據個人信息保護的制度和實踐,可以有四種構造人臉識別技術應用場景的模式,相應地,對於個人信息的保護也是在逐步增強。▲我國的人臉識別技術應用也具有泛濫傾向,通過立法明確加以規制的呼聲一直很高。
  • 人臉識別行業分析
    人臉識別技術原理簡單來講主要是三大步驟:一是建立一個包含大批量人臉圖像的資料庫;二是通過各種方式來獲得當前要進行識別的目標人臉圖像;三是將目標人臉圖像與資料庫中既有的人臉圖像進行比對和篩選。根據人臉識別技術原理具體實施起來的技術流程則主要包含以下四個部分,即人臉圖像的採集與預處理、人臉檢測、人臉特徵提取、人臉識別和活體鑑別。1.
  • 形象直觀的「偏導數」和「梯度」原理
    偏導數和梯度是數學中的重要概念,貫穿於許多自然學科,本篇就用形象的圖形來解釋它們的原理圖中是有X Y 變量 和有X Y變量組成的函數Z=f(X,Y)圖形的變換量就是該線的斜率,只是斜率的大小不一樣Z的增量除以Y的增量,我們稱之為Z對Y的偏導數同理,我們保持Y值不變,Z值僅隨X值改變,Z的增量除以X的增量,我們稱之為Z對X的偏導數我們用一個箭頭來表示斜率的正負,箭頭表示斜率的大小斜率不同箭頭方向不同
  • 人臉識別技術理論
    人臉識別系統的研究始於20世紀60年代,80年代後隨著計算機技術和光學成像技術的發展得到提高,而真正進入初級的應用階段則在90年後期,並且以美國、德國和日本的技術實現為主;人臉識別系統成功的關鍵在於是否擁有尖端的核心算法,並使識別結果具有實用化的識別率和識別速度;「人臉識別系統」集成了人工智慧、機器識別、機器學習、模型理論、專家系統、視頻圖像處理等多種專業技術,同時需結合中間值處理的理論與實現
  • 百度大腦人機大戰險勝,我們來聊點乾貨:人臉識別的原理
    人工智慧進行人臉識別的流程 當嘉賓問到現場選手王峰是怎麼做到的,王峰說會先記住目標人物臉上一些不會隨著年齡而改變的特徵,比如鼻子、耳朵、嘴角。那麼人工智慧又是如何做人臉識別的呢? 其實跟王峰用的方法也很類似,通過提取特徵去匹配,但以前,可能是人類挑出具體的特徵,現在運用深度學習的方式,機器可以自己去學習什麼樣的特徵是有用的。
  • 直方圖是什麼,及直方圖在攝影中的應用
    作為一張圖片的「資料庫」,直方圖裡基本包含了圖片的所有數據,我們可以通過直方圖來了解照片的真實信息。學會直方圖,不論是在前期拍攝,還是在照片的後期修飾,都能起到事半功倍的效果。今天,我們就從以下幾個部分來深入了解直方圖。
  • 人臉識別系統的幾個過程淺析
    「人臉識別系統」集成了人工智慧、機器識別、機器學習、模型理論、專家系統、視頻圖像處理等多種專業技術,是綜合性比較強的系統工程技術。對於人臉的圖像預處理是基於人臉檢測結果,對圖像進行處理並最終服務於特徵提取的過程。系統獲取的原始圖像由於受到各種條件的限制和隨機幹擾,往往不能直接使用,必須在圖像處理的早期階段對它進行灰度校正、噪聲過濾等圖像預處理。對於人臉圖像而言,其預處理過程主要包括人臉圖像的光線補償、灰度變換、直方圖均衡化、歸一化、幾何校正、濾波以及銳化等。   人臉識別比對(匹配與識別)。
  • 人臉識別閘機功能及工作原理 看後恍然大悟!
    伴隨著人工智慧的迅猛發展,閘機的智能化也逐步被智能技術取代。人臉識別技術的閘機,幾乎可以算作當下熱門閘機系統。其高精度識別技術,充分保障來訪人員、內部員工的安全通行,可以大大減輕管理人員的工作量。那麼,人臉識別的工作原理到底是如何的呢?人臉識別閘機系統工作原理根據對機芯的控制方式的不同,分為機械式、半自動式、全自動式。有些廠商會把半自動式稱為電動式,把全自動式稱為自動式。
  • 人臉識別核心算法及技術解析
    1、在檢測到人臉並定位面部關鍵特徵點之後,主要的人臉區域就可以被裁剪出來,經過預處理之後,饋入後端的識別算法。識別算法要完成人臉特徵的提取,並與庫存的已知人臉進行比對,完成最終的分類。  思路:  對於給定的人臉圖像,LGBP方法首先將其與多個不同尺度和方向的Gabor濾波器卷積(卷積結果稱為Gabor特徵圖譜)獲得多解析度的變換圖像。
  • 熱議 | 人工智慧時代的崩塌?人臉識別技術或將被禁
    nbsp;                    ——《經濟學人》我們很難說明人工智慧時代究竟是如何到來的
  • 依圖NIST奪冠,解密人臉識別算法原理
    中國公司取得如此戰績,一定程度上代表在人工智慧領域,我國的人臉識別技術已經走在世界前列,可喜可賀!為此,小編特別想探究一下人臉識別背後的算法原理。  1.基於幾何特徵的方法  基本思想:採用幾何特徵進行正面人臉識別一般是通過提取人眼、口、鼻等重要特徵點的位置和眼睛等重要器官的幾何形狀作為分類特徵。