1. 程式人生 > >【人臉識別】OpenFace

【人臉識別】OpenFace

人臉識別OpenFace

轉自:https://blog.csdn.net/dev_csdn/article/details/79176037

原文:https://blog.algorithmia.com/understanding-facial-recognition-openface/ 
作者:Stephanie Kim 


image

 

人臉識別已經成為我們生活當中越來越普遍的一部分。

如今,智慧手機使用人部識別來取得控制權,而像阿凡達這樣的動畫電影則用它來實現逼真的動作和表達。警方監控攝像頭藉助人臉識別軟體鑑別通緝犯,同樣的人臉識別也被零售商店用於進行有針對性的營銷活動。並且我們都使用過類似於名人像 App和Facebook的自動標記工具,將我們、朋友和家人進行分類。

人臉識別可以在許多不同的場景中應用,但並不是所有的人臉識別庫在準確性和效能上都是平等的,而且大多數最先進的系統都是專有的黑盒子。

OpenFace是一個開源庫,它具有專利模型的效能和精確性。該專案是在考慮移動效能的情況下建立的,因此讓我們來看看一些使這個庫快速而準確的內部結構,並通過一些用例來思考為什麼可能想要在專案中實現它。

高層體系結構概述

OpenFace是Brandon AmosBartosz LudwiczukMahadev Satyanarayanan開發的一種深度學習人部識別模型,模型基於文章:FaceNet:為人臉識別統一的嵌入和聚類,該文章由谷歌的James Philbin、James Philbin和Florian Schroff發表,並通過Python和Torch來實現,以便能在在CPU或GPU上執行。

儘管OpenFace只有幾年的歷史,但它已經被廣泛採用,因為它提供的精確度與谷歌的FaceNet或facebook的DeepFace等私有的最先進的系統所包含的人臉識別模型類似。

OpenFace的特別之處除了開源之外,還在它主要集中在移動裝置上的實時人臉識別,所以可以用非常精確的資料來訓練一個模型,儘管模型的資料非常少。

 


image

 

從高層次的角度來看,OpenFace使用的Torch,是一個科學的計算框架能進行離線訓練,這意味著它只在OpenFace完成一次,使用者不必親自動手訓練成百上千的圖片。然後把這些影象被扔進神經網路中用谷歌的FaceNet模型進行特徵抽取。FaceNet依賴triplet loss方法來計算神經網路對人臉進行分類的準確性,並能夠基於超球表面的測量結果進行人臉聚類。

在通過dlib的面部檢測模型執行新影象之後,這個經過訓練的神經網路在Python實現中被使用。一旦這些人臉被OpenCV的仿射變換規格化,所有的人臉都指向同一個方向,它們就會通過訓練的神經網路單向傳遞。因此產生的128維度人臉嵌入(每張臉的128個測量值稱為一個嵌入)可以對匹配分類,甚至可以用於相似檢測的聚類演算法中。

 


image 

 

訓練

在OpenFace pipeline的訓練部分中,500k影象通過神經網路傳遞。這些影象來自兩個公共資料集:CASIA-WebFace(由10575個獨立的個體組成,總共有494,414張影象)和FaceScrub(由530個個體組成,共有106,863張影象,他們都是公眾人物)。

在所有這些影象前面訓練神經網路的目的是很明顯的,在移動或者任何其他實時場景中都不可能訓練50萬張圖片來獲取所需的面部嵌入。但請記住,這部分pipeline只完成一次,因為OpenFace將這些影象用於生成128維度的人臉嵌入,它標識一個通用的面孔,用於Python訓練的pipeline。然後使用低維度的資料(而不是在高維空間中)匹配影象,這有助於快速地建立模型。

正如前面提到的,OpenFace使用Google的FaceNet架構來進行特徵提取,並使用triplet loss方法來測試神經網路對臉部的精確程度。它通過對三個不同的影象進行訓練,其中一個是已知的人臉影象,叫做anchor影象,然後另一個影象是positive嵌入,而最後一個是不同的人的影象,被稱為negative嵌入。

如果你想了解更多關於triplet loss的資訊,請點選Andrew NG的卷積神經網路Coursera視訊

