格靈深瞳:人臉識別最新進展以及工業級大規模人臉識別實踐探討 | 公開課筆記

格靈深瞳:人臉識別最新進展以及工業級大規模人臉識別實踐探討 | 公開課筆記

來自專欄 AI科技大本營35 人贊了文章

作者 | 張德兵

編輯 | 阿司匹林

出品 | 人工智慧頭條(公眾號ID:AI_Thinker)

人臉識別已經成為成為計算機視覺領域最熱門的應用之一,很多剛入門的 AI 新手都或多或少接觸過人臉識別的相關知識,但是紙上得來終覺淺,在實際應用中,往往會遇到各種各樣的問題,比如如何保證不同環境下人臉識別的準確率,極端環境下如何進行人臉識別等等。

為了幫大家解惑,我們特意邀請到了格靈深瞳首席科學家和演算法部負責人——張德兵,為大家帶來主題為「一億 ID 的人臉識別訓練和萬億人臉對(Trillion Pairs)的人臉識別評測」的公開課。

本期的公開課主要包含以下 4 個方面的內容:

1、人臉識別背景介紹

2、人臉識別前沿演算法簡介

3、分散式人臉識別訓練

4、大規模人臉檢測平台介紹

本次公開課學習地址:一億ID的人臉識別訓練和萬億人臉對(Trillion Pairs)的人臉識別評測

以下是公開課文字版整理內容

一、人臉識別背景介紹

簡單來講,人臉識別這個問題,就是給定兩個人臉,然後判定他們是不是同一個人,這是它最原始的定義。它有很多應用場景,比如銀行櫃檯、海關、手機解鎖、酒店入住、網吧認證,會查身份證跟你是不是同一個人。這個應用的主要特點是,在大多數場景下都需要你先提供一個證件,然後跟自己的人臉做比對。手機解鎖可能是個例外,但也要求你提前註冊一張人臉,然後再進行比對。這是最原始的形式,由用戶直接提供需要對比的兩個人臉。這也是最簡單的形式,相當於做一個二分類。

進一步來講,如果想要去做人的搜索呢?比如我們有一個大小為 N 的人臉庫,有一張待檢索的圖片,讓我們判斷這個人有沒有在這個人臉庫中出現過。這種情況下,要回答的就有 N 個問題了,分別是:這個人臉是不是庫中的人臉1、是不是人臉2,一直到是不是人臉N。如果這 N 個問題回答都是「否」的話,就意味著這個人不在人臉庫裡面。不在人臉庫是一個很難的問題,等於 N 個問題都得回答對,然後才能真正確認它並不這個人臉庫里。

實際使用時一般是靜態的搜索,比如有一個公安的民警,他從視頻或者圖片里找到目標人物,把他的臉框出來,然後提交到系統里,在庫裡面做搜索。然後系統會返回,比如 Top K,K 一般是幾十或者100這個量級的數字,會按照相似度把這些人臉排出來,然後人工驗證到底哪些是對的。如果 Top 1 就是對的那最好,一般如果能夠排到 Top 10 就算是不錯的結果,但在 100 名以後的話,這個結果很難對使用的人有幫助了。如果允許TopK的話,這個底庫是可以做到比較大的,因為並沒有要求一定放到 Top 1。

公安評測時,在各個省公安的環境上做評測,底庫一般都比較大,到千萬的量級甚至到億的量級,這也是因為最近幾年深度學習發展的非常快。最早期時只能做靜態檢索,而且結果還不太好,隨著深度學習演算法的發展,現在很多公司的演算法都越來越好了,評測的時候也會很難區分各個廠家的演算法到底誰好誰壞,所以測試本身這個問題越來越難,用來檢索圖片的質量也越來越苛刻,實際應用中很多問題也很苛刻,比如嫌疑人在攝像頭裡出現距離比較遠,有側面的,或者帽子遮擋,戴眼鏡等現象。

給大家舉個例子,下面是我在互聯網上找到的明星的照片,在真實場景里 query 的質量跟這個差不多,有的時候比這些更難一點。現在主流人臉演算法解決這種問題時,當底庫是千萬量級時,top1是召回率還是很高的,百分之八九十的問題不是很大,甚至還會更高一些。

當然,在安防或者其他應用場景里有更難的任務,就是人臉的 N : N 搜索,這種情況下我們會有大量的攝像頭,每一個都在實時抓拍,有非常多待確認的抓拍人臉,同時庫也是相對比較大的。舉個例子,在安防領域,假設我們有 100 個攝像頭,然後每個攝像頭每天抓拍 1 萬個人,那麼總的搜索次數就是 100 萬次。假設這一天有 10 個嫌疑人被攝像頭抓拍到,假設我們需要在一個 10 萬大小的底庫裡面去搜索他們。我們有一個演算法,這個演算法這一天總報警 100 次,警察每一個都去確認,最後抓到了 9 個嫌疑人,這看起來還不錯,因為總共出現了 10 個人,抓到了 9 個,召回率是 90%。那我們來看看誤報率,100 次報警,對了 9 次,錯了 91 次,誤報率就是91 除以 100萬×10萬,大概算下來是 10億分之0.91,約為 10億分之1 的誤報率。

這個指標在現在的人臉識別演算法里還算比較不錯的了,但是在公安民警看來沒有那麼理想,因為他們出警了 100次,只抓到了 9 個人,他們非常想出警 10 次就抓到 9 個人,這樣成本就會低很多。那我們來看一下出警 10 次抓到 9 個人的誤報率是多少呢?看起來少了一個數量級,但實際上要求誤報率要提高兩個數量級,因為這個時候誤報的次數只有 1 次,1 除以 100萬×10萬,就是已經到了千億分之一,這個就非常難達到。即使有一個千億分之一的演算法也只能支持 100 個攝像頭的需求,在很多城市裡輕輕鬆鬆就有上萬個攝像頭,甚至幾十萬個。所以演算法還要在誤報率方面再降低 N 個數量級,或者要求我們有更聰明的使用方式,在還有很多研究的空間。

還有一類應用是人臉虛擬 ID 的聚類,虛擬 ID 就是我們不知道每個人的證件信息,只有大量的攝像頭抓拍結果,我們想根據這些人臉的圖像特徵和出現的時間、空間等先驗信息進行聚類,這樣可以挖掘用戶的軌跡和行為習慣。這些信息在很多場景下非常有用,最簡單的是人臉相冊的聚類,這個應用很簡單,因為你只需要在一個人的相冊里做聚類就可以了,庫很小。但在安防、零售等場景都是城市級的數據,這個做好的話可以帶來很有價值的信息,比如誰跟誰經常在一起活動,從 A 點到 B 點到 C 點到 D 點有什麼異常,像這些人員流動的異常,在很多地方,尤其是新疆、西藏等 ,大家都非常關注。

人臉識別的基本流程,首先要檢測到人臉,檢測到之後一般會做關鍵點的定位,把他的眼睛、鼻子、嘴角等信息都定位出來,利用這個信息對人臉做個矯正,把它變換到比較正情形,便於後面模型分析或者處理時各個部分更好的對齊。最終會提取得到一個人臉的描述特徵,通常是一個 100 多維到幾百維的特徵表達,然後我們用不同人臉特徵之間的相似度或者距離,相似度是越高越好,距離是越小越好,去刻畫兩個人之間的關係,再卡一個域值,來判斷這兩個人是否為一個人。這次我們講人臉識別主要就是最後的人臉特徵提取的部分。

二、人臉識別前沿演算法簡介

人臉識別傳統思路挺多的,我只列了一小部分。下面我們來一一回顧這些基本的演算法:

Baseline

首先是 Baseline,早在八十年代末就可以做基於 CNN 的分類了。如果想把這套東西用在人臉上的話只需要做簡單的替換。字元的輸入替換成矯正之後的人臉輸入。LeNet5 可以換成 ResNet 以及後面的各種改進。然後是分類,人臉有多少個 ID 就可以分多少類。然後我們訓練完網路後就有了特徵,比如可以把最後的 FC 的輸出當做人臉的特徵。

當然,也會有潛在的問題,如果類別太多,會不會訓練不動?比如你在做認證的應用時,每一類的訓練圖片會不會樣本太少?如果你在訓練集上的分類結果非常好,但對於新的 ID 怎樣呢?分類的模型訓練得好,能夠代表學到的特徵在人臉識別應用的時候非常好嗎?這些問題都有人在研究,有一些也會在後面的介紹中體現出來。

DeepID

DeepID 這個演算法是剛剛那個思路的具體實現,有一些更細節的調整,它在得到最終的人臉特徵之後,又做了一個基於概率統計的降維。它這個特徵也是多個特徵的融合體,你可以理解為它對人臉上的很多關鍵區域都訓練了一個 CNN 網路,去做分類,得到隱層特徵,把這些特徵拼接在一起,再做某種意義上的降維,得到最終特徵,用這個特徵來做描述。這是最早的 DeepID。

DeepID2

DeepID2 做得更細緻,它希望同一個人的特徵盡量近,不同人的特徵可以比較遠。兩張圖作為輸入 ,每一個都用一個 CNN 去提取特徵,這兩個 CNN 網路是共享參數的,通過這個 Siamese Network 來判斷他們是不是一個人。如果他們是一個人的話,我們要求特徵之間的歐式距離比較小,如果他們不是同一個人的話,我們希望他們之間的歐式距離至少大於等於 m。可以從這個 Loss 里看到,它一旦小於 m 就會受到懲罰,只有大於 m 時才是安全的。人們希望這種方法使得特徵的表達更清楚。這個方法不需要依賴特別大的 FC 層,不管你真實的人的ID有多少,你都是在做一個類似於二分類的事情。同時,它也可以跟之前的 DeepID1 裡面的 softmax 一起使用,這樣會有一些提升。

DeepID2+

DeepID2+ 做了一些小的修改,更多訓練樣本,更大的特徵維度,更多的監督信號,在網路中間的很多層都連接到了最終的分類和驗證的卷積函數,有點類似於 GoogLeNet,不過那時 GoogLeNet 還沒有出來。

DeepFace

DeepFace 在演算法上並沒有什麼特別的創新,它的改進在於對前面人臉預處理對齊的部分做了精細的調整,結果顯示會有一定的幫助,但是也有一些疑問,因為你要用 3D 的Alignment(對齊),在很多情況下,尤其是極端情況下,可能會失敗。人臉識別的演算法發展得非常快,有很多不同思路和做法,但是在不同的應用類型中是不是真的都能 work的比較好,需要嘗試之後才能下結論,不一定能普適的應用。

DeepID3

DeepID3 是 2015 年的工作,那一年正好是在 GoogLeNet 和 VGG 出來的那一年,所以作者把比較深的卷積網路模塊加進去了,有一些提高。

FaceNet

Google 的 FaceNet 不太一樣,它用的是 Triplet Loss,這跟它自己的數據量有直接關係,之前那幾個論文都是基於公開的數據,人臉 ID 數在 1 萬的量級左右。但 Google 的互聯網數據非常多,它做得最大的實驗用到了兩億六千萬的人臉數據,總 ID 數大概在 800 萬左右。所以在那個時候,Google 從一開始就用了 Triplet Loss,意思就是它有三個樣本的對,其中有一個叫 Anchor一個叫 Negative,一個叫Positive。Positive 的意思就是它跟 Anchor 是同一類的,如果跟 Anchor 不是同一類就是 Negative。

Center Loss

Center Loss 則更加直接一點,它做 Softmax 的時候不僅僅是分對,而是希望每一類更加緊湊一些,更加直接。它的 Loss 函數比較簡單,相當於 xi 是每張圖片的特徵,yi 是它的標籤,Cyi 就是對某個類的一個中心,相當於每張圖片的特徵在學,然後每個類的類中心同時也在學,希望屬於同一類的那些樣本的特徵都離它們自己的類中心比較近。這個跟 softmax 合併在一起出現一個新的 Loss,這樣學出來的特徵在歐氏距離下就更加能夠表達不同人臉之間的相似度關係。

前面幾個演算法都是相對比較傳統的、比較老一點的,在現在人臉識別系統里用得人比較少。總的來說,它們大部分都是從 Loss 設計方面做了改進,然後跟softmax進行配合。但 Google 是一個例外。然後下面幾個感覺更加有效的方法則基本都是在 softmax 的基礎上再進行深入的探索。

L-softmax

