機器學習實戰篇—人臉識別(Human Face Recognition)

機器學習實戰篇—人臉識別(Human Face Recognition)

介紹:

之前看了一篇在Ubuntu上寫的人臉識別,自己在mac下試了一下,覺得有必要再擴展一下,通過一個簡單的例子來了解一下人臉識別的過程。

準備知識:

  1. 歐幾里得距離:是一個通常採用的距離定義,指在m維空間中兩個點之間的真實距離,或者向量的自然長度(即該點到原點的距離)。在二維和三維空間中的歐氏距離就是兩點之間的實際距離。公式如圖:

機器學習實戰篇—人臉識別(Human Face Recognition)

就是說兩項間的差是每個變量值差的平方和再平方根,目的是計算其間的整體距離即不相似性,同樣的,如果距離短則相似度高。

  1. K-Means:屬於硬聚類算法,是典型的基於原型的目標函數聚類方法的代表,它是數據點到原型的某種距離作為優化的目標函數,利用函數求極值的方法得到迭代運算的調整規則。K-means算法以歐式距離作為相似度測度,它是求對應某一初始聚類中心向量V最優分類,使得評價指標J最小。算法採用誤差平方和準則函數作為聚類準則函數。

安裝依賴庫:

備註:mac下沒有apt-get,但是對應的可以用brew來安裝,下面我們通過brew來安裝庫文件

  1. 安裝cmake (是一個跨平臺的安裝工具) : brew install cmake

  2. 安裝boost(C++的程序庫):brew install boost-python --with-python2.7

  3. 編譯dlib:

    • git clone https://github.com/davisking/dlib.git

    • 進入dlib然後創建文件夾build並進入

    • 開始編譯 :cmake .. -DDLIB_USE_CUDA=0 -DUSE_AVX_INSTRUCTIONS=1

    • cmake --build .

    • cd ..

    • python setup.py install --yes USE_AVX_INSTRUCTIONS --no DLIB_USE_CUDA

4.安裝人臉識別的python庫:pip install face_recognition

人臉識別

使用face_recognition進行人臉識別,這裡我們直接使用命令行執行,首先需要準備兩個文件夾,一個是存放樣本,一個是存放將要識別的圖片。

如下圖1 avimage這個文件夾中存放的是我們的樣本三張圖片,是一些小時候的女明星:

機器學習實戰篇—人臉識別(Human Face Recognition)

下面是result的文件夾,裡面放著將要進行識別的圖片

機器學習實戰篇—人臉識別(Human Face Recognition)

然後執行命令:第一個參數是樣本文件夾,第二個參數是測試文件夾

face_recognition avimage/ results/

機器學習實戰篇—人臉識別(Human Face Recognition)

可以看出,識別出了倉老師和龍澤老師的圖片.

人臉特徵:

首先來列舉一下人臉的主要特徵有哪些:

  1. chin 下巴

  2. eyebrow 眉毛 (分左右眉毛)

  3. nose bridge 鼻樑

  4. nose tip 鼻尖

  5. eye 眼睛 (分左右眼睛)

  6. top lip 上嘴唇

  7. bottom lip 下嘴唇

face_recognition包含提取人臉特徵的方法,調用face_landmarks即可獲取以上特徵的信息,看一下代碼:

from PIL import Image, ImageDraw

import face_recognition

#加載圖片

image = face_recognition.load_image_file("TeacherCang.png")

#獲取特徵

face_landmarks_list = face_recognition.face_landmarks(image)

for face_landmarks in face_landmarks_list:

facial_features = [

'chin',

'left_eyebrow',

'right_eyebrow',

'nose_bridge',

'nose_tip',

'left_eye',

'right_eye',

'top_lip',

'bottom_lip'

]

#數組數據轉化為圖片

pil_image = Image.fromarray(image)

d = ImageDraw.Draw(pil_image)

#在圖片上把識別出的特徵用線畫出來

for facial_feature in facial_features:

d.line(face_landmarks[facial_feature], width=5)

pil_image.show()

代碼執行後的效果是:

機器學習實戰篇—人臉識別(Human Face Recognition)

人臉識別的步驟:

  1. 人臉邊框檢測:這一步是去發現輸入圖片中的人臉的位置,根據位置生成邊框,最後輸出一張只帶有人臉的邊框,如圖:

機器學習實戰篇—人臉識別(Human Face Recognition)

2. 效準圖像:對於輸入的原始圖像 + 人臉的邊框,這一步要做的事情就是要檢測人臉中的關鍵點,然後根據這些關鍵點對人臉做對齊校準。所謂關鍵點,就是下圖所示的綠色的點,通常是眼角的位置、鼻子的位置、臉的輪廓點等等。有了這些關鍵點後,我們就可以把人臉“校準”,或者說是“對齊”。解釋就是原先人臉可能比較歪,這裡根據關鍵點,使用仿射變換將人臉統一“擺正”,儘量去消除姿勢不同帶來的誤差。這一步我們一般叫Face Alignment。

機器學習實戰篇—人臉識別(Human Face Recognition)

3. 圖像轉向量:運用卷積神經網絡,將輸入的人臉圖像,轉換成一個向量的表示。下面通過一個非常基礎的模型VGG16來了解一下:

機器學習實戰篇—人臉識別(Human Face Recognition)

機器學習實戰篇—人臉識別(Human Face Recognition)

在理想的狀況下,我們希望“向量表示”之間的距離就可以直接反映人臉的相似度:

  • 對於同一個人的人臉圖像,對應的向量的歐幾里得距離應該比較小。

  • 對於不同人的人臉圖像,對應的向量之間的歐幾里得距離應該比較大。

4. 向量對比:

根據人臉的向量可得:相同的人臉對應的向量的距離小,不同人臉對應的向量距離大的特點。檢測A、B是否是屬於同一個人。只需要計算向量之間的距離,設定合適的報警閾值(threshold)即可,或者給定一張圖片,檢測數據庫中與之最相似的人臉,顯然可以被轉換為一個求距離的最近鄰問題。

總結:

介紹了人臉識別庫face_recognition在mac下的安裝和使用,以及人臉識別的流程:人臉邊框檢測,效準圖像,圖像轉向量,向量對比。


分享到:


相關文章: