▌一、人臉識別背景介紹
簡單來講,人臉識別這個問題,就是給定兩個人臉,然后判定他們是不是同一個人,這是它最原始的定義。它有很多應用場景,比如銀行柜臺、海關、手機解鎖、酒店入住、網吧認證,會查身份證跟你是不是同一個人。這個應用的主要特點是,在大多數場景下都需要你先提供一個證件,然后跟自己的人臉做比對。手機解鎖可能是個例外,但也要求你提前注冊一張人臉,然后再進行比對。這是最原始的形式,由用戶直接提供需要對比的兩個人臉。這也是最簡單的形式,相當于做一個二分類。
進一步來講,如果想要去做人的搜索呢?比如我們有一個大小為 N 的人臉庫,有一張待檢索的圖片,讓我們判斷這個人有沒有在這個人臉庫中出現過。這種情況下,要回答的就有 N 個問題了,分別是:這個人臉是不是庫中的人臉1、是不是人臉2,一直到是不是人臉N。如果這 N 個問題回答都是“否”的話,就意味著這個人不在人臉庫里面。不在人臉庫是一個很難的問題,等于 N 個問題都得回答對,然后才能真正確認它并不這個人臉庫里。
實際使用時一般是靜態(tài)的搜索,比如有一個公安的民警,他從視頻或者圖片里找到目標人物,把他的臉框出來,然后提交到系統(tǒng)里,在庫里面做搜索。然后系統(tǒng)會返回,比如 Top K,K 一般是幾十或者100這個量級的數字,會按照相似度把這些人臉排出來,然后人工驗證到底哪些是對的。如果 Top 1 就是對的那最好,一般如果能夠排到 Top 10 就算是不錯的結果,但在 100 名以后的話,這個結果很難對使用的人有幫助了。如果允許TopK的話,這個底庫是可以做到比較大的,因為并沒有要求一定放到 Top 1。
公安評測時,在各個省公安的環(huán)境上做評測,底庫一般都比較大,到千萬的量級甚至到億的量級,這也是因為最近幾年深度學習發(fā)展的非??臁W钤缙跁r只能做靜態(tài)檢索,而且結果還不太好,隨著深度學習算法的發(fā)展,現在很多公司的算法都越來越好了,評測的時候也會很難區(qū)分各個廠家的算法到底誰好誰壞,所以測試本身這個問題越來越難,用來檢索圖片的質量也越來越苛刻,實際應用中很多問題也很苛刻,比如嫌疑人在攝像頭里出現距離比較遠,有側面的,或者帽子遮擋,戴眼鏡等現象。
給大家舉個例子,下面是我在互聯網上找到的明星的照片,在真實場景里 query 的質量跟這個差不多,有的時候比這些更難一點?,F在主流人臉算法解決這種問題時,當底庫是千萬量級時,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 多維到幾百維的特征表達,然后我們用不同人臉特征之間的相似度或者距離,相似度是越高越好,距離是越小越好,去刻畫兩個人之間的關系,再卡一個域值,來判斷這兩個人是否為一個人。這次我們講人臉識別主要就是最后的人臉特征提取的部分。
▌二、人臉識別前沿算法簡介
人臉識別傳統(tǒng)思路挺多的,我只列了一小部分。下面我們來一一回顧這些基本的算法:
Baseline
首先是 Baseline,早在八十年代末就可以做基于 CNN 的分類了。如果想把這套東西用在人臉上的話只需要做簡單的替換。字符的輸入替換成矯正之后的人臉輸入。LeNet5 可以換成 ResNet 以及后面的各種改進。然后是分類,人臉有多少個 ID 就可以分多少類。然后我們訓練完網絡后就有了特征,比如可以把最后的 FC 的輸出當做人臉的特征。
當然,也會有潛在的問題,如果類別太多,會不會訓練不動?比如你在做認證的應用時,每一類的訓練圖片會不會樣本太少?如果你在訓練集上的分類結果非常好,但對于新的 ID 怎樣呢?分類的模型訓練得好,能夠代表學到的特征在人臉識別應用的時候非常好嗎?這些問題都有人在研究,有一些也會在后面的介紹中體現出來。
DeepID
DeepID 這個算法是剛剛那個思路的具體實現,有一些更細節(jié)的調整,它在得到最終的人臉特征之后,又做了一個基于概率統(tǒng)計的降維。它這個特征也是多個特征的融合體,你可以理解為它對人臉上的很多關鍵區(qū)域都訓練了一個 CNN 網絡,去做分類,得到隱層特征,把這些特征拼接在一起,再做某種意義上的降維,得到最終特征,用這個特征來做描述。這是最早的 DeepID。
DeepID2
DeepID2 做得更細致,它希望同一個人的特征盡量近,不同人的特征可以比較遠。兩張圖作為輸入 ,每一個都用一個 CNN 去提取特征,這兩個 CNN 網絡是共享參數的,通過這個 Siamese Network 來判斷他們是不是一個人。如果他們是一個人的話,我們要求特征之間的歐式距離比較小,如果他們不是同一個人的話,我們希望他們之間的歐式距離至少大于等于 m??梢詮倪@個 Loss 里看到,它一旦小于 m 就會受到懲罰,只有大于 m 時才是安全的。人們希望這種方法使得特征的表達更清楚。這個方法不需要依賴特別大的 FC 層,不管你真實的人的ID有多少,你都是在做一個類似于二分類的事情。同時,它也可以跟之前的 DeepID1 里面的 softmax 一起使用,這樣會有一些提升。
DeepID2+
DeepID2+ 做了一些小的修改,更多訓練樣本,更大的特征維度,更多的監(jiān)督信號,在網絡中間的很多層都連接到了最終的分類和驗證的卷積函數,有點類似于 GoogLeNet,不過那時 GoogLeNet 還沒有出來。
DeepFace
DeepFace 在算法上并沒有什么特別的創(chuàng)新,它的改進在于對前面人臉預處理對齊的部分做了精細的調整,結果顯示會有一定的幫助,但是也有一些疑問,因為你要用 3D 的Alignment(對齊),在很多情況下,尤其是極端情況下,可能會失敗。人臉識別的算法發(fā)展得非???有很多不同思路和做法,但是在不同的應用類型中是不是真的都能 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,這樣學出來的特征在歐氏距離下就更加能夠表達不同人臉之間的相似度關系。
前面幾個算法都是相對比較傳統(tǒng)的、比較老一點的,在現在人臉識別系統(tǒng)里用得人比較少??偟膩碚f,它們大部分都是從 Loss 設計方面做了改進,然后跟softmax進行配合。但 Google 是一個例外。然后下面幾個感覺更加有效的方法則基本都是在 softmax 的基礎上再進行深入的探索。
L-softmax
第一個比較重要的、改動比較大的工作是 L-softmax(Large-Margin Softmax),它的意思是我在做分類時,希望不同的類之間能夠區(qū)分得更開,把同一個類壓縮得更緊,但它跟之前的思路有一定的相似性,但并沒有通過額外的限制來做,它深入分析了 softmax loss 的形式,直接對這個形式做了精細的改動,把其中的cosθ改成了cosmθ,起到了增加 margin 的效果。這里還有一些處理細節(jié),比如當 mθ 超過一定范圍時要重新定義等等,但是大的思路比較容易理解。
A-softmax
A-softmax 則是在 L-softmax 上做了一個很小的修改。它們雖然是兩篇論文,但其他所有東西都跟 L-softmax 一模一樣。A-softmax 就是在考慮 m 倍的 θ 這個 margin 的同時要添加兩個限制條件,第一個是 W 的 norm 要是一個固定的值,我們把它的值固定為 1,其次我們把 B 直接設置為 0,因為它跟W相比只有一維維度,所以感覺上不太會很影響這個網絡的表達能力,同時它還可以讓解釋變得非常自然,使得在這種情況下模型的預測僅僅取決于 W 和 X 之間的角度。但事實上,如果真的去嘗試這個算法,會發(fā)現這個 margin 加的是非常強的,比如 θ 是 30 的時候,就是當某個樣本離它的類中心 已經只有30 度的情況下,在 m=2 的時候它會保守的認為,樣本離類中心還有 60 度,所以這個限制很強,是比較難優(yōu)化的。真正用的時候是 softmax+α 倍的A-softmax 優(yōu)化,α 一開始是約等于 0,等于是一開始在優(yōu)化 softmax,隨著優(yōu)化的進行,α 逐步有些提高,能起到一些 A-softmax+margin 的效果。
NormFace/CocoLoss
剛剛的 A-softmax 是從 margin 的角度來講的,后面出現了兩篇論文,NormFace 和 CocoLoss,是從 Norm 的角度來分析這個問題的。它在對 softmax 做改進的時候加了兩個限制,一個是特征,每個樣本特征的 Norm 要是 constant 的,就是希望所有樣本學出來的特征模長都是固定的數字。同時,分類時有一個 W 的參數矩陣,希望參數矩陣的每一列 Norm 也都是一個固定的數字。
有兩篇論文同時看到了這一點,就是在不考慮 margin 的情況下,僅僅去考慮這兩個 Norm 的限制,聽起來是很簡單的思路,正好兩個工作也做重了,它倆幾乎在同一時間發(fā)表,內容也幾乎是一模一樣的。但這里面我選擇介紹下 NormFace,它的論文分析看起來更深入一些,而且講到了normface 跟 triple loss(當用 agent 代替一個類中心的時候)之間的一些聯系。還有一點,從這里開始,人臉識別的特征對比就不再用 L2 的距離了,基本上全面轉向了cos 距離。因為在這種情況下,L2 和 cos 距離其實是一樣的。
這點其實也是很重要的,我們可以看到在早期的 Google 的 FaceNet 里面,它對feature也做了一個 Normalization,就說明它早就發(fā)現了這一點,這個對特征做 Normalization 會有幫助。但是如果你想深入的看一看為什么要對特征做normalization,為什么要加 margin 在 softmax 里面?其實也有一些理論上的東西來分析這個,我可以跟大家介紹兩個簡單的想法。
FeatureIncay
FeatureIncay 論文里提到了兩點:
第一,為什么要 normalize 特征?
有一個性質,如果大家仔細想一想的話會覺得非常有意思,就是當一個樣本如果已經處于分對的狀態(tài),也就是說它已經距離自己類中心的 Wi 最近的的話,這時 softmax loss 本身會隨著這個 feature 的模長而遞減,也就是說如果你已經分對了,softmax 繼續(xù)優(yōu)化的時候會朝著讓你模長更大的方向去走,但這對最終效果沒有任何幫助,因為只是模長在變,跟類中心的夾角并沒有改變,但是從 softmax 的角度來看,它的 loss 竟然下降了,就意味著我們不能自由的去學每一個樣本的特征,我們希望它的特征受到一些限制。Normalize 特征,就是特征模長受到限制,也就是 norm 等于 1 或者等于一個常數。
第二,為什么要加 margin?
同樣有一個類似的性質說,如果說你的特征對于某個人臉的圖片分類已經概率很高了,比如它應該是屬于第 10 類的,你現在的模型預測出來它屬于第 10 類的概率非常高,比如已經0.999,這種情況下你去看樣本的梯度,發(fā)現它的梯度幾乎約等于 0。說明在某個樣本在幾乎分對的情況下,訓練過程不會再把這個樣本朝著這個樣本的類中心繼續(xù)壓縮了 ,默認的 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,其實這三種方式是可以統(tǒng)一起的。
文里面作者提到, ArcFace 跟 CosineFace 相比,在訓練一開始,所有類之間每個類的樣本跟它類中心的距離是比較遠的,隨著訓練進行,它們越來越緊湊 ,ArcFace 可以做到更加緊湊的
同時,這三種方法可以和合并成一個公式,可以在 θ 上乘一個 m,然后再加上一個 m2,cos 算完之后可以減 m3,這三個參數,不管哪個調整,都可以讓函數比原來設定得更小,這在 softmax 里面就意味著加了更強的 margin。有些實驗結果表明,單獨調每一個都不一定是最優(yōu)的,它們聯合起來調整可能有更好的結果。但在幾何上具體是怎樣的現象,就比較難以描述,可能需要更多的研究。
新的算法簡單就回顧到這里,這些算法大家平時用起來不會覺得有些問題,在學術界公開的訓練集上也能得到比較好的效果。但是學術界跟工業(yè)級是有很大區(qū)別的,主要的幾個區(qū)別在于以下幾個方面:圖片量、每個ID的平均人臉數量、人臉I(yè)D數、顯存占用、訓練時間。
▌三、分布式人臉識別訓練
我們設計了簡單的分布式人臉識別的訓練框架,想法很簡單,就是數據并行+模型并行。
首先是數據并行,假設我們有 N 個計算節(jié)點,N 臺機器,每臺機器有 M 張卡。首先,我們通過數據并行,把一個大的 batch 平均分到每張卡上,然后每張卡跑一個同樣參數的 CNN 網絡,得到那部分數據的特征,然后對這些特征做多級多卡的匯聚,得到所有 batch 里面數據總的特征是X。為什么要做特征匯聚?主要是因為后面的模型并行。
模型并行把原來一張卡上的 W 參數矩陣平均拆分到多張卡上,舉個例子,現在讓第一張卡來負責預測每個樣本屬于 0-10萬 類的概率,第二張卡預測屬于 10萬-20萬 類的概率,比如一個卡負責 10萬類,總共我們有 100 張卡的話,那就可以做 1000 萬類的分類。參數拆分之后,每張卡上就可以計算每個樣本屬于每個類的概率了,但這個地方需要通信,因為你要計算類別的話,需要做一個指數操作,然后得到所有卡的指數的總和,然后除一下才能知道。但好處是通信量很小,每張卡只需要負責計算它自己那部分的和,然后把這個和同步給其它GPU就可以了,而和的話就只有一個數字(當然這里有一些細節(jié),如果考慮到計算穩(wěn)定性還需要同步比如像最大值之類的信息,但通信代價都很小)。
一旦計算出了每張卡上每個樣本屬于自己卡負責這部分類別的概率之后,剩下的事就容易做了,因為我們看到下圖中的偏微分公式,它只依賴于這個 Pk 的概率,我們得到了這個 Pk 概率之后,就可以直接寫出來目標函數相對于算出來的 fk 的導數是什么,相當于你可以同時拿到損失函數對 W 的導數和對 X 的導數。但損失函數是被拆分在多張不同的卡上,所以對 X 這部分導數還需要做多機多卡的匯聚,得到對總的特征的導數。對 W 參數的導數,每張卡是獨立的,互相之間并不影響,所以每張卡自己更新就行了,也沒有通信傳遞。對所有 X 的梯度求和的通信量也不大,得到對 X 的導數之后可以沿著前面正向傳播的路徑,多機多卡的反向傳播過去就可以了。
數據并行是很成熟的技術,比如之前有很多報道,說很多人都可以在多級多卡的環(huán)境里面訓練 ImageNet 的數據集,好像大概一個多小時就能訓完了。我們把模型并行這部分也加進去了。模型并行也沒有那么復雜,主要是考慮機器之間的通信量能受控就可以。所以這樣的思路實現起來比較簡單,而且可以把模型顯存占用和計算量都均勻分散到每個 GPU 上,實現線性加速,也沒有增加額外的通信帶寬,甚至它降低了 FC 層的梯度更新所需要的帶寬。原來 W 矩陣不做拆分的時候,多張卡之間要同步對 W 的梯度,W 拆分到每張卡之后梯度反而不需要同步了。
這樣的情況下,我們測試實際的網絡環(huán)境可以支持 100 卡以上的訓練,在 512 維特征的情況下做到幾千萬類的人臉識別,如果維度降低一點,比如壓縮到 128 維,可以支持到上億類的人臉識別,而且隨著卡的增長,也不會帶來的性能損失,基本上是線性加速。它的好處是支持大部分主流損失函數的擴展。
下面是一個簡單算法的效果展示,基于這種思路,不做其他的修改,在數據量還可以的情況下,很容易做到億分之一的誤識別率,召回率在 90% 左右,如果是互聯網產品可能更高一點。但是我剛剛在前面也說了,隨著人臉庫數量的增加和攝像頭抓拍量的增加,億分之一的識別率還是會有很多誤報的,需要持續(xù)改進。
還有很多影響人臉識別的重要因素,我這里簡單列一下,感興趣的同學可以去關注:
這里我標紅了“模型測評”,評測是件非常難的事,我們針對不同的應用場景做了十幾個不同類型的評測 ,因為評測做的不好的話,會影響模型設計,讓你判斷不清楚哪個模型好、哪個模型差。
▌四、大規(guī)模人臉評測平臺介紹
之所以要做這個事情有幾個原因:
第一,學術界曾經有很多非常有名的測試集,比如 LFW 有 6000 對人臉 1:1 認證。但現在有很多算法都可以達到 99% 以上甚至 99.8% 的好成績,所以這個效果已經不能很好的衡量算法的好壞了,可能兩個同樣在 LFW 上達到 99.8% 的算法,換一個數據集時結果會差很多。
第二,MegaFace 在學術界也是非常有名的。它的測試條件是在 100 萬干擾項中找到目標人臉,一開始的時候大家覺得這是個很難的問題,但隨著學術界幾年的研究,排行榜的第一名已經超過 98.9% 了,看起來也有一定的飽和趨勢。這里面一開始是有些噪音的,后來被一些研究人員發(fā)現之后做了些清理,就發(fā)現這個測試集沒有想象得那么難。另外,它提供的正樣本人臉對的比較有限,正樣本每個人的變化并不是特別的大,導致這個問題可能并沒有一開始大家預想的那么難。
于是,我們想辦法去擴充做一個更大規(guī)模的訓練集,希望做更客觀的評測,幫助在人臉方面做研究的同行們有一個未來幾年還可以繼續(xù)用的測試平臺。我們做了兩件事情,第一個是做一個比較大的人臉訓練集,第二個是做比較大的人臉測試集。訓練集大概是有 18 萬人,共有 680 萬張圖片左右,測試集大概有 187 萬的人臉。
下面簡單介紹這些訓練集的制作及清理過程,訓練集一部分是基于公開的 MS-Celeb 上做了清理,去掉了重復的名人,然后又收集了一個亞洲人的名人庫,大概也有 10 萬個ID,再把兩個合并一起做除重,最后合并數據。MS 這個數據集有兩種噪聲,一個是類內的噪聲 ,也就是說每個類并不只包含一個人。還有一個是類間的噪聲,同一個演員出現在不同的電影里面,或者有多個不同的名字,就被分在兩個不同的類里面。
清理流程是首先檢測和align之后,用一個比較好的模型去提特征,在這個過程中順帶可以把原來數據集中的誤檢測去掉。具體清理的時候,我們對原來每個類都做一個層次聚類。我們?yōu)榱藬祿募儍?只把每個原始類里面聚類之后最大的簇保留起來,保證每個類別里是足夠c lean的。但每個類只保留最大的簇是不是最好也值得商榷,現在初步的版本是保留最大的。
第二個是減少類間的錯誤 ,比如這兩類是同一個人,但一個是電影角色的名字,一個是他自己的名字。當初M s-celeb數 據集在整理的時候,是用圖片和它周圍的文本信息做的聚類,所以它不可避免會有一定比例的這方面的錯誤。我們做清理的時候,首先對每個類得到它的主簇,然后兩個不同的類,如果我們去比較兩個類中任何兩個圖之間的最小距離,如果發(fā)現它們小于某個閾值的話,說明兩個類有可能可以被合并 ,然后讓標注員標注一下,確定真的是同一個人的話就會標在一起,通過這種方式來盡可能減少類間錯誤 。
還有亞洲的名人數據集,因為之前的 MS 中歐美人比較多,我們又爬了大概十幾萬的亞洲名人的數據,經過類似的清理過程,最終得到了 10 萬的 ID,200 多萬的人臉??偟膩碚f,亞洲名人數據集跟原始的 MS 相比,會更不均衡一些,怎么去解決不均衡以及跨 domian 的問題,就先留給研究人員去探索了。
關于測試集也有類似的制作邏輯,只不過測試集我們花了更大的功夫,因為測試集對準確性要求更高。之前的訓練集里面是把所有的 LFW 里面那些 5000 個名人全都排除了,這樣我們測試集可以基于 LFW 來做,測試集的 query 全部來自于 LFW 里面的這些名人,然后我們基于這個名人列表爬了更多的名人日常照片,然后爬取的160 萬的干擾項,然后互相之間除重之后最終變成一個大的 TestSet。
可以看到,我們新做的評測集檢測圖片的類別差異非常豐富,比如戴眼鏡、側臉、很大的表情、化妝、年齡變化、光線影響、黑白、戴帽子等等,常見的變化都在會在里面。
評測標準如下圖所示:
這個比賽還是比較有挑戰(zhàn)的,我們把 InsightFace 算法在 ResNet50 上的結果拿到我們的評測框架里去測的時候,發(fā)現在誤識率為十億分之一時,它的召回率大概只有 50% 不到,所以有很高的提升空間。
原文標題:格靈深瞳:人臉識別最新進展以及工業(yè)級大規(guī)模人臉識別實踐探討 | 公開課筆記
文章出處:【微信號:AI_Thinker,微信公眾號:人工智能頭條】歡迎添加關注!文章轉載請注明出處。