第一個比較重要的、改動比較大的工作是 L-softmax(Large-Margin Softmax),它的意思是我在做分類時,希望不同的類之間能夠區分得更開,把同一個類壓縮得更緊,但它跟之前的思路有一定的相似性,但並沒有通過額外的限制來做,它深入分析了 softmax loss 的形式,直接對這個形式做了精細的改動,把其中的cosθ改成了cosmθ,起到了增加 margin 的效果。這裡還有一些處理細節,比如當 mθ 超過一定範圍時要重新定義等等,但是大的思路比較容易理解。

A-softmax

A-softmax 則是在 L-softmax 上做了一個很小的修改。它們雖然是兩篇論文,但其他所有東西都跟 L-softmax 一模一樣。A-softmax 就是在考慮 m 倍的 θ 這個 margin 的同時要添加兩個限制條件,第一個是 W 的 norm 要是一個固定的值,我們把它的值固定為 1,其次我們把 B 直接設置為 0,因為它跟W相比只有一維維度,所以感覺上不太會很影響這個網路的表達能力,同時它還可以讓解釋變得非常自然,使得在這種情況下模型的預測僅僅取決於 W 和 X 之間的角度。但事實上,如果真的去嘗試這個演算法,會發現這個 margin 加的是非常強的,比如 θ 是 30 的時候,就是當某個樣本離它的類中心 已經只有30 度的情況下,在 m=2 的時候它會保守的認為,樣本離類中心還有 60 度,所以這個限制很強,是比較難優化的。真正用的時候是 softmax+α 倍的A-softmax 優化,α 一開始是約等於 0,等於是一開始在優化 softmax,隨著優化的進行,α 逐步有些提高,能起到一些 A-softmax+margin 的效果。

NormFace/CocoLoss

剛剛的 A-softmax 是從 margin 的角度來講的,後面出現了兩篇論文,NormFace 和 CocoLoss,是從 Norm 的角度來分析這個問題的。它在對 softmax 做改進的時候加了兩個限制,一個是特徵,每個樣本特徵的 Norm 要是 constant 的,就是希望所有樣本學出來的特徵模長都是固定的數字。同時,分類時有一個 W 的參數矩陣,希望參數矩陣的每一列 Norm 也都是一個固定的數字。

有兩篇論文同時看到了這一點,就是在不考慮 margin 的情況下,僅僅去考慮這兩個 Norm 的限制,聽起來是很簡單的思路,正好兩個工作也做重了,它倆幾乎在同一時間發表,內容也幾乎是一模一樣的。但這裡面我選擇介紹下 NormFace,它的論文分析看起來更深入一些,而且講到了normface 跟 triple loss(當用 agent 代替一個類中心的時候)之間的一些聯繫。還有一點,從這裡開始,人臉識別的特徵對比就不再用 L2 的距離了,基本上全面轉向了cos 距離。因為在這種情況下,L2 和 cos 距離其實是一樣的。

這點其實也是很重要的,我們可以看到在早期的 Google 的 FaceNet 裡面,它對feature也做了一個 Normalization,就說明它早就發現了這一點,這個對特徵做 Normalization 會有幫助。但是如果你想深入的看一看為什麼要對特徵做normalization,為什麼要加 margin 在 softmax 裡面?其實也有一些理論上的東西來分析這個,我可以跟大家介紹兩個簡單的想法。

FeatureIncay

FeatureIncay 論文里提到了兩點:

  • 第一,為什麼要 normalize 特徵?

有一個性質,如果大家仔細想一想的話會覺得非常有意思,就是當一個樣本如果已經處於分對的狀態,也就是說它已經距離自己類中心的 Wi 最近的的話,這時 softmax loss 本身會隨著這個 feature 的模長而遞減,也就是說如果你已經分對了,softmax 繼續優化的時候會朝著讓你模長更大的方向去走,但這對最終效果沒有任何幫助,因為只是模長在變,跟類中心的夾角並沒有改變,但是從 softmax 的角度來看,它的 loss 竟然下降了,就意味著我們不能自由的去學每一個樣本的特徵,我們希望它的特徵受到一些限制。Normalize 特徵,就是特徵模長受到限制,也就是 norm 等於 1 或者等於一個常數。

  • 第二,為什麼要加 margin?