使用triplet嵌入的很重要的一點是,在一個單位超球面上,用歐氏空間距離能判斷哪些影象更近,哪些更遠。很明顯,negative影象嵌入比positive和anchor測量的更深,而posivit與anchor空間距離更近。這一點很重要,因為決定叢集演算法可以用於相似性檢測。如果想要在族譜網站上檢測家庭成員,或者在社交媒體上尋找可能的營銷活動(比如說團購),可能需要使用聚類演算法。

脫離背景的人臉

 


image 

 

上面已經介紹了OpenFace如何使用Torch來訓練成千上萬的來自公共資料集的圖片,以獲得低維度的面部嵌入,現在通過檢視他們對流行的人臉檢測庫dlib的使用情況,來看看為什麼要使用它,而不是OpenCV的面部檢測庫。

人臉識別軟體的第一步是將人臉從影象的背景中分離出來,並將人臉從影象中分離出來。人臉檢測演算法還必須能夠處理弱的和不一致的光線,以及不同的面部位置,比如傾斜或旋轉的臉。幸運的是,dlib和OpenCV一起處理了所有這些問題。Dlib負責尋找臉部的基準點,而OpenCV則負責處理面部的標準化。

值得注意的是,在使用OpenFace時,可以實現dlib的面部檢測,它組合使用了HOG向量的梯度)和支援向量機或OpenCV的Haar級聯分類器。它們都接受過positive和negative影象訓練,但是在實現上、檢測速度和準確性方面都有很大的不同。

使用HOG分類器有幾個好處。首先,在影象上使用一個滑動子視窗進行訓練,因此不需要進行子取樣和引數操作,就像在OpenCV中使用Haar分類器一樣。這使得dlib的HOG和SVM的人臉檢測更容易使用,而且可以更快地進行訓練,同時所需要的資料更少,此外HOG的面部識別比OpenCV的Haar級聯分類器更準確。所以使用dlib的HOG搭配SVM做人臉檢測非常方便!

預處理

 


image 

 

除了在影象中找到每張臉,人臉識別過程的還包括預處理影象,以便解決一些如不一致和弱光線的問題,預處理將影象轉換成灰度級以進行更快的訓練,同時對面部位置標準化。

雖然一些面部識別模型可以通過大量的資料集訓練來處理這些問題,但dlib使用了OpenCV的2D仿射變換,它可以旋轉臉部,使眼睛、鼻子和嘴巴的位置保持一致。在仿射變換中,有68個面部特徵點用於特徵檢測,並且將測量所得點之間的距離與普通人臉影象中的點進行比較,隨後根據這些點將影象進行旋轉和轉換,通過比較將其裁剪為96 96個畫素,用於被訓練的神經網路。

 


image 

 

將影象從背景中分離出來,並使用dlib和OpenCV進行預處理之後,再將影象傳送到經過訓練的神經網路中,這是在Torch的pipeline部分完成的。這個步驟中,神經網路上有一個單向傳遞來獲得用於預測的128維度嵌入(面部特徵)。這些低維度的面部嵌入在分類或聚類演算法中會使用到。

測試中OpenFace使用一個線性支援向量器,它通常在現實世界中使用以匹配影象的特徵。OpenFace令人印象最深刻的一點是對影象進行分類只需要幾毫秒的時間。

使用場景

經過一個較高層次的OpenFace架構的討論之後,現在列舉一些關於使用場景的有趣的想法。前面提到,人臉識別被用作一種訪問控制和識別的形式。其中之一便是幾年前探索的當進入辦公室時,用它來識別和定製經歷。https://blog.algorithmia.com/hey-zuck-we-built-your-facial-recognition-ai/。那已經是很久以前的故事了,可以嘗試考慮建立一款移動應用,用於識別出參加俱樂部或派對的VIP使用者。保鏢們不需要記住每個人的臉,也不需要依賴一份名單來讓人們進入。同時,在訓練資料上新增新面孔也很容易,當個體回到戶外呼吸新鮮空氣,並想再次進入俱樂部時,模型就會被訓練出來。參照以上這些原則,可以在聚會或會議上進行人臉識別,因為在那裡有人需要臨時進入樓層或辦公室,安保人員或前臺人員可以輕鬆地更新或刪除手機上的資料集。

在哪裡尋找已實現的OpenFace

我們已經做了一個檢出OpenFace的案例,可以從OpenFace on GitHub下載模型實現人臉識別,或者從OpenFace model on Algorithmia通過SVM拉取程式碼實現新增、訓練、移除和預測影象。如果想學習如何使用面部識別演算法,請檢視celebrity classifier