使用OpenFace進行人臉識別 1

2021-09-07 15:20:06 字數 2476 閱讀 8839

input image -> detect

輸入:原始的可能含有人臉的影象。

輸出:人臉位置的bounding box。

這一步一般我們稱之為「人臉檢測」(face detection),在openface中,使用的是dlib、opencv現有的人臉檢測方法。此方法與深度學習無關,使用的特徵是傳統計算機視覺中的方法(一般是hog、haar等特徵)。

dlib的實現:

opencv的實現:face detection using haar cascades

detect -> transform -> crop

輸入:原始影象 + 人臉位置bounding box

輸出:「校準」過的只含有人臉的影象

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

在openface中,這一步同樣使用的是傳統方法,特點是比較快,對應的**是:

one millisecond face alignment with an ensemble of regression trees

crop -> representation

輸入:校準後的單張人臉影象

輸出:乙個向量表示。

這一步就是使用深度卷積網路,將輸入的人臉影象,轉換成乙個向量的表示。在openface中使用的向量是128x1的,也就是乙個128維的向量。

我們可以先看一下vgg16的模型:

vgg16是深度學習中乙個比較簡單的基本模型。輸入神經網路的是影象,經過一系列卷積後,全連線分類得到類別概率。

在通常的影象應用中,我們可以去掉全連線層,用計算的特徵(一般就是卷積層的最後一層,e.g. 圖中的conv5_3)來當作提取的特徵進行計算。但如果對人臉識別問題同樣採用這樣的方法,即,使用卷積層最後一層做為人臉的「向量表示」,效果其實是不好的。如何改進?我們之後再談,這裡先談談我們希望這種人臉的「向量表示」應該具有哪些性質。

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

對於同乙個人的人臉影象,對應的向量的歐幾里得距離應該比較小。

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

這種表示實際上就可以看做某種「embedding」。在原始的vgg16模型中,我們使用的是softmax損失,沒有對每一類的向量表示之間的距離做出要求。所以不能直接用作人臉表示。

舉個例子,使用cnn對mnist進行分類,我們設計乙個特殊的卷積網路,讓最後一層的向量變為2維,此時可以畫出每一類對應的2維向量表示的圖(圖中一種顏色對應一種類別):

上圖是我們直接使用softmax訓練得到的結果,它就不符合我們希望特徵具有的特點:

我們希望同一類對應的向量表示盡可能接近。但這裡同一類(如紫色),可能具有很大的類間距離。

我們希望不同類對應的向量應該盡可能遠。但在圖中靠中心的位置,各個類別的距離都很近。

那麼訓練人臉特徵表示的正確姿勢是什麼?其實有很多種方法。一種方法就是使用「center loss」。centor loss實際上是在softmax的loss上再加入乙個損失,這個損失對每一類規定了乙個「中心」點,每一類的特徵應該離這個中心點比較近,而不同類的中心點離的比較遠。加入center loss後,訓練出的特徵大致長這樣:

這樣的特徵表示就比較符合我們的要求了。center loss的原始**在這裡: 。上面這兩幅圖同樣是從這篇**中截下來的。

實際應用

輸入:人臉的向量表示。

有了人臉的向量表示後,剩下的問題就非常簡單了。因為這種表示具有相同人對應的向量的距離小,不同人對應的向量距離大的特點。接下來一般的應用有以下幾類:

人臉驗證(face identification)。就是檢測a、b是否是屬於同乙個人。只需要計算向量之間的距離,設定合適的報警閾值(threshold)即可。

人臉識別(face recognition)。這個應用是最多的,給定一張,檢測資料庫中與之最相似的人臉。顯然可以被轉換為乙個求距離的最近鄰問題。

人臉聚類(face clustering)。在資料庫中對人臉進行聚類,直接k-means即可。

後記以上給大家介紹了openface中處理人臉問題的pipeline。需要特別指出的是,人臉相關的問題是乙個比較大的方向,一篇文章顯然是說不清楚的,這裡只是基於openface,對比較重要的方法還有名詞做了乙個解釋。在openface中,為了速度的考慮,提取人臉特徵之前的face detection和face alignment就是使用的傳統方法。實際上也可以換用精度更高的深度學習相關方法,比如在中科院山世光老師開源的人臉識別引擎seetaface/seetafaceengine中,face alignment使用就是乙個基於autoencoder網路的方法。另外,學習人臉特徵同樣有適合不同場景的不同方法,這些都是要進一步學習的。

python中使用Opencv進行人臉識別

python中使用opencv進行人臉識別 cv2.imshow無法顯示影象 在執行cv2.imshow後,需要使用cv2.waitkey來保持視窗的顯示。python opencv影象標註矩形框bounding box 用 opencv 標註 bounding box 主要用到下面兩個工具 cv2...

使用opencv進行人臉識別

最近由於大作業需要,使用了opencv進行人臉識別。一般來說,識別分為兩部,即人臉檢測 人臉識別,opencv提供了乙個人臉檢測的sample,有乙個比較成熟的訓練人臉正面訓練檔案,這是我所知的乙個很成熟的人臉識別工具,而且已用於一些前沿3d愛情動作遊戲中,這裡主要是對其提供的sample作了一定的...

使用opencv進行人臉識別

最近由於大作業需要,使用了opencv進行人臉識別。一般來說,識別分為兩部,即人臉檢測 人臉識別,opencv提供了乙個人臉檢測的sample,有乙個比較成熟的訓練人臉正面訓練檔案,這是我所知的乙個很成熟的人臉識別工具,而且已用於一些前沿3d愛情動作遊戲中,這裡主要是對其提供的sample作了一定的...