同樣有一個類似的性質說,如果說你的特徵對於某個人臉的圖片分類已經概率很高了,比如它應該是屬於第 10 類的,你現在的模型預測出來它屬於第 10 類的概率非常高,比如已經0.999,這種情況下你去看樣本的梯度,發現它的梯度幾乎約等於 0。說明在某個樣本在幾乎分對的情況下,訓練過程不會再把這個樣本朝著這個樣本的類中心繼續壓縮了 ,默認的 softmax 是沒有產生margin 的能力的,所以 margin 這一項需要單獨加。

總之,直觀理解就是在 softmax 這個 loss 上,如果你想讓特徵學得更有意義和特徵更加緊湊,一定要單獨去考慮 feature 的 normalization 和 margin 應該怎麼加。

AMSoftmax/CosFace

關於 margin 剛剛只講了一個,就是 Asoftmax ,其實還有其他的幾種形式,第一個是AMSoftmax,還有一個叫 CosFace,這兩個是同樣的想法,內容也基本是一模一樣的。Margin 是指的類似於 SVM 裡面的那種分類面之間要有一個間隔,通過最大化這個間隔把兩個類分得更開。在 AMSoftmax 裡面本來 xi 和類中心的距離是 cosθ,不管是 ASoftmax 還是 AMSoftmax,都是想把這個數字變小一點,它本來相似度已經 0.99 了,我希望讓它更小一點,使得它不要那麼快達到我想要的值,對它做更強的限制,對它有更高的要求,所以它減 m 就相當於這個東西變得更小了,xi 屬於應該在那個類的概率就更難達到 99% 或者 1,這個 θ 角必須要更小,這個概率才能更接近 1,才能達到我們想要的標準。右邊也是一樣的,這兩個公式幾乎完全一模一樣,同時大家都在要求 W 的 norm 要是固定的,x 的 Norm 要是固定的,我們只關心 cos 距離

InsightFace/ArcFace

?第三個跟前面的兩個非常像,叫 InsightFace,也叫 ArcFace,雖然是兩個不同的名字,但實際上是一篇論文。這三種方式都是讓 cosθ 變得更小,第一個是通過 θ 乘以 m 的方式變小,第二個是通過 cosθ 減 m 的方式讓 cosθ 變小,第三個是通過 θ 加 m 的方式讓 cosθ 變小。因為 cos 這個函數對 θ 是單調遞減的,所以讓這個函數變小,第一種是讓 cos 減去一個值,第二種是讓裡面的 θ 變大,變大有幾種方式,一種是乘以 m,一種是加 m,其實這三種方式是可以統一起的。

文裡面作者提到, ArcFace 跟 CosineFace 相比,在訓練一開始,所有類之間每個類的樣本跟它類中心的距離是比較遠的,隨著訓練進行,它們越來越緊湊 ,ArcFace 可以做到更加緊湊的

同時,這三種方法可以和合併成一個公式,可以在 θ 上乘一個 m,然後再加上一個 m2,cos 算完之後可以減 m3,這三個參數,不管哪個調整,都可以讓函數比原來設定得更小,這在 softmax 裡面就意味著加了更強的 margin。有些實驗結果表明,單獨調每一個都不一定是最優的,它們聯合起來調整可能有更好的結果。但在幾何上具體是怎樣的現象,就比較難以描述,可能需要更多的研究。

新的演算法簡單就回顧到這裡,這些演算法大家平時用起來不會覺得有些問題,在學術界公開的訓練集上也能得到比較好的效果。但是學術界跟工業級是有很大區別的,主要的幾個區別在於以下幾個方面:圖片量、每個ID的平均人臉數量、人臉ID數、顯存佔用、訓練時間。

三、分散式人臉識別訓練

我們設計了簡單的分散式人臉識別的訓練框架,想法很簡單,就是數據並行+模型並行。

首先是數據並行,假設我們有 N 個計算節點,N 台機器,每台機器有 M 張卡。首先,我們通過數據並行,把一個大的 batch 平均分到每張卡上,然後每張卡跑一個同樣參數的 CNN 網路,得到那部分數據的特徵,然後對這些特徵做多級多卡的匯聚,得到所有 batch 裡面數據總的特徵是X。為什麼要做特徵匯聚?主要是因為後面的模型並行。

