1. 程式人生 > >從資料角度看人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用 從資料角度看人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用

從資料角度看人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用 從資料角度看人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用

從資料角度看人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用

2018年10月19日 16:42:52 閱讀數:59

基於深度學習的人臉識別發展,從deepid開始,到今年(或者說去年),已經基本趨於成熟。凡是基於識別的,總是離不開三個東西:資料,網路,以及loss。

1 資料方面

目前的公開資料集中有主打類別數的MS_celeb_1M,有主打各種姿態角與年齡的VggFace2;也有一些主打高質量的資料集,像WebFace,guo yandong的MS-20K。除了公開資料集之外,圖片生成領域也有不錯的成果,例如基於三維人臉模型生成不同姿態角的人臉圖片,利用GAN生成不同人臉角度或者屬性的圖片(StarGAN,TPGAN)。

2 網路方面

從最開始的淺層網路lightCNN到後面的ResNet,Inception-ResNet,ResNeXt以及SeNET,都是針對識別而設計的網路,而並非針對人臉識別設計的網路,所以一些網路在人臉識別裡帶來的提升沒有ImageNet那麼明顯。

3 現有人臉識別演算法

由於人臉識別相對於一般的識別問題,存在人臉對比這樣一個需求,這就將人臉識別的主要方向變成了metric learning問題而並非簡簡單單的分類問題。而近幾年學術上的發展也基本是圍繞loss function展開,除了像google,baidu這些擁有海量人臉資料的論文,focus點基本都在一個問題上:如何在有限的資料集上得到更高的精度。
如果光看loss function,從softmax,contrastive loss,triplet loss,center loss,normface,large margin loss , Asoftmax loss , coco loss,以及今年的AM,AAM,InsightFace。
這些在聚類上大致上可以分為下面兩個類:


1.單純聚類:contrasitve loss,center loss,normface, coco loss
2.加Margin聚類:triplet loss,large margin loss,Asoftmax loss,AM,AAM,InsightFace
在距離度量上可以分為下面兩個類:
1.歐式距離:contrastive loss,center loss,normface,triplet loss
2.cosine距離/角度距離:large margin loss,Asoftmax loss,coco loss,AM,AAM,InsightFace

可以看到,目前的主要方向,在從euler距離往cosine距離發展的同時中間出現了像normface,sphereface,coco loss這些進行了Feature Normalization,Weight Normalization操作的loss,但是這幾篇論文,除了sphereface稍稍介紹了緣由之外,其餘的更像是一個實驗性的結果,沒有辦法從理論上來說明。
必須注意到,無論哪種loss,其目的是為了更好的學習trainning dataset的分佈,如果我們的trainning set 與 test set的資料分佈一致的話,我們的才能說真正的學到了人臉的分佈。在這裡,我們不去分析各種loss的好壞,而是從資料分佈上分析為什麼要進行**Feature Normalization,Weight Normalization以及triplet,**以及到底有沒有用。

當然,我以上提及到的資料,網路都是公開、能夠獲取到的東西。目前的商業公司裡面的積累已經遠遠超過了公開的東西。
在我們進行分析之前,先將上面提及到的論文及其地址給出來以供讀者更好閱讀:

triplet loss: FaceNet: A Unified Embedding for Face Recognition and Clustering
center loss : A Discriminative Feature Learning Approach for Deep Face Recognition
normface :NormFace: L2 Hypersphere Embedding for Face Verification
Large Margin softmax loss: Large-Margin Softmax Loss for Convolutional Neural Networks
sphereface : SphereFace: Deep Hypersphere Embedding for Face Recognition
coco loss : Rethinking Feature Discrimination and Polymerization for Large-scale Recognition
AM : Additive Margin Softmax for Face Verification
AAM : Face Recognition via Centralized Coordinate Learning
ArcFace: ArcFace: Additive Angular Margin Loss for Deep Face Recognition

先說Weight Normalization

4 Weight Normalization

什麼是Weight Normalization,顧名思義就是歸一化的權重,當然我們這裡討論的Weight Normalization和之前的WN還不一樣,我們這裡主要是歸一化分類層的權重。

如果以x表示輸出特徵,以y表示分類層的輸出,那麼分類層一般可以表示為:

y = Wx+b

其中這個W就是weight,b就是bias(偏置項)。

那麼有人會問了,b怎麼辦,其實很早就一些鍊金家發現對於softmax而言,加不加bias項其實對最後的結果沒有什麼影響。於是,Weight Normalization就將分類層寫成以下形式:

y = Wx/|W|

那麼Weight Normalization有沒有效,我的結論是:有效

為什麼有效?我們從3個方面來簡單的分析一下:

  1. 考慮以下情形:假設我們有60億個id,每個id有1W張不同場景下的人臉圖片,我們把這個做成一個訓練集,直接用softmax去學習其分佈,我們能不能說我們學到了全世界的人臉分佈?答案是可以的,因為我們的test set再大,其id也不會超過全球的總人數,加之我們每個id下面的人臉圖片足夠多(1W)張,我們有理由確信這個分佈是可信的。

  2. 考慮以下情形:假設現在我們只有3個id,其中第一,第二個id下面有100張很相似的人臉圖片,第三個id下面只有1張。現在我們用softmax去學習其分佈,並用一個2維向量表示學到的特徵,那麼它的分佈應該是下面這樣的(二維視覺化):
    在這裡插入圖片描述
    可以自己模擬一下,會發現這種情況下的softmax loss是最小的。也就是說,由於id1和id2的圖片數量遠大於id3的圖片數量,導致id3在分類的時候基本處於一個隨波逐流的狀態。那麼id3肯定不樂意的,同樣都是人,為什麼差距就那麼大呢?沒辦法,誰讓你底下只有1張圖片呢?
    但是我們自己肯定是有個判斷的:id3是絕對可以拿出100張人臉圖片的,只是在這個訓練集中他沒有拿出100張,他只拿出了1張。
    這就好比我們丟硬幣猜正反面,我們丟了10次硬幣,其中有9次是正面,1次是背面。那麼我們會預測下一次是正面的概率是90%嗎?不是,我們知道概率是50%。相比於貝葉斯的先驗概率,我們有一個更強的先驗概率。
    對於人臉同樣如此,我們做Weight Normalization,正是因為我們可以主觀上判定:每一個人都可以拿出同樣多的人臉圖片。
    那麼做了Weight Normalization,上面的視覺化會變成這樣的:
    在這裡插入圖片描述
    是不是瞬間就感覺合理多了。

  3. 上面這個例子還缺少一個充分條件,那就是id的weight長度是和id下面的人臉圖片數量是成正比的。
    關於這一點,Guo Yandong在其論文裡面做了詳細的實驗:
    論文: One-shot Face Recognition by Promoting Underrepresented Classes
    作者自己建了一個人臉base資料集,也就是我之前提到的MS_20K,包括20K個id,每個id下面有50-100張人臉圖片;然後作者建立了一個novel資料集,包括1K個id,每個id下面有20張圖片,作者稱其為low shot learning,也就是為了探究樣本不均衡的問題。
    如果直接用softmax去學習這些圖片,會得到如下結果:
    在這裡插入圖片描述
    可以發現最後1k個類的weight norm明顯小於前面20k個類的,於是作者設計了一個loss,稱為UP loss,這個loss最後達到的效果是這樣的:
    在這裡插入圖片描述
    然後比較了一下這兩種情況的區別:沒有加loss的模型最後1K個類的分類準確率只有20%多,然後加了loss之後的模型最後1k個類的分類準確率有70%多,也就說明weight normalization確實是有效的,至於為什麼分類準確率不是100%呢,這個我們後面再討論。

  4. 另外一個說明weight normalization有效的例子即使Liu weiyang的Large Margin softmax與sphereface的對比,sphereface相較Large Margin softmax,其實就採用了Weight Normalization,最後的在LFW上的精度提升巨大。同樣,作者在sphereface的v3版本里面的附錄給出了weight Normalization的一些實驗,感興趣可以去瀏覽。

可能你看完上面的分析你就明白我要講什麼了,對的,那就是:沒有海量資料的情況下怎麼辦?資料不夠,先驗來湊。

5 Feature Normalization

5.1 Feature Norm

在講Feature Normalization之前我們必須清楚的瞭解到Feature Norm到底代表什麼含義,簡單點來說,Feature Norm就是特徵向量x的長度。所以,我們先要弄懂特徵向量x的每一個維度代表什麼。

先看一個簡單的例子,人臉檢測,最後輸出一個1維的特徵x,即置信度,當我們認為這個區域裡面一定存在人的時候,輸出1;當我們認為這個區域裡面不存在人的時候,輸出0。或者換一種說法,整個檢測器就是一個相關判斷器,整個CNN提取特徵的網路就是一個掃描器,掃描感興趣的東西(在這裡也就是人臉)。掃到人臉,就是相關,輸出的feature norm接近於1;沒有掃到人臉,就是不相關,輸出的feature norm接近於0.

對於人臉識別來說,同樣如此。人臉識別最後的特徵維度一般從128到512不等,一般認為512維已經足夠表示人臉的分佈了。我們把特徵x拆開,可以認為x的每一個維度都是一個檢測器,至於是什麼檢測器,就要看它對什麼東西感興趣了,可能是人眼大小的檢測器,也可能是山羊鬍須檢測器。總的來說是人臉的一些區域性特徵的檢測器,那合在一起是什麼呢?其實也就是人臉檢測器。

我們可以說,如果人臉特徵x的norm越大,那麼它就越像一張人臉;如果人臉特徵x的norm越小,那麼它就越不像一張人臉。

你覺得我可能在瞎BB,憑什麼就能把人臉特徵當成檢測器呢?

5.2 為什麼分類器能夠把人臉分開?

這個問題很難回答,我們從反方向來思考一下:什麼樣的人臉難以被區分?

看一個極端的例子:

黑色圖片

這個和誰比較像?嗯,可能和非洲人有點像。

那這個呢:

白色圖片 嗯,可能後歐洲人比較像。

事實上,上面那張黑色圖片和白色圖片的feature norm都接近於0。

我同樣也測試過其他很多圖片,其feature norm如下:

結論就是:如果臉部特徵丟失(例如模糊,光照,側臉,遮擋),此時該人臉變得難以區分,其feature norm就會相應減少。

5.3 那麼要不要feature normalization呢?

我的結論是不需要,因為模糊,遮擋這些並不是人臉的正常狀態,其對分類的影響力自然無法與正常的人臉相比。進行feature normalization反而會破壞整體的分佈。

6.Triplet

在Weight Normalization裡面我們遺留了一個問題,那就是Guo Yandong論文裡面提及到的最後1K個id的分類準確率是70%多而不是接近100%,這又是為什麼呢?

Weight Normalization真的解決了樣本不均衡的問題嗎?

不然,樣本不均衡的問題仍然存在,還是看之前Weight Normalization提到的一個簡單的例子:

現在我們變成了4個id,前兩個id有100張圖片,後兩個id只有1張圖片,如果按照Weight Normalization的方法,我們的分類會變成這樣的:

也就是說除非我們把id3,id4的圖片數量增加到100個,才能完全消除樣本不均衡的影響,這也就是某些論文中要將圖片數小於30個的類去除的原因。

我們能夠這樣說:

如果這個id沒有足夠多的樣本,那麼這個id是不能被當成一個類的

什麼叫做不能被當成一個類呢?就是說這個類不應該存在分類類中心。

如果我們要做one-shot learning,比如我們現在有全國每一個人的身份證照,但是隻有一張,怎麼辦,我們又不能把這些圖片給刪掉。

不計算類中心最為簡單的辦法就是triplet。
這裡的tirplet不是指triplet loss,而是指triplet的a,p,n三元組。

對於triplet loss我是不怎麼看好的,因為它同時更新a,p,n,走了樣本不均衡的老路。

但是a,p,n這個屬性,確實極好的。比如我們上面提到的one-shot learning。採用triplet的一種簡單方式就是把只有1張的id全部當成n,把有足夠多張圖片的id當成a,p。同時為了避免樣本不均衡帶來的影響,我們只對a進行梯度回傳,對於p,n則不進行梯度回傳。

我在我github專案裡的Angular Triplet Loss裡面的MarginInnerProduct.cpp/.cu裡面就實現了上面這種triplet的形式,我稱其為easy triplet,感興趣的讀者可以瀏覽一下。

那麼我們講的東西到這裡就結束了,第一次寫文章,排版不是很會,希望不影響閱讀。

為什麼叫深度挖坑呢,因為這個東西確實比較坑了,都叫深度學習了,結果沒有海量資料,還要和有限的資料做鬥爭。
最後,本人並非CS出身,上面這些都只是個人的一些感悟,如果發現了文章裡的問題,歡迎在留言裡面提出來,非常感謝。

===更新=

  1. Q:為什麼視覺化會變成那種樣子?
    A:可以手動計算softmax loss,在保證特徵可分的情況下那種情況softmax loss最小

  2. Q :為什麼質量差的圖片feature norm小呢?
    A :考慮兩點:
    1.質量差的圖片難以被分類,一張模糊的圖片(看不清五官)可能和所有的人都像,怎麼樣才能讓他和所有的人都像呢?在空間上只能讓他的feature norm小。
    2.質量差的圖片不能學習特徵,比如一張戴了墨鏡的人臉圖片,如果給墨鏡提取了一維特徵的話,那麼一個戴墨鏡人臉和另外一個戴墨鏡人臉的相似度就會提高。因為像遮擋這種,並非人的本質特徵,所以我們不需要給他提特徵,其feature norm自然就小。

  3. Q:暴力進行Weight Norm是否會有什麼不同?
    A :見 https://github.com/wy1iu/sphereface ,對於梯度回傳做了詳細的分析

原文連線:深度挖坑:從資料角度看人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用

        </div>
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-2b43bc2447.css" rel="stylesheet">
            </div>
				</article>

基於深度學習的人臉識別發展,從deepid開始,到今年(或者說去年),已經基本趨於成熟。凡是基於識別的,總是離不開三個東西:資料,網路,以及loss。

1 資料方面

目前的公開資料集中有主打類別數的MS_celeb_1M,有主打各種姿態角與年齡的VggFace2;也有一些主打高質量的資料集,像WebFace,guo yandong的MS-20K。除了公開資料集之外,圖片生成領域也有不錯的成果,例如基於三維人臉模型生成不同姿態角的人臉圖片,利用GAN生成不同人臉角度或者屬性的圖片(StarGAN,TPGAN)。

2 網路方面

從最開始的淺層網路lightCNN到後面的ResNet,Inception-ResNet,ResNeXt以及SeNET,都是針對識別而設計的網路,而並非針對人臉識別設計的網路,所以一些網路在人臉識別裡帶來的提升沒有ImageNet那麼明顯。

3 現有人臉識別演算法

由於人臉識別相對於一般的識別問題,存在人臉對比這樣一個需求,這就將人臉識別的主要方向變成了metric learning問題而並非簡簡單單的分類問題。而近幾年學術上的發展也基本是圍繞loss function展開,除了像google,baidu這些擁有海量人臉資料的論文,focus點基本都在一個問題上:如何在有限的資料集上得到更高的精度。
如果光看loss function,從softmax,contrastive loss,triplet loss,center loss,normface,large margin loss , Asoftmax loss , coco loss,以及今年的AM,AAM,InsightFace。
這些在聚類上大致上可以分為下面兩個類:
1.單純聚類:contrasitve loss,center loss,normface, coco loss
2.加Margin聚類:triplet loss,large margin loss,Asoftmax loss,AM,AAM,InsightFace
在距離度量上可以分為下面兩個類:
1.歐式距離:contrastive loss,center loss,normface,triplet loss
2.cosine距離/角度距離:large margin loss,Asoftmax loss,coco loss,AM,AAM,InsightFace

可以看到,目前的主要方向,在從euler距離往cosine距離發展的同時中間出現了像normface,sphereface,coco loss這些進行了Feature Normalization,Weight Normalization操作的loss,但是這幾篇論文,除了sphereface稍稍介紹了緣由之外,其餘的更像是一個實驗性的結果,沒有辦法從理論上來說明。
必須注意到,無論哪種loss,其目的是為了更好的學習trainning dataset的分佈,如果我們的trainning set 與 test set的資料分佈一致的話,我們的才能說真正的學到了人臉的分佈。在這裡,我們不去分析各種loss的好壞,而是從資料分佈上分析為什麼要進行**Feature Normalization,Weight Normalization以及triplet,**以及到底有沒有用。

當然,我以上提及到的資料,網路都是公開、能夠獲取到的東西。目前的商業公司裡面的積累已經遠遠超過了公開的東西。
在我們進行分析之前,先將上面提及到的論文及其地址給出來以供讀者更好閱讀:

triplet loss: FaceNet: A Unified Embedding for Face Recognition and Clustering
center loss : A Discriminative Feature Learning Approach for Deep Face Recognition
normface :NormFace: L2 Hypersphere Embedding for Face Verification
Large Margin softmax loss: Large-Margin Softmax Loss for Convolutional Neural Networks
sphereface : SphereFace: Deep Hypersphere Embedding for Face Recognition
coco loss : Rethinking Feature Discrimination and Polymerization for Large-scale Recognition
AM : Additive Margin Softmax for Face Verification
AAM : Face Recognition via Centralized Coordinate Learning
ArcFace: ArcFace: Additive Angular Margin Loss for Deep Face Recognition

先說Weight Normalization

4 Weight Normalization

什麼是Weight Normalization,顧名思義就是歸一化的權重,當然我們這裡討論的Weight Normalization和之前的WN還不一樣,我們這裡主要是歸一化分類層的權重。

如果以x表示輸出特徵,以y表示分類層的輸出,那麼分類層一般可以表示為:

y = Wx+b

其中這個W就是weight,b就是bias(偏置項)。

那麼有人會問了,b怎麼辦,其實很早就一些鍊金家發現對於softmax而言,加不加bias項其實對最後的結果沒有什麼影響。於是,Weight Normalization就將分類層寫成以下形式:

y = Wx/|W|

那麼Weight Normalization有沒有效,我的結論是:有效

