1. 程式人生 > >經典計算機視覺論文筆記——DeepFace\DeepID\DeepID2\DeepID3\FaceNet\VGGFace彙總

經典計算機視覺論文筆記——DeepFace\DeepID\DeepID2\DeepID3\FaceNet\VGGFace彙總

1. DeepFace:Closing the Gap to Human-Level Performance in Face Verification

最早將深度學習用於人臉驗證的開創性工作。Facebook AI實驗室出品。動用了百萬級的大規模資料庫。典型的識別訊號提特徵+驗證訊號refine的兩步走,對DeepID等後人的工作影響很大。

技術概括

關注了人臉驗證流程中的人臉對齊步,採用了比較複雜的3D人臉建模技術和逐塊的仿射變換進行人臉對齊。可以解決non-planarity對齊問題。 提出了一個9層(其實是8層)的CNN進行特徵提取。提出了一種針對對齊後人臉的的locally connected layers
,無權值共享。 CNN提取的特徵繼續進行metric learning,包括卡方距離學習和siamese network兩種方法。

一些值得反思的細節

CNN的結構:conv-->pooling-->conv-->3 locally connected layers-->2 fc。由於最後5層都沒有權值共享,所以會造成引數膨脹,共有超過1.2億個引數,其中95%都來源於最後5層。但locally connected layers相比原始的conv計算速度是一樣的。因為動用了目前看來也是驚人的4000人的400百萬幅影象,所以沒有出現明顯的過擬合。 單個CNN最後提取的特徵維數是
4096 3D對齊的步驟是:找6landmarks-->進行2D對齊-->重找6landmarks-->重進行2D對齊……直到收斂-->67landmarks-->3D-2D對映建模-->逐塊仿射變換變成正臉。此處水很深,實現起來較複雜,而且後續的論文都沒有再用如此複雜的對齊手段也能得到非常好的結果,不建議復現。但對比實驗表明3D對齊的作用還是很大的,可能是和採用的演算法有關係吧,比如針對3D對齊定製的locally connected layers pooling只使用一次,擔心資訊損失太多。 只對第一個fc layer採用了dropout CNN
提取完的特徵還要進行兩次歸一化。第一次是每個分量除以訓練集中的最大值,第二次是l2歸一化。此步似乎多餘,也沒有足夠的理論和實驗支撐,又回到了人工特徵的老路。歸一化本身是一種降低特徵之間差異的手段,不一定就可以增強discriminative ability,應該慎重使用。 CNN學習出特徵後,還需要用某種相似度來做驗證。文中採用了兩種比較簡單的相似度:加權卡方距離和加權L1距離。權重分別通過SVMsiamese network學習到。這一步一般是進行遷移學習。 相似度量學習到後,還要訓練一個SVM對兩兩距離做2分類,判斷是否是同一個人。 資料庫:4030個人,每人800-1200幅影象,440萬幅影象。 10種網路的距離結果ensemble,累加kernel matrix,再用SVM對距離做分類,判斷是否是同一個人。 通過牛逼的工程優化,在2.2GHzCPU上可做到CNN0.18秒,對齊0.05秒,全部0.33秒。

2. Deep LearningFace Representation from Predicting 10,000 Classes

湯曉鷗團隊DeepID系列的開創之作。也是典型的兩步走策略。

技術概括

訓練一個9CNN對約10000個人(其實是8700個人)做人臉識別,中間有跨層連線和 locally connected layer。倒數第二層的輸出作為特徵。 多個人臉區域的特徵進行連線作為總特徵。 CNN學習出的特徵再訓練一個joint bayesian進行人臉驗證。

一些值得反思的細節