模型並行把原來一張卡上的 W 參數矩陣平均拆分到多張卡上,舉個例子,現在讓第一張卡來負責預測每個樣本屬於 0-10萬 類的概率,第二張卡預測屬於 10萬-20萬 類的概率,比如一個卡負責 10萬類,總共我們有 100 張卡的話,那就可以做 1000 萬類的分類。參數拆分之後,每張卡上就可以計算每個樣本屬於每個類的概率了,但這個地方需要通信,因為你要計算類別的話,需要做一個指數操作,然後得到所有卡的指數的總和,然後除一下才能知道。但好處是通信量很小,每張卡只需要負責計算它自己那部分的和,然後把這個和同步給其它GPU就可以了,而和的話就只有一個數字(當然這裡有一些細節,如果考慮到計算穩定性還需要同步比如像最大值之類的信息,但通信代價都很小)。

一旦計算出了每張卡上每個樣本屬於自己卡負責這部分類別的概率之後,剩下的事就容易做了,因為我們看到下圖中的偏微分公式,它只依賴於這個 Pk 的概率,我們得到了這個 Pk 概率之後,就可以直接寫出來目標函數相對於算出來的 fk 的導數是什麼,相當於你可以同時拿到損失函數對 W 的導數和對 X 的導數。但損失函數是被拆分在多張不同的卡上,所以對 X 這部分導數還需要做多機多卡的匯聚,得到對總的特徵的導數。對 W 參數的導數,每張卡是獨立的,互相之間並不影響,所以每張卡自己更新就行了,也沒有通信傳遞。對所有 X 的梯度求和的通信量也不大,得到對 X 的導數之後可以沿著前面正向傳播的路徑,多機多卡的反向傳播過去就可以了。

數據並行是很成熟的技術,比如之前有很多報道,說很多人都可以在多級多卡的環境裡面訓練 ImageNet 的數據集,好像大概一個多小時就能訓完了。我們把模型並行這部分也加進去了。模型並行也沒有那麼複雜,主要是考慮機器之間的通信量能受控就可以。所以這樣的思路實現起來比較簡單,而且可以把模型顯存佔用和計算量都均勻分散到每個 GPU 上,實現線性加速,也沒有增加額外的通信帶寬,甚至它降低了 FC 層的梯度更新所需要的帶寬。原來 W 矩陣不做拆分的時候,多張卡之間要同步對 W 的梯度,W 拆分到每張卡之後梯度反而不需要同步了。

這樣的情況下,我們測試實際的網路環境可以支持 100 卡以上的訓練,在 512 維特徵的情況下做到幾千萬類的人臉識別,如果維度降低一點,比如壓縮到 128 維,可以支持到上億類的人臉識別,而且隨著卡的增長,也不會帶來的性能損失,基本上是線性加速。它的好處是支持大部分主流損失函數的擴展。

下面是一個簡單演算法的效果展示,基於這種思路,不做其他的修改,在數據量還可以的情況下,很容易做到億分之一的誤識別率,召回率在 90% 左右,如果是互聯網產品可能更高一點。但是我剛剛在前面也說了,隨著人臉庫數量的增加和攝像頭抓拍量的增加,億分之一的識別率還是會有很多誤報的,需要持續改進。

還有很多影響人臉識別的重要因素,我這裡簡單列一下,感興趣的同學可以去關註:

這裡我標紅了「模型測評」,評測是件非常難的事,我們針對不同的應用場景做了十幾個不同類型的評測 ,因為評測做的不好的話,會影響模型設計,讓你判斷不清楚哪個模型好、哪個模型差。

四、大規模人臉評測平台介紹

之所以要做這個事情有幾個原因:

第一,學術界曾經有很多非常有名的測試集,比如 LFW 有 6000 對人臉 1:1 認證。但現在有很多演算法都可以達到 99% 以上甚至 99.8% 的好成績,所以這個效果已經不能很好的衡量演算法的好壞了,可能兩個同樣在 LFW 上達到 99.8% 的演算法,換一個數據集時結果會差很多。