為什麼有效?我們從3個方面來簡單的分析一下:

  1. 考慮以下情形:假設我們有60億個id,每個id有1W張不同場景下的人臉圖片,我們把這個做成一個訓練集,直接用softmax去學習其分佈,我們能不能說我們學到了全世界的人臉分佈?答案是可以的,因為我們的test set再大,其id也不會超過全球的總人數,加之我們每個id下面的人臉圖片足夠多(1W)張,我們有理由確信這個分佈是可信的。

  2. 考慮以下情形:假設現在我們只有3個id,其中第一,第二個id下面有100張很相似的人臉圖片,第三個id下面只有1張。現在我們用softmax去學習其分佈,並用一個2維向量表示學到的特徵,那麼它的分佈應該是下面這樣的(二維視覺化):
    在這裡插入圖片描述
    可以自己模擬一下,會發現這種情況下的softmax loss是最小的。也就是說,由於id1和id2的圖片數量遠大於id3的圖片數量,導致id3在分類的時候基本處於一個隨波逐流的狀態。那麼id3肯定不樂意的,同樣都是人,為什麼差距就那麼大呢?沒辦法,誰讓你底下只有1張圖片呢?
    但是我們自己肯定是有個判斷的:id3是絕對可以拿出100張人臉圖片的,只是在這個訓練集中他沒有拿出100張,他只拿出了1張。
    這就好比我們丟硬幣猜正反面,我們丟了10次硬幣,其中有9次是正面,1次是背面。那麼我們會預測下一次是正面的概率是90%嗎?不是,我們知道概率是50%。相比於貝葉斯的先驗概率,我們有一個更強的先驗概率。
    對於人臉同樣如此,我們做Weight Normalization,正是因為我們可以主觀上判定:每一個人都可以拿出同樣多的人臉圖片。
    那麼做了Weight Normalization,上面的視覺化會變成這樣的:
    在這裡插入圖片描述
    是不是瞬間就感覺合理多了。

  3. 上面這個例子還缺少一個充分條件,那就是id的weight長度是和id下面的人臉圖片數量是成正比的。
    關於這一點,Guo Yandong在其論文裡面做了詳細的實驗:
    論文: One-shot Face Recognition by Promoting Underrepresented Classes
    作者自己建了一個人臉base資料集,也就是我之前提到的MS_20K,包括20K個id,每個id下面有50-100張人臉圖片;然後作者建立了一個novel資料集,包括1K個id,每個id下面有20張圖片,作者稱其為low shot learning,也就是為了探究樣本不均衡的問題。
    如果直接用softmax去學習這些圖片,會得到如下結果:
    在這裡插入圖片描述
    可以發現最後1k個類的weight norm明顯小於前面20k個類的,於是作者設計了一個loss,稱為UP loss,這個loss最後達到的效果是這樣的:
    在這裡插入圖片描述
    然後比較了一下這兩種情況的區別:沒有加loss的模型最後1K個類的分類準確率只有20%多,然後加了loss之後的模型最後1k個類的分類準確率有70%多,也就說明weight normalization確實是有效的,至於為什麼分類準確率不是100%呢,這個我們後面再討論。

  4. 另外一個說明weight normalization有效的例子即使Liu weiyang的Large Margin softmax與sphereface的對比,sphereface相較Large Margin softmax,其實就採用了Weight Normalization,最後的在LFW上的精度提升巨大。同樣,作者在sphereface的v3版本里面的附錄給出了weight Normalization的一些實驗,感興趣可以去瀏覽。

可能你看完上面的分析你就明白我要講什麼了,對的,那就是:沒有海量資料的情況下怎麼辦?資料不夠,先驗來湊。

5 Feature Normalization

5.1 Feature Norm

在講Feature Normalization之前我們必須清楚的瞭解到Feature Norm到底代表什麼含義,簡單點來說,Feature Norm就是特徵向量x的長度。所以,我們先要弄懂特徵向量x的每一個維度代表什麼。

先看一個簡單的例子,人臉檢測,最後輸出一個1維的特徵x,即置信度,當我們認為這個區域裡面一定存在人的時候,輸出1;當我們認為這個區域裡面不存在人的時候,輸出0。或者換一種說法,整個檢測器就是一個相關判斷器,整個CNN提取特徵的網路就是一個掃描器,掃描感興趣的東西(在這裡也就是人臉)。掃到人臉,就是相關,輸出的feature norm接近於1;沒有掃到人臉,就是不相關,輸出的feature norm接近於0.

對於人臉識別來說,同樣如此。人臉識別最後的特徵維度一般從128到512不等,一般認為512維已經足夠表示人臉的分佈了。我們把特徵x拆開,可以認為x的每一個維度都是一個檢測器,至於是什麼檢測器,就要看它對什麼東西感興趣了,可能是人眼大小的檢測器,也可能是山羊鬍須檢測器。總的來說是人臉的一些區域性特徵的檢測器,那合在一起是什麼呢?其實也就是人臉檢測器。

我們可以說,如果人臉特徵x的norm越大,那麼它就越像一張人臉;如果人臉特徵x的norm越小,那麼它就越不像一張人臉。

你覺得我可能在瞎BB,憑什麼就能把人臉特徵當成檢測器呢?

5.2 為什麼分類器能夠把人臉分開?

這個問題很難回答,我們從反方向來思考一下:什麼樣的人臉難以被區分?

看一個極端的例子:

黑色圖片

這個和誰比較像?嗯,可能和非洲人有點像。

那這個呢:

白色圖片 嗯,可能後歐洲人比較像。