單個CNN訓練出的特徵是160維,維度非常小,具有極強的壓縮性質。 明確提出識別訊號的作用,強於只使用驗證訊號。 CNN的結構:conv1-->pooling1-->conv2-->pooling2-->conv3-->pooling3-->conv4-->fc-->softmax。其中conv3只在每個2*2區域性區域權值共享,conv4locally connected layer,權值不共享。fc同時與pooling3conv4全連線,是一種多解析度策略。 CNN輸入會根據patch的不同而改變,後續的feature maps都會跟著改變。 人臉對齊採用3landmarks。根據5landmarks取樣patches。一共10 regions*3 scales*1 RGB*1 gray=60 patches。每個patch還要取flip。所以,最後要訓練60*2=120CNN!最後把每個CNN160維特徵連線成160*2*60=19200維特徵。工作量有點大。 CNN學習出的特徵訓練了joint bayesian和一個驗證用的神經網路。驗證用神經網路只是一個三層的淺層網路,輸入是成對的影象patches19200*2維,輸出層是2分類結果輸出。對比結果顯示這種神經網路沒有joint bayesian效果好。 訓練joint bayesian前用PCA19200維特徵降維到150 資料庫包括10177個人,共202599幅影象。

3. Deep LearningFace Representation by Joint Identification-Verification

超越人類水平(97.53%)。不過同是曉鷗團隊的gaussian face是第一次超越人類。

技術概括

明確採用兩種監督訊號:識別訊號用於增加類間距離,驗證訊號用於減少類內距離(肯定也是有利於增加類間距離的)。 相比於DeepIDloss層除了用於分類的softmax loss,還加入了contrastive loss。兩種loss同時反向傳播。 相比於DeepID,從眾多patches中挑選出了25個最佳pathes,減少計算負擔和資訊冗餘。 驗證採用joint bayesian或直接用L2距離。

一些值得反思的細節

CNN結構除了最後的loss層外與DeepID一樣。輸出是8192個人的分類結果。 400patches中挑選了 25個。訓練25CNN,最後連線成的特徵向量是25*160=4000維。在訓練joint bayesian之前,要通過PCA進一步降維到180維。 因為加入了contrasitive lossCNN學習出的特徵可以直接用於計算L2距離進行人臉驗證,效果不會比joint bayesian差很多。 最後通過選擇不同的patches,訓練了7個分類器做ensemble

4. Deeply learnedface representations are sparse, selective, and robust

一半內容是理論分析。總體上兩步走策略沒變,只是CNN結構做了較大改變。

技術概括

增加隱含層的寬度,即feature maps個數。 監督資訊跨層連線。 理論分析DeepID2+的特徵是sparsity\selectiveness\robustnesssparsity是指特徵向量中有許多分量為0,因此具有壓縮能力。selectiveness是指某個分量對某個人的影象或某種屬性的影象的啟用響應程度和其他人或屬性的程度不一樣,因此具有判別能力。robustness是指影象特徵在遮擋前後具有一定的不變性。 利用sparsity進行特徵二值化,可用於大規模影象檢索。

一些值得反思的細節

訓練集中沒有特意加入遮擋樣本,但學習出的特徵也具有遮擋的魯棒性。 相比於DeepID2feature maps的個數由20406080變為128128128128。輸出的特徵維數由160變為512 相比於DeepID225patches還要再取一次flip,訓練50CNN,特徵維數共50*512=25600維。 資料庫:12000個人,290000幅影象。 fcloss層連線到之前的每一個pooling層後面,也就是類似googlenet的策略,讓監督資訊直接作用到每一層。但fc層應該權值不共享。 通過對人臉屬性方面的分析,說明通過人臉識別與驗證訊號學習到某個神經元是對某種屬性有更強的啟用響應。所有這些神經元的組合代表了各種屬性的特徵組合,說明通過這些中層屬性特徵可以對高層的身份特徵進行差別,與kumar的工作有異曲同工之妙。

5. DeepID3: FaceRecognition with Very Deep Neural Networks

針對CNN的結構做了較大改進,採用影象識別方面的最新網路結構,且層數加深。其他方面較前作沒有變化。

技術概括

實現了兩種更深層的CNN網路,一種是參考VGGconv層的不斷堆積,一種是參考googlenetinception結構的不斷堆積。 繼續採用DeepID2+中的監督訊號跨層連線策略。 繼續採用DeepID2+中的25patches(加flip)特徵組合策略。其中VGGgooglenet各訓練一半。 繼續採用DeepID2+中的joint bayesian用於驗證的策略。

一些值得反思的細節

VGGCNN結構: conv1\2-->pooling1-->conv3\4-->pooling2-->conv5\6-->pooling3-->conv7\8-->pooling4-->lc9\10fcloss連線到之前每一個pooling層後面。 googlenetCNN結構:conv1\2-->pooling1-->conv3\4-->pooling2-->inception5\6\7-->pooling3-->inception8\9-->pooling4fcloss連線到之前每一個pooling層後面。 relu用於除了pooling層之外的所有層。 dropout用於最後的特徵提取層。 特徵總長度大約30000維。 PCA降維到300維。 DeepID2+比起來,精度幾乎沒有提高。可能還是網路過淺,訓練資料過少,沒有完全發揮VGGgooglenet的效果。

6. FaceNet: AUnified Embedding for Face Recognition and Clustering

非兩步式方法,end-to-end方法。在LFW的精度基本上到極限了,雖然後面還有百度等99.77%以上的精度,但從原理上沒有創新,也是用了triplet loss等本文得出的技術。

技術概括

提出了一種end-to-end的網路結構,最後連線的是triplet loss。這樣提取的特徵可以直接用歐氏距離算相似度。 提出了樣本選擇技術,找hard triplets。這一步至關重要,選不好可能會不收斂。

一些值得反思的細節

特徵維度:128。可以二值化,效果也不錯。 triplet loss為什麼比contrastive loss好沒有解釋得太清楚。兩者都有margin的概念,而不是像本文所說的是其獨有。 triplets選擇有兩種方法。1.線下選擇。用訓練中途的網路去找一個樣本集中的hard triplets2.線上選擇。也是本文最終所採用的方式。從當前mini-batch中選擇。每個mini-batch取幾千個(1800個)樣本,其中保證每人至少40個樣本。負樣本隨機取樣即可。所有正樣本對都用,只選擇負樣本對。 實際選擇hard negtives的時候,鬆弛條件,只選擇semi-hard,也就是負樣本對的距離比正樣本對的距離大,但距離小於margin即可。 margin:0.2 設計了兩種CNN結構。1.VGG類中加入了1*1 kernel。共22層。1.4億個引數。16FLOPS2.googlenet類基於Inception模型,其中兩個小模型NNS126M引數,220M FLOPSNNS24.3M引數,20M FLOPS。三個大模型NN3NN4NN2結構一樣,但輸入變小了。 NN2輸入:224×224NN3輸入:160×160NN4輸入:96×96。採用了l2 pooling,沒有用常規的max pooling,不知原委。 資料庫規模超大。800萬人,共2億幅影象。 無需對齊。

7. Deep FaceRecognition

精度上並沒有超越前人,但網路結構較易實現,而且提出了一些有很強實踐性的工作流程。

技術概括

提出了一個低成本的影象標註流程。 用最樸素的conv層不斷堆積建造了一個38層(另外還有40層、43層)的CNN2622個人的分類,學習識別訊號,最後用triplet loss學習驗證訊號,將特徵對映到一個歐氏距離空間用L2距離作為相似度。

一些值得反思的細節

資料庫:2600人,260萬幅影象。大約每人1000幅。 標註團隊:200人。 影象標註流程如下。1.建立人名列表和初步爬圖。主要集中於名人,便於從網上獲取大量樣本,共5000人,男女各半。再進行過濾,過濾掉樣本太少的、與lfw有重合的、按人名爬取的影象不準確的。最後剩下2622人,每人200幅。2.收集更多的影象。從其他搜尋引擎、關鍵詞加演員等附加詞,擴充到每人2000幅。3.用分類器自動過濾。訓練樣本採用搜尋引擎rank最高的50幅,用Fisher Vector訓練1對多SVM。最後保留每人2000幅中分數最高的1000幅。要訓練2622SVM,工作量巨大。4.去重。5.人工稽核加分類器自動過濾。訓練一個CNN,每個人分數低的樣本就丟棄。最後剩982803幅影象。前4步只花了4天,整個流程花了14天。 特徵維度:1024 CNN結構中不包括LRN 輸入減去了平均臉。沒有進行顏色擾動。 mi