第二,MegaFace 在學術界也是非常有名的。它的測試條件是在 100 萬干擾項中找到目標人臉,一開始的時候大家覺得這是個很難的問題,但隨著學術界幾年的研究,排行榜的第一名已經超過 98.9% 了,看起來也有一定的飽和趨勢。這裡面一開始是有些噪音的,後來被一些研究人員發現之後做了些清理,就發現這個測試集沒有想像得那麼難。另外,它提供的正樣本人臉對的比較有限,正樣本每個人的變化並不是特別的大,導致這個問題可能並沒有一開始大家預想的那麼難。

於是,我們想辦法去擴充做一個更大規模的訓練集,希望做更客觀的評測,幫助在人臉方面做研究的同行們有一個未來幾年還可以繼續用的測試平台。我們做了兩件事情,第一個是做一個比較大的人臉訓練集,第二個是做比較大的人臉測試集。訓練集大概是有 18 萬人,共有 680 萬張圖片左右,測試集大概有 187 萬的人臉。

下面簡單介紹這些訓練集的製作及清理過程,訓練集一部分是基於公開的 MS-Celeb 上做了清理,去掉了重複的名人,然後又收集了一個亞洲人的名人庫,大概也有 10 萬個ID,再把兩個合併一起做除重,最後合併數據。MS 這個數據集有兩種雜訊,一個是類內的雜訊 ,也就是說每個類並不只包含一個人。還有一個是類間的雜訊,同一個演員出現在不同的電影裡面,或者有多個不同的名字,就被分在兩個不同的類裡面。

清理流程是首先檢測和align之後,用一個比較好的模型去提特徵,在這個過程中順帶可以把原來數據集中的誤檢測去掉。具體清理的時候,我們對原來每個類都做一個層次聚類。我們為了數據集的純凈,只把每個原始類裡面聚類之後最大的簇保留起來,保證每個類別里是足夠c lean的。但每個類只保留最大的簇是不是最好也值得商榷,現在初步的版本是保留最大的。

第二個是減少類間的錯誤 ,比如這兩類是同一個人,但一個是電影角色的名字,一個是他自己的名字。當初M s-celeb數 據集在整理的時候,是用圖片和它周圍的文本信息做的聚類,所以它不可避免會有一定比例的這方面的錯誤。我們做清理的時候,首先對每個類得到它的主簇,然後兩個不同的類,如果我們去比較兩個類中任何兩個圖之間的最小距離,如果發現它們小於某個閾值的話,說明兩個類有可能可以被合併 ,然後讓標註員標註一下,確定真的是同一個人的話就會標在一起,通過這種方式來儘可能減少類間錯誤 。

還有亞洲的名人數據集,因為之前的 MS 中歐美人比較多,我們又爬了大概十幾萬的亞洲名人的數據,經過類似的清理過程,最終得到了 10 萬的 ID,200 多萬的人臉。總的來說,亞洲名人數據集跟原始的 MS 相比,會更不均衡一些,怎麼去解決不均衡以及跨 domian 的問題,就先留給研究人員去探索了。

關於測試集也有類似的製作邏輯,只不過測試集我們花了更大的功夫,因為測試集對準確性要求更高。之前的訓練集裡面是把所有的 LFW 裡面那些 5000 個名人全都排除了,這樣我們測試集可以基於 LFW 來做,測試集的 query 全部來自於 LFW 裡面的這些名人,然後我們基於這個名人列表爬了更多的名人日常照片,然後爬取的160 萬的干擾項,然後互相之間除重之後最終變成一個大的 TestSet。

可以看到,我們新做的評測集檢測圖片的類別差異非常豐富,比如戴眼鏡、側臉、很大的表情、化妝、年齡變化、光線影響、黑白、戴帽子等等,常見的變化都在會在裡面。

評測標準如下圖所示:

這個比賽還是比較有挑戰的,我們把 InsightFace 演算法在 ResNet50 上的結果拿到我們的評測框架里去測的時候,發現在誤識率為十億分之一時,它的召回率大概只有 50% 不到,所以有很高的提升空間。

那麼怎樣能參與這個測試?詳見:trillionpairs.deepglint.com


推薦閱讀:

TAG:人臉識別 | 計算機視覺 | 格靈深瞳 |