事實上,上面那張黑色圖片和白色圖片的feature norm都接近於0。

我同樣也測試過其他很多圖片,其feature norm如下:

結論就是:如果臉部特徵丟失(例如模糊,光照,側臉,遮擋),此時該人臉變得難以區分,其feature norm就會相應減少。

5.3 那麼要不要feature normalization呢?

我的結論是不需要,因為模糊,遮擋這些並不是人臉的正常狀態,其對分類的影響力自然無法與正常的人臉相比。進行feature normalization反而會破壞整體的分佈。

6.Triplet

在Weight Normalization裡面我們遺留了一個問題,那就是Guo Yandong論文裡面提及到的最後1K個id的分類準確率是70%多而不是接近100%,這又是為什麼呢?

Weight Normalization真的解決了樣本不均衡的問題嗎?

不然,樣本不均衡的問題仍然存在,還是看之前Weight Normalization提到的一個簡單的例子:

現在我們變成了4個id,前兩個id有100張圖片,後兩個id只有1張圖片,如果按照Weight Normalization的方法,我們的分類會變成這樣的:

也就是說除非我們把id3,id4的圖片數量增加到100個,才能完全消除樣本不均衡的影響,這也就是某些論文中要將圖片數小於30個的類去除的原因。

我們能夠這樣說:

如果這個id沒有足夠多的樣本,那麼這個id是不能被當成一個類的

什麼叫做不能被當成一個類呢?就是說這個類不應該存在分類類中心。

如果我們要做one-shot learning,比如我們現在有全國每一個人的身份證照,但是隻有一張,怎麼辦,我們又不能把這些圖片給刪掉。

不計算類中心最為簡單的辦法就是triplet。
這裡的tirplet不是指triplet loss,而是指triplet的a,p,n三元組。

對於triplet loss我是不怎麼看好的,因為它同時更新a,p,n,走了樣本不均衡的老路。

但是a,p,n這個屬性,確實極好的。比如我們上面提到的one-shot learning。採用triplet的一種簡單方式就是把只有1張的id全部當成n,把有足夠多張圖片的id當成a,p。同時為了避免樣本不均衡帶來的影響,我們只對a進行梯度回傳,對於p,n則不進行梯度回傳。

我在我github專案裡的Angular Triplet Loss裡面的MarginInnerProduct.cpp/.cu裡面就實現了上面這種triplet的形式,我稱其為easy triplet,感興趣的讀者可以瀏覽一下。

那麼我們講的東西到這裡就結束了,第一次寫文章,排版不是很會,希望不影響閱讀。

為什麼叫深度挖坑呢,因為這個東西確實比較坑了,都叫深度學習了,結果沒有海量資料,還要和有限的資料做鬥爭。
最後,本人並非CS出身,上面這些都只是個人的一些感悟,如果發現了文章裡的問題,歡迎在留言裡面提出來,非常感謝。

===更新=

  1. Q:為什麼視覺化會變成那種樣子?
    A:可以手動計算softmax loss,在保證特徵可分的情況下那種情況softmax loss最小

  2. Q :為什麼質量差的圖片feature norm小呢?
    A :考慮兩點:
    1.質量差的圖片難以被分類,一張模糊的圖片(看不清五官)可能和所有的人都像,怎麼樣才能讓他和所有的人都像呢?在空間上只能讓他的feature norm小。
    2.質量差的圖片不能學習特徵,比如一張戴了墨鏡的人臉圖片,如果給墨鏡提取了一維特徵的話,那麼一個戴墨鏡人臉和另外一個戴墨鏡人臉的相似度就會提高。因為像遮擋這種,並非人的本質特徵,所以我們不需要給他提特徵,其feature norm自然就小。

  3. Q:暴力進行Weight Norm是否會有什麼不同?
    A :見 https://github.com/wy1iu/sphereface ,對於梯度回傳做了詳細的分析

原文連線:深度挖坑:從資料角度看人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用

        </div>
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-2b43bc2447.css" rel="stylesheet">
            </div>
				</article>