▌一、人臉識(shí)別背景介紹
簡(jiǎn)單來(lái)講,人臉識(shí)別這個(gè)問(wèn)題,就是給定兩個(gè)人臉,然后判定他們是不是同一個(gè)人,這是它最原始的定義。它有很多應(yīng)用場(chǎng)景,比如銀行柜臺(tái)、海關(guān)、手機(jī)解鎖、酒店入住、網(wǎng)吧認(rèn)證,會(huì)查身份證跟你是不是同一個(gè)人。這個(gè)應(yīng)用的主要特點(diǎn)是,在大多數(shù)場(chǎng)景下都需要你先提供一個(gè)證件,然后跟自己的人臉做比對(duì)。手機(jī)解鎖可能是個(gè)例外,但也要求你提前注冊(cè)一張人臉,然后再進(jìn)行比對(duì)。這是最原始的形式,由用戶(hù)直接提供需要對(duì)比的兩個(gè)人臉。這也是最簡(jiǎn)單的形式,相當(dāng)于做一個(gè)二分類(lèi)。
進(jìn)一步來(lái)講,如果想要去做人的搜索呢?比如我們有一個(gè)大小為 N 的人臉庫(kù),有一張待檢索的圖片,讓我們判斷這個(gè)人有沒(méi)有在這個(gè)人臉庫(kù)中出現(xiàn)過(guò)。這種情況下,要回答的就有 N 個(gè)問(wèn)題了,分別是:這個(gè)人臉是不是庫(kù)中的人臉1、是不是人臉2,一直到是不是人臉N。如果這 N 個(gè)問(wèn)題回答都是“否”的話(huà),就意味著這個(gè)人不在人臉庫(kù)里面。不在人臉庫(kù)是一個(gè)很難的問(wèn)題,等于 N 個(gè)問(wèn)題都得回答對(duì),然后才能真正確認(rèn)它并不這個(gè)人臉庫(kù)里。
實(shí)際使用時(shí)一般是靜態(tài)的搜索,比如有一個(gè)公安的民警,他從視頻或者圖片里找到目標(biāo)人物,把他的臉框出來(lái),然后提交到系統(tǒng)里,在庫(kù)里面做搜索。然后系統(tǒng)會(huì)返回,比如 Top K,K 一般是幾十或者100這個(gè)量級(jí)的數(shù)字,會(huì)按照相似度把這些人臉排出來(lái),然后人工驗(yàn)證到底哪些是對(duì)的。如果 Top 1 就是對(duì)的那最好,一般如果能夠排到 Top 10 就算是不錯(cuò)的結(jié)果,但在 100 名以后的話(huà),這個(gè)結(jié)果很難對(duì)使用的人有幫助了。如果允許TopK的話(huà),這個(gè)底庫(kù)是可以做到比較大的,因?yàn)椴](méi)有要求一定放到 Top 1。
公安評(píng)測(cè)時(shí),在各個(gè)省公安的環(huán)境上做評(píng)測(cè),底庫(kù)一般都比較大,到千萬(wàn)的量級(jí)甚至到億的量級(jí),這也是因?yàn)樽罱鼛啄?a href="http://wenjunhu.com/v/tag/448/" target="_blank">深度學(xué)習(xí)發(fā)展的非??臁W钤缙跁r(shí)只能做靜態(tài)檢索,而且結(jié)果還不太好,隨著深度學(xué)習(xí)算法的發(fā)展,現(xiàn)在很多公司的算法都越來(lái)越好了,評(píng)測(cè)的時(shí)候也會(huì)很難區(qū)分各個(gè)廠(chǎng)家的算法到底誰(shuí)好誰(shuí)壞,所以測(cè)試本身這個(gè)問(wèn)題越來(lái)越難,用來(lái)檢索圖片的質(zhì)量也越來(lái)越苛刻,實(shí)際應(yīng)用中很多問(wèn)題也很苛刻,比如嫌疑人在攝像頭里出現(xiàn)距離比較遠(yuǎn),有側(cè)面的,或者帽子遮擋,戴眼鏡等現(xiàn)象。
給大家舉個(gè)例子,下面是我在互聯(lián)網(wǎng)上找到的明星的照片,在真實(shí)場(chǎng)景里 query 的質(zhì)量跟這個(gè)差不多,有的時(shí)候比這些更難一點(diǎn)。現(xiàn)在主流人臉?biāo)惴ń鉀Q這種問(wèn)題時(shí),當(dāng)?shù)讕?kù)是千萬(wàn)量級(jí)時(shí),top1是召回率還是很高的,百分之八九十的問(wèn)題不是很大,甚至還會(huì)更高一些。
當(dāng)然,在安防或者其他應(yīng)用場(chǎng)景里有更難的任務(wù),就是人臉的 N : N 搜索,這種情況下我們會(huì)有大量的攝像頭,每一個(gè)都在實(shí)時(shí)抓拍,有非常多待確認(rèn)的抓拍人臉,同時(shí)庫(kù)也是相對(duì)比較大的。舉個(gè)例子,在安防領(lǐng)域,假設(shè)我們有 100 個(gè)攝像頭,然后每個(gè)攝像頭每天抓拍 1 萬(wàn)個(gè)人,那么總的搜索次數(shù)就是 100 萬(wàn)次。假設(shè)這一天有 10 個(gè)嫌疑人被攝像頭抓拍到,假設(shè)我們需要在一個(gè) 10 萬(wàn)大小的底庫(kù)里面去搜索他們。我們有一個(gè)算法,這個(gè)算法這一天總報(bào)警 100 次,警察每一個(gè)都去確認(rèn),最后抓到了 9 個(gè)嫌疑人,這看起來(lái)還不錯(cuò),因?yàn)榭偣渤霈F(xiàn)了 10 個(gè)人,抓到了 9 個(gè),召回率是 90%。那我們來(lái)看看誤報(bào)率,100 次報(bào)警,對(duì)了 9 次,錯(cuò)了 91 次,誤報(bào)率就是91 除以 100萬(wàn)×10萬(wàn),大概算下來(lái)是 10億分之0.91,約為 10億分之1 的誤報(bào)率。
這個(gè)指標(biāo)在現(xiàn)在的人臉識(shí)別算法里還算比較不錯(cuò)的了,但是在公安民警看來(lái)沒(méi)有那么理想,因?yàn)樗麄兂鼍?100次,只抓到了 9 個(gè)人,他們非常想出警 10 次就抓到 9 個(gè)人,這樣成本就會(huì)低很多。那我們來(lái)看一下出警 10 次抓到 9 個(gè)人的誤報(bào)率是多少呢?看起來(lái)少了一個(gè)數(shù)量級(jí),但實(shí)際上要求誤報(bào)率要提高兩個(gè)數(shù)量級(jí),因?yàn)檫@個(gè)時(shí)候誤報(bào)的次數(shù)只有 1 次,1 除以 100萬(wàn)×10萬(wàn),就是已經(jīng)到了千億分之一,這個(gè)就非常難達(dá)到。即使有一個(gè)千億分之一的算法也只能支持 100 個(gè)攝像頭的需求,在很多城市里輕輕松松就有上萬(wàn)個(gè)攝像頭,甚至幾十萬(wàn)個(gè)。所以算法還要在誤報(bào)率方面再降低 N 個(gè)數(shù)量級(jí),或者要求我們有更聰明的使用方式,在還有很多研究的空間。
還有一類(lèi)應(yīng)用是人臉虛擬 ID 的聚類(lèi),虛擬 ID 就是我們不知道每個(gè)人的證件信息,只有大量的攝像頭抓拍結(jié)果,我們想根據(jù)這些人臉的圖像特征和出現(xiàn)的時(shí)間、空間等先驗(yàn)信息進(jìn)行聚類(lèi),這樣可以挖掘用戶(hù)的軌跡和行為習(xí)慣。這些信息在很多場(chǎng)景下非常有用,最簡(jiǎn)單的是人臉相冊(cè)的聚類(lèi),這個(gè)應(yīng)用很簡(jiǎn)單,因?yàn)槟阒恍枰谝粋€(gè)人的相冊(cè)里做聚類(lèi)就可以了,庫(kù)很小。但在安防、零售等場(chǎng)景都是城市級(jí)的數(shù)據(jù),這個(gè)做好的話(huà)可以帶來(lái)很有價(jià)值的信息,比如誰(shuí)跟誰(shuí)經(jīng)常在一起活動(dòng),從 A 點(diǎn)到 B 點(diǎn)到 C 點(diǎn)到 D 點(diǎn)有什么異常,像這些人員流動(dòng)的異常,在很多地方,尤其是新疆、西藏等 ,大家都非常關(guān)注。
人臉識(shí)別的基本流程,首先要檢測(cè)到人臉,檢測(cè)到之后一般會(huì)做關(guān)鍵點(diǎn)的定位,把他的眼睛、鼻子、嘴角等信息都定位出來(lái),利用這個(gè)信息對(duì)人臉做個(gè)矯正,把它變換到比較正情形,便于后面模型分析或者處理時(shí)各個(gè)部分更好的對(duì)齊。最終會(huì)提取得到一個(gè)人臉的描述特征,通常是一個(gè) 100 多維到幾百維的特征表達(dá),然后我們用不同人臉特征之間的相似度或者距離,相似度是越高越好,距離是越小越好,去刻畫(huà)兩個(gè)人之間的關(guān)系,再卡一個(gè)域值,來(lái)判斷這兩個(gè)人是否為一個(gè)人。這次我們講人臉識(shí)別主要就是最后的人臉特征提取的部分。
▌二、人臉識(shí)別前沿算法簡(jiǎn)介
人臉識(shí)別傳統(tǒng)思路挺多的,我只列了一小部分。下面我們來(lái)一一回顧這些基本的算法:
Baseline
首先是 Baseline,早在八十年代末就可以做基于 CNN 的分類(lèi)了。如果想把這套東西用在人臉上的話(huà)只需要做簡(jiǎn)單的替換。字符的輸入替換成矯正之后的人臉輸入。LeNet5 可以換成 ResNet 以及后面的各種改進(jìn)。然后是分類(lèi),人臉有多少個(gè) ID 就可以分多少類(lèi)。然后我們訓(xùn)練完網(wǎng)絡(luò)后就有了特征,比如可以把最后的 FC 的輸出當(dāng)做人臉的特征。
當(dāng)然,也會(huì)有潛在的問(wèn)題,如果類(lèi)別太多,會(huì)不會(huì)訓(xùn)練不動(dòng)?比如你在做認(rèn)證的應(yīng)用時(shí),每一類(lèi)的訓(xùn)練圖片會(huì)不會(huì)樣本太少?如果你在訓(xùn)練集上的分類(lèi)結(jié)果非常好,但對(duì)于新的 ID 怎樣呢?分類(lèi)的模型訓(xùn)練得好,能夠代表學(xué)到的特征在人臉識(shí)別應(yīng)用的時(shí)候非常好嗎?這些問(wèn)題都有人在研究,有一些也會(huì)在后面的介紹中體現(xiàn)出來(lái)。
DeepID
DeepID 這個(gè)算法是剛剛那個(gè)思路的具體實(shí)現(xiàn),有一些更細(xì)節(jié)的調(diào)整,它在得到最終的人臉特征之后,又做了一個(gè)基于概率統(tǒng)計(jì)的降維。它這個(gè)特征也是多個(gè)特征的融合體,你可以理解為它對(duì)人臉上的很多關(guān)鍵區(qū)域都訓(xùn)練了一個(gè) CNN 網(wǎng)絡(luò),去做分類(lèi),得到隱層特征,把這些特征拼接在一起,再做某種意義上的降維,得到最終特征,用這個(gè)特征來(lái)做描述。這是最早的 DeepID。
DeepID2
DeepID2 做得更細(xì)致,它希望同一個(gè)人的特征盡量近,不同人的特征可以比較遠(yuǎn)。兩張圖作為輸入 ,每一個(gè)都用一個(gè) CNN 去提取特征,這兩個(gè) CNN 網(wǎng)絡(luò)是共享參數(shù)的,通過(guò)這個(gè) Siamese Network 來(lái)判斷他們是不是一個(gè)人。如果他們是一個(gè)人的話(huà),我們要求特征之間的歐式距離比較小,如果他們不是同一個(gè)人的話(huà),我們希望他們之間的歐式距離至少大于等于 m??梢詮倪@個(gè) Loss 里看到,它一旦小于 m 就會(huì)受到懲罰,只有大于 m 時(shí)才是安全的。人們希望這種方法使得特征的表達(dá)更清楚。這個(gè)方法不需要依賴(lài)特別大的 FC 層,不管你真實(shí)的人的ID有多少,你都是在做一個(gè)類(lèi)似于二分類(lèi)的事情。同時(shí),它也可以跟之前的 DeepID1 里面的 softmax 一起使用,這樣會(huì)有一些提升。
DeepID2+
DeepID2+ 做了一些小的修改,更多訓(xùn)練樣本,更大的特征維度,更多的監(jiān)督信號(hào),在網(wǎng)絡(luò)中間的很多層都連接到了最終的分類(lèi)和驗(yàn)證的卷積函數(shù),有點(diǎn)類(lèi)似于 GoogLeNet,不過(guò)那時(shí) GoogLeNet 還沒(méi)有出來(lái)。
DeepFace
DeepFace 在算法上并沒(méi)有什么特別的創(chuàng)新,它的改進(jìn)在于對(duì)前面人臉預(yù)處理對(duì)齊的部分做了精細(xì)的調(diào)整,結(jié)果顯示會(huì)有一定的幫助,但是也有一些疑問(wèn),因?yàn)槟阋?3D 的Alignment(對(duì)齊),在很多情況下,尤其是極端情況下,可能會(huì)失敗。人臉識(shí)別的算法發(fā)展得非???,有很多不同思路和做法,但是在不同的應(yīng)用類(lèi)型中是不是真的都能 work的比較好,需要嘗試之后才能下結(jié)論,不一定能普適的應(yīng)用。
DeepID3
DeepID3 是 2015 年的工作,那一年正好是在 GoogLeNet 和 VGG 出來(lái)的那一年,所以作者把比較深的卷積網(wǎng)絡(luò)模塊加進(jìn)去了,有一些提高。
FaceNet
Google 的 FaceNet 不太一樣,它用的是 Triplet Loss,這跟它自己的數(shù)據(jù)量有直接關(guān)系,之前那幾個(gè)論文都是基于公開(kāi)的數(shù)據(jù),人臉 ID 數(shù)在 1 萬(wàn)的量級(jí)左右。但 Google 的互聯(lián)網(wǎng)數(shù)據(jù)非常多,它做得最大的實(shí)驗(yàn)用到了兩億六千萬(wàn)的人臉數(shù)據(jù),總 ID 數(shù)大概在 800 萬(wàn)左右。所以在那個(gè)時(shí)候,Google 從一開(kāi)始就用了 Triplet Loss,意思就是它有三個(gè)樣本的對(duì),其中有一個(gè)叫 Anchor一個(gè)叫 Negative,一個(gè)叫Positive。Positive 的意思就是它跟 Anchor 是同一類(lèi)的,如果跟 Anchor 不是同一類(lèi)就是 Negative。
Center Loss
Center Loss 則更加直接一點(diǎn),它做 Softmax 的時(shí)候不僅僅是分對(duì),而是希望每一類(lèi)更加緊湊一些,更加直接。它的 Loss 函數(shù)比較簡(jiǎn)單,相當(dāng)于 xi 是每張圖片的特征,yi 是它的標(biāo)簽,Cyi 就是對(duì)某個(gè)類(lèi)的一個(gè)中心,相當(dāng)于每張圖片的特征在學(xué),然后每個(gè)類(lèi)的類(lèi)中心同時(shí)也在學(xué),希望屬于同一類(lèi)的那些樣本的特征都離它們自己的類(lèi)中心比較近。這個(gè)跟 softmax 合并在一起出現(xiàn)一個(gè)新的 Loss,這樣學(xué)出來(lái)的特征在歐氏距離下就更加能夠表達(dá)不同人臉之間的相似度關(guān)系。
前面幾個(gè)算法都是相對(duì)比較傳統(tǒng)的、比較老一點(diǎn)的,在現(xiàn)在人臉識(shí)別系統(tǒng)里用得人比較少??偟膩?lái)說(shuō),它們大部分都是從 Loss 設(shè)計(jì)方面做了改進(jìn),然后跟softmax進(jìn)行配合。但 Google 是一個(gè)例外。然后下面幾個(gè)感覺(jué)更加有效的方法則基本都是在 softmax 的基礎(chǔ)上再進(jìn)行深入的探索。
L-softmax
第一個(gè)比較重要的、改動(dòng)比較大的工作是 L-softmax(Large-Margin Softmax),它的意思是我在做分類(lèi)時(shí),希望不同的類(lèi)之間能夠區(qū)分得更開(kāi),把同一個(gè)類(lèi)壓縮得更緊,但它跟之前的思路有一定的相似性,但并沒(méi)有通過(guò)額外的限制來(lái)做,它深入分析了 softmax loss 的形式,直接對(duì)這個(gè)形式做了精細(xì)的改動(dòng),把其中的cosθ改成了cosmθ,起到了增加 margin 的效果。這里還有一些處理細(xì)節(jié),比如當(dāng) mθ 超過(guò)一定范圍時(shí)要重新定義等等,但是大的思路比較容易理解。
A-softmax
A-softmax 則是在 L-softmax 上做了一個(gè)很小的修改。它們雖然是兩篇論文,但其他所有東西都跟 L-softmax 一模一樣。A-softmax 就是在考慮 m 倍的 θ 這個(gè) margin 的同時(shí)要添加兩個(gè)限制條件,第一個(gè)是 W 的 norm 要是一個(gè)固定的值,我們把它的值固定為 1,其次我們把 B 直接設(shè)置為 0,因?yàn)樗鶺相比只有一維維度,所以感覺(jué)上不太會(huì)很影響這個(gè)網(wǎng)絡(luò)的表達(dá)能力,同時(shí)它還可以讓解釋變得非常自然,使得在這種情況下模型的預(yù)測(cè)僅僅取決于 W 和 X 之間的角度。但事實(shí)上,如果真的去嘗試這個(gè)算法,會(huì)發(fā)現(xiàn)這個(gè) margin 加的是非常強(qiáng)的,比如 θ 是 30 的時(shí)候,就是當(dāng)某個(gè)樣本離它的類(lèi)中心 已經(jīng)只有30 度的情況下,在 m=2 的時(shí)候它會(huì)保守的認(rèn)為,樣本離類(lèi)中心還有 60 度,所以這個(gè)限制很強(qiáng),是比較難優(yōu)化的。真正用的時(shí)候是 softmax+α 倍的A-softmax 優(yōu)化,α 一開(kāi)始是約等于 0,等于是一開(kāi)始在優(yōu)化 softmax,隨著優(yōu)化的進(jìn)行,α 逐步有些提高,能起到一些 A-softmax+margin 的效果。
NormFace/CocoLoss
剛剛的 A-softmax 是從 margin 的角度來(lái)講的,后面出現(xiàn)了兩篇論文,NormFace 和 CocoLoss,是從 Norm 的角度來(lái)分析這個(gè)問(wèn)題的。它在對(duì) softmax 做改進(jìn)的時(shí)候加了兩個(gè)限制,一個(gè)是特征,每個(gè)樣本特征的 Norm 要是 constant 的,就是希望所有樣本學(xué)出來(lái)的特征模長(zhǎng)都是固定的數(shù)字。同時(shí),分類(lèi)時(shí)有一個(gè) W 的參數(shù)矩陣,希望參數(shù)矩陣的每一列 Norm 也都是一個(gè)固定的數(shù)字。
有兩篇論文同時(shí)看到了這一點(diǎn),就是在不考慮 margin 的情況下,僅僅去考慮這兩個(gè) Norm 的限制,聽(tīng)起來(lái)是很簡(jiǎn)單的思路,正好兩個(gè)工作也做重了,它倆幾乎在同一時(shí)間發(fā)表,內(nèi)容也幾乎是一模一樣的。但這里面我選擇介紹下 NormFace,它的論文分析看起來(lái)更深入一些,而且講到了normface 跟 triple loss(當(dāng)用 agent 代替一個(gè)類(lèi)中心的時(shí)候)之間的一些聯(lián)系。還有一點(diǎn),從這里開(kāi)始,人臉識(shí)別的特征對(duì)比就不再用 L2 的距離了,基本上全面轉(zhuǎn)向了cos 距離。因?yàn)樵谶@種情況下,L2 和 cos 距離其實(shí)是一樣的。
這點(diǎn)其實(shí)也是很重要的,我們可以看到在早期的 Google 的 FaceNet 里面,它對(duì)feature也做了一個(gè) Normalization,就說(shuō)明它早就發(fā)現(xiàn)了這一點(diǎn),這個(gè)對(duì)特征做 Normalization 會(huì)有幫助。但是如果你想深入的看一看為什么要對(duì)特征做normalization,為什么要加 margin 在 softmax 里面?其實(shí)也有一些理論上的東西來(lái)分析這個(gè),我可以跟大家介紹兩個(gè)簡(jiǎn)單的想法。
FeatureIncay
FeatureIncay 論文里提到了兩點(diǎn):
第一,為什么要 normalize 特征?
有一個(gè)性質(zhì),如果大家仔細(xì)想一想的話(huà)會(huì)覺(jué)得非常有意思,就是當(dāng)一個(gè)樣本如果已經(jīng)處于分對(duì)的狀態(tài),也就是說(shuō)它已經(jīng)距離自己類(lèi)中心的 Wi 最近的的話(huà),這時(shí) softmax loss 本身會(huì)隨著這個(gè) feature 的模長(zhǎng)而遞減,也就是說(shuō)如果你已經(jīng)分對(duì)了,softmax 繼續(xù)優(yōu)化的時(shí)候會(huì)朝著讓你模長(zhǎng)更大的方向去走,但這對(duì)最終效果沒(méi)有任何幫助,因?yàn)橹皇悄iL(zhǎng)在變,跟類(lèi)中心的夾角并沒(méi)有改變,但是從 softmax 的角度來(lái)看,它的 loss 竟然下降了,就意味著我們不能自由的去學(xué)每一個(gè)樣本的特征,我們希望它的特征受到一些限制。Normalize 特征,就是特征模長(zhǎng)受到限制,也就是 norm 等于 1 或者等于一個(gè)常數(shù)。
第二,為什么要加 margin?
同樣有一個(gè)類(lèi)似的性質(zhì)說(shuō),如果說(shuō)你的特征對(duì)于某個(gè)人臉的圖片分類(lèi)已經(jīng)概率很高了,比如它應(yīng)該是屬于第 10 類(lèi)的,你現(xiàn)在的模型預(yù)測(cè)出來(lái)它屬于第 10 類(lèi)的概率非常高,比如已經(jīng)0.999,這種情況下你去看樣本的梯度,發(fā)現(xiàn)它的梯度幾乎約等于 0。說(shuō)明在某個(gè)樣本在幾乎分對(duì)的情況下,訓(xùn)練過(guò)程不會(huì)再把這個(gè)樣本朝著這個(gè)樣本的類(lèi)中心繼續(xù)壓縮了 ,默認(rèn)的 softmax 是沒(méi)有產(chǎn)生margin 的能力的,所以 margin 這一項(xiàng)需要單獨(dú)加。
總之,直觀理解就是在 softmax 這個(gè) loss 上,如果你想讓特征學(xué)得更有意義和特征更加緊湊,一定要單獨(dú)去考慮 feature 的 normalization 和 margin 應(yīng)該怎么加。
關(guān)于 margin 剛剛只講了一個(gè),就是 Asoftmax ,其實(shí)還有其他的幾種形式,第一個(gè)是AMSoftmax,還有一個(gè)叫 CosFace,這兩個(gè)是同樣的想法,內(nèi)容也基本是一模一樣的。Margin 是指的類(lèi)似于 SVM 里面的那種分類(lèi)面之間要有一個(gè)間隔,通過(guò)最大化這個(gè)間隔把兩個(gè)類(lèi)分得更開(kāi)。在 AMSoftmax 里面本來(lái) xi 和類(lèi)中心的距離是 cosθ,不管是 ASoftmax 還是 AMSoftmax,都是想把這個(gè)數(shù)字變小一點(diǎn),它本來(lái)相似度已經(jīng) 0.99 了,我希望讓它更小一點(diǎn),使得它不要那么快達(dá)到我想要的值,對(duì)它做更強(qiáng)的限制,對(duì)它有更高的要求,所以它減 m 就相當(dāng)于這個(gè)東西變得更小了,xi 屬于應(yīng)該在那個(gè)類(lèi)的概率就更難達(dá)到 99% 或者 1,這個(gè) θ 角必須要更小,這個(gè)概率才能更接近 1,才能達(dá)到我們想要的標(biāo)準(zhǔn)。右邊也是一樣的,這兩個(gè)公式幾乎完全一模一樣,同時(shí)大家都在要求 W 的 norm 要是固定的,x 的 Norm 要是固定的,我們只關(guān)心 cos 距離
InsightFace/ArcFace
第三個(gè)跟前面的兩個(gè)非常像,叫 InsightFace,也叫 ArcFace,雖然是兩個(gè)不同的名字,但實(shí)際上是一篇論文。這三種方式都是讓 cosθ 變得更小,第一個(gè)是通過(guò) θ 乘以 m 的方式變小,第二個(gè)是通過(guò) cosθ 減 m 的方式讓 cosθ 變小,第三個(gè)是通過(guò) θ 加 m 的方式讓 cosθ 變小。因?yàn)?cos 這個(gè)函數(shù)對(duì) θ 是單調(diào)遞減的,所以讓這個(gè)函數(shù)變小,第一種是讓 cos 減去一個(gè)值,第二種是讓里面的 θ 變大,變大有幾種方式,一種是乘以 m,一種是加 m,其實(shí)這三種方式是可以統(tǒng)一起的。
文里面作者提到, ArcFace 跟 CosineFace 相比,在訓(xùn)練一開(kāi)始,所有類(lèi)之間每個(gè)類(lèi)的樣本跟它類(lèi)中心的距離是比較遠(yuǎn)的,隨著訓(xùn)練進(jìn)行,它們?cè)絹?lái)越緊湊 ,ArcFace 可以做到更加緊湊的
同時(shí),這三種方法可以和合并成一個(gè)公式,可以在 θ 上乘一個(gè) m,然后再加上一個(gè) m2,cos 算完之后可以減 m3,這三個(gè)參數(shù),不管哪個(gè)調(diào)整,都可以讓函數(shù)比原來(lái)設(shè)定得更小,這在 softmax 里面就意味著加了更強(qiáng)的 margin。有些實(shí)驗(yàn)結(jié)果表明,單獨(dú)調(diào)每一個(gè)都不一定是最優(yōu)的,它們聯(lián)合起來(lái)調(diào)整可能有更好的結(jié)果。但在幾何上具體是怎樣的現(xiàn)象,就比較難以描述,可能需要更多的研究。
新的算法簡(jiǎn)單就回顧到這里,這些算法大家平時(shí)用起來(lái)不會(huì)覺(jué)得有些問(wèn)題,在學(xué)術(shù)界公開(kāi)的訓(xùn)練集上也能得到比較好的效果。但是學(xué)術(shù)界跟工業(yè)級(jí)是有很大區(qū)別的,主要的幾個(gè)區(qū)別在于以下幾個(gè)方面:圖片量、每個(gè)ID的平均人臉數(shù)量、人臉I(yè)D數(shù)、顯存占用、訓(xùn)練時(shí)間。
▌三、分布式人臉識(shí)別訓(xùn)練
我們?cè)O(shè)計(jì)了簡(jiǎn)單的分布式人臉識(shí)別的訓(xùn)練框架,想法很簡(jiǎn)單,就是數(shù)據(jù)并行+模型并行。
首先是數(shù)據(jù)并行,假設(shè)我們有 N 個(gè)計(jì)算節(jié)點(diǎn),N 臺(tái)機(jī)器,每臺(tái)機(jī)器有 M 張卡。首先,我們通過(guò)數(shù)據(jù)并行,把一個(gè)大的 batch 平均分到每張卡上,然后每張卡跑一個(gè)同樣參數(shù)的 CNN 網(wǎng)絡(luò),得到那部分?jǐn)?shù)據(jù)的特征,然后對(duì)這些特征做多級(jí)多卡的匯聚,得到所有 batch 里面數(shù)據(jù)總的特征是X。為什么要做特征匯聚?主要是因?yàn)楹竺娴哪P筒⑿小?/p>
模型并行把原來(lái)一張卡上的 W 參數(shù)矩陣平均拆分到多張卡上,舉個(gè)例子,現(xiàn)在讓第一張卡來(lái)負(fù)責(zé)預(yù)測(cè)每個(gè)樣本屬于 0-10萬(wàn) 類(lèi)的概率,第二張卡預(yù)測(cè)屬于 10萬(wàn)-20萬(wàn) 類(lèi)的概率,比如一個(gè)卡負(fù)責(zé) 10萬(wàn)類(lèi),總共我們有 100 張卡的話(huà),那就可以做 1000 萬(wàn)類(lèi)的分類(lèi)。參數(shù)拆分之后,每張卡上就可以計(jì)算每個(gè)樣本屬于每個(gè)類(lèi)的概率了,但這個(gè)地方需要通信,因?yàn)槟阋?jì)算類(lèi)別的話(huà),需要做一個(gè)指數(shù)操作,然后得到所有卡的指數(shù)的總和,然后除一下才能知道。但好處是通信量很小,每張卡只需要負(fù)責(zé)計(jì)算它自己那部分的和,然后把這個(gè)和同步給其它GPU就可以了,而和的話(huà)就只有一個(gè)數(shù)字(當(dāng)然這里有一些細(xì)節(jié),如果考慮到計(jì)算穩(wěn)定性還需要同步比如像最大值之類(lèi)的信息,但通信代價(jià)都很?。?。
一旦計(jì)算出了每張卡上每個(gè)樣本屬于自己卡負(fù)責(zé)這部分類(lèi)別的概率之后,剩下的事就容易做了,因?yàn)槲覀兛吹较聢D中的偏微分公式,它只依賴(lài)于這個(gè) Pk 的概率,我們得到了這個(gè) Pk 概率之后,就可以直接寫(xiě)出來(lái)目標(biāo)函數(shù)相對(duì)于算出來(lái)的 fk 的導(dǎo)數(shù)是什么,相當(dāng)于你可以同時(shí)拿到損失函數(shù)對(duì) W 的導(dǎo)數(shù)和對(duì) X 的導(dǎo)數(shù)。但損失函數(shù)是被拆分在多張不同的卡上,所以對(duì) X 這部分導(dǎo)數(shù)還需要做多機(jī)多卡的匯聚,得到對(duì)總的特征的導(dǎo)數(shù)。對(duì) W 參數(shù)的導(dǎo)數(shù),每張卡是獨(dú)立的,互相之間并不影響,所以每張卡自己更新就行了,也沒(méi)有通信傳遞。對(duì)所有 X 的梯度求和的通信量也不大,得到對(duì) X 的導(dǎo)數(shù)之后可以沿著前面正向傳播的路徑,多機(jī)多卡的反向傳播過(guò)去就可以了。
數(shù)據(jù)并行是很成熟的技術(shù),比如之前有很多報(bào)道,說(shuō)很多人都可以在多級(jí)多卡的環(huán)境里面訓(xùn)練 ImageNet 的數(shù)據(jù)集,好像大概一個(gè)多小時(shí)就能訓(xùn)完了。我們把模型并行這部分也加進(jìn)去了。模型并行也沒(méi)有那么復(fù)雜,主要是考慮機(jī)器之間的通信量能受控就可以。所以這樣的思路實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,而且可以把模型顯存占用和計(jì)算量都均勻分散到每個(gè) GPU 上,實(shí)現(xiàn)線(xiàn)性加速,也沒(méi)有增加額外的通信帶寬,甚至它降低了 FC 層的梯度更新所需要的帶寬。原來(lái) W 矩陣不做拆分的時(shí)候,多張卡之間要同步對(duì) W 的梯度,W 拆分到每張卡之后梯度反而不需要同步了。
這樣的情況下,我們測(cè)試實(shí)際的網(wǎng)絡(luò)環(huán)境可以支持 100 卡以上的訓(xùn)練,在 512 維特征的情況下做到幾千萬(wàn)類(lèi)的人臉識(shí)別,如果維度降低一點(diǎn),比如壓縮到 128 維,可以支持到上億類(lèi)的人臉識(shí)別,而且隨著卡的增長(zhǎng),也不會(huì)帶來(lái)的性能損失,基本上是線(xiàn)性加速。它的好處是支持大部分主流損失函數(shù)的擴(kuò)展。
下面是一個(gè)簡(jiǎn)單算法的效果展示,基于這種思路,不做其他的修改,在數(shù)據(jù)量還可以的情況下,很容易做到億分之一的誤識(shí)別率,召回率在 90% 左右,如果是互聯(lián)網(wǎng)產(chǎn)品可能更高一點(diǎn)。但是我剛剛在前面也說(shuō)了,隨著人臉庫(kù)數(shù)量的增加和攝像頭抓拍量的增加,億分之一的識(shí)別率還是會(huì)有很多誤報(bào)的,需要持續(xù)改進(jìn)。
還有很多影響人臉識(shí)別的重要因素,我這里簡(jiǎn)單列一下,感興趣的同學(xué)可以去關(guān)注:
這里我標(biāo)紅了“模型測(cè)評(píng)”,評(píng)測(cè)是件非常難的事,我們針對(duì)不同的應(yīng)用場(chǎng)景做了十幾個(gè)不同類(lèi)型的評(píng)測(cè) ,因?yàn)樵u(píng)測(cè)做的不好的話(huà),會(huì)影響模型設(shè)計(jì),讓你判斷不清楚哪個(gè)模型好、哪個(gè)模型差。
▌四、大規(guī)模人臉評(píng)測(cè)平臺(tái)介紹
之所以要做這個(gè)事情有幾個(gè)原因:
第一,學(xué)術(shù)界曾經(jīng)有很多非常有名的測(cè)試集,比如 LFW 有 6000 對(duì)人臉 1:1 認(rèn)證。但現(xiàn)在有很多算法都可以達(dá)到 99% 以上甚至 99.8% 的好成績(jī),所以這個(gè)效果已經(jīng)不能很好的衡量算法的好壞了,可能兩個(gè)同樣在 LFW 上達(dá)到 99.8% 的算法,換一個(gè)數(shù)據(jù)集時(shí)結(jié)果會(huì)差很多。
第二,MegaFace 在學(xué)術(shù)界也是非常有名的。它的測(cè)試條件是在 100 萬(wàn)干擾項(xiàng)中找到目標(biāo)人臉,一開(kāi)始的時(shí)候大家覺(jué)得這是個(gè)很難的問(wèn)題,但隨著學(xué)術(shù)界幾年的研究,排行榜的第一名已經(jīng)超過(guò) 98.9% 了,看起來(lái)也有一定的飽和趨勢(shì)。這里面一開(kāi)始是有些噪音的,后來(lái)被一些研究人員發(fā)現(xiàn)之后做了些清理,就發(fā)現(xiàn)這個(gè)測(cè)試集沒(méi)有想象得那么難。另外,它提供的正樣本人臉對(duì)的比較有限,正樣本每個(gè)人的變化并不是特別的大,導(dǎo)致這個(gè)問(wèn)題可能并沒(méi)有一開(kāi)始大家預(yù)想的那么難。
于是,我們想辦法去擴(kuò)充做一個(gè)更大規(guī)模的訓(xùn)練集,希望做更客觀的評(píng)測(cè),幫助在人臉?lè)矫孀鲅芯康耐袀冇幸粋€(gè)未來(lái)幾年還可以繼續(xù)用的測(cè)試平臺(tái)。我們做了兩件事情,第一個(gè)是做一個(gè)比較大的人臉訓(xùn)練集,第二個(gè)是做比較大的人臉測(cè)試集。訓(xùn)練集大概是有 18 萬(wàn)人,共有 680 萬(wàn)張圖片左右,測(cè)試集大概有 187 萬(wàn)的人臉。
下面簡(jiǎn)單介紹這些訓(xùn)練集的制作及清理過(guò)程,訓(xùn)練集一部分是基于公開(kāi)的 MS-Celeb 上做了清理,去掉了重復(fù)的名人,然后又收集了一個(gè)亞洲人的名人庫(kù),大概也有 10 萬(wàn)個(gè)ID,再把兩個(gè)合并一起做除重,最后合并數(shù)據(jù)。MS 這個(gè)數(shù)據(jù)集有兩種噪聲,一個(gè)是類(lèi)內(nèi)的噪聲 ,也就是說(shuō)每個(gè)類(lèi)并不只包含一個(gè)人。還有一個(gè)是類(lèi)間的噪聲,同一個(gè)演員出現(xiàn)在不同的電影里面,或者有多個(gè)不同的名字,就被分在兩個(gè)不同的類(lèi)里面。
清理流程是首先檢測(cè)和align之后,用一個(gè)比較好的模型去提特征,在這個(gè)過(guò)程中順帶可以把原來(lái)數(shù)據(jù)集中的誤檢測(cè)去掉。具體清理的時(shí)候,我們對(duì)原來(lái)每個(gè)類(lèi)都做一個(gè)層次聚類(lèi)。我們?yōu)榱藬?shù)據(jù)集的純凈,只把每個(gè)原始類(lèi)里面聚類(lèi)之后最大的簇保留起來(lái),保證每個(gè)類(lèi)別里是足夠c lean的。但每個(gè)類(lèi)只保留最大的簇是不是最好也值得商榷,現(xiàn)在初步的版本是保留最大的。
第二個(gè)是減少類(lèi)間的錯(cuò)誤 ,比如這兩類(lèi)是同一個(gè)人,但一個(gè)是電影角色的名字,一個(gè)是他自己的名字。當(dāng)初M s-celeb數(shù) 據(jù)集在整理的時(shí)候,是用圖片和它周?chē)奈谋拘畔⒆龅木垲?lèi),所以它不可避免會(huì)有一定比例的這方面的錯(cuò)誤。我們做清理的時(shí)候,首先對(duì)每個(gè)類(lèi)得到它的主簇,然后兩個(gè)不同的類(lèi),如果我們?nèi)ケ容^兩個(gè)類(lèi)中任何兩個(gè)圖之間的最小距離,如果發(fā)現(xiàn)它們小于某個(gè)閾值的話(huà),說(shuō)明兩個(gè)類(lèi)有可能可以被合并 ,然后讓標(biāo)注員標(biāo)注一下,確定真的是同一個(gè)人的話(huà)就會(huì)標(biāo)在一起,通過(guò)這種方式來(lái)盡可能減少類(lèi)間錯(cuò)誤 。
還有亞洲的名人數(shù)據(jù)集,因?yàn)橹暗?MS 中歐美人比較多,我們又爬了大概十幾萬(wàn)的亞洲名人的數(shù)據(jù),經(jīng)過(guò)類(lèi)似的清理過(guò)程,最終得到了 10 萬(wàn)的 ID,200 多萬(wàn)的人臉??偟膩?lái)說(shuō),亞洲名人數(shù)據(jù)集跟原始的 MS 相比,會(huì)更不均衡一些,怎么去解決不均衡以及跨 domian 的問(wèn)題,就先留給研究人員去探索了。
關(guān)于測(cè)試集也有類(lèi)似的制作邏輯,只不過(guò)測(cè)試集我們花了更大的功夫,因?yàn)闇y(cè)試集對(duì)準(zhǔn)確性要求更高。之前的訓(xùn)練集里面是把所有的 LFW 里面那些 5000 個(gè)名人全都排除了,這樣我們測(cè)試集可以基于 LFW 來(lái)做,測(cè)試集的 query 全部來(lái)自于 LFW 里面的這些名人,然后我們基于這個(gè)名人列表爬了更多的名人日常照片,然后爬取的160 萬(wàn)的干擾項(xiàng),然后互相之間除重之后最終變成一個(gè)大的 TestSet。
可以看到,我們新做的評(píng)測(cè)集檢測(cè)圖片的類(lèi)別差異非常豐富,比如戴眼鏡、側(cè)臉、很大的表情、化妝、年齡變化、光線(xiàn)影響、黑白、戴帽子等等,常見(jiàn)的變化都在會(huì)在里面。
評(píng)測(cè)標(biāo)準(zhǔn)如下圖所示:
這個(gè)比賽還是比較有挑戰(zhàn)的,我們把 InsightFace 算法在 ResNet50 上的結(jié)果拿到我們的評(píng)測(cè)框架里去測(cè)的時(shí)候,發(fā)現(xiàn)在誤識(shí)率為十億分之一時(shí),它的召回率大概只有 50% 不到,所以有很高的提升空間。
-
攝像頭
+關(guān)注
關(guān)注
60文章
4842瀏覽量
95707 -
人臉識(shí)別
+關(guān)注
關(guān)注
76文章
4012瀏覽量
81911 -
cnn
+關(guān)注
關(guān)注
3文章
352瀏覽量
22217
原文標(biāo)題:格靈深瞳:人臉識(shí)別最新進(jìn)展以及工業(yè)級(jí)大規(guī)模人臉識(shí)別實(shí)踐探討 | 公開(kāi)課筆記
文章出處:【微信號(hào):AI_Thinker,微信公眾號(hào):人工智能頭條】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論