了解人臉識別算法訓練,看這篇就夠了!(人臉識別 算法)

      網友投稿 1215 2022-05-30

      前言

      大家應該都看過布拉德.伯德執導、湯姆.克魯斯主演的《碟中諜4吧》?茫茫人海的火車站,只要一眨眼的功夫已經被計算機識別出來,隨即被特工盯梢;迎面相逢的美女是致命殺手,手機發出嘀嘀的報警聲,上面已經顯示美女的姓名和信息。這就是本文想要介紹的人臉識別算法,以及如果使用公有云AI平臺訓練模型。

      人臉識別是目前人工智能領域中成熟較早、落地較廣的技術之一,人臉識別的目的是要判斷圖片和視頻中人臉的身份。從平常手機的刷臉解鎖、刷臉支付,再到安防領域內的人臉識別布控,等等,人臉識別技術都有著廣泛的應用。人臉是每個人與生俱來的特征,該特征具有唯一性并且不易被復制,因此為身份鑒別提供了必要的前提。

      人臉識別的研究始于20世紀60年代,隨著計算機技術和光學成像技術的發展不斷提高,以及近幾年神經網絡技術的再次興起,尤其是卷積神經網絡在圖像識別和檢測中取得的巨大成功,使得人臉識別系統的效果得到了極大的提升。本文,我們從人臉識別技術的技術細節講起,帶你初步了解人臉識別技術的發展過程,文章的后半篇,我們將會使用ModelArts平臺的自定義鏡像,帶你看看如何利用公有云的計算資源,快速訓練一個可用的人臉識別模型。

      想了解人臉識別算法訓練,看這篇就夠了!(人臉識別 算法)

      正文

      不管是基于傳統圖像處理和機器學習技術,還是利用深度學習技術,其中的流程都是一樣的。如圖1所示,人臉識別系統都包括人臉檢測、對齊、編碼以及匹配四個基本環節組成。所以該部分首先通過對基于傳統圖像處理和機器學習算法的人臉識別系統進行概述,就可以看出整個深度學習算法在人臉識別領域內發展的脈絡。

      圖1 人臉檢測流程

      傳統機器學習算法

      前面已經說過,人臉識別的目的就是要判斷圖像中的人臉身份是什么,所以就首先需要先把圖像中的人臉檢測出來,其實這一步歸根結底就是一個目標檢測的問題。傳統的圖像目標檢測算法主要有三部分組成,建議框生成、特征工程以及分類,包括著名的RCNN系列算法的優化思路也是基于這三部分進行的。

      首先是建議框生成,該步驟最簡單的想法就是在圖片中crop出來一堆待檢測框,然后檢測該框內是否存在目標,如果存在,則該框在原圖中的位置即為目標檢測出的位置,因此在該步驟中對目標的覆蓋率越大,則建議框生成策略越好。常見的建議框生成策略有sliding window、Selective Search、Randomized Prim等等,生成大量的候選框,如下圖所示。

      圖2 人臉建議框生成

      得到大量的候選框后,傳統的人臉檢測算法接下來最主要的部分就是特征工程。特征工程其實就是利用算法工程師的專家經驗對不同場景的人臉提取各種特征,例如邊緣特征、形狀形態學特征、紋理特征等等,具體的算法是技術有LBP、Gabor、Haar、SIFT等等特征提取算法,將一張以二維矩陣表示的人臉圖片轉換成各種特征向量的表示。

      得到特征向量之后,就可以通過傳統的機器學習分類器對特征進行分類,得到是否是人臉的判斷,例如通過adaboost、cascade、SVM、隨機森林等等。通過傳統分類器分類之后就可以得到人臉的區域、特征向量以及分類置信度等等。通過這些信息,我們就可以完成人臉對齊、特征表示以及人臉匹配識別的工作。

      以傳統方法中,經典的HAAR+AdaBoost的方法為例,在特征提取階段,首先會利用haar特征在圖片中提取出很多簡單的特征。Haar特征如下圖3所示。為了滿足不同大小人臉的檢測,通常會利用高斯金字塔對不同分辨率的圖像進行Haar特征的提取。

      圖3 Haar特征示意圖

      Haar特征的計算方法是將白***域內的像素和減去黑***域,因此在人臉和非人臉的區域內,得到的值是不一樣的。一般在具體實現過程中,可以通過積分圖的方法快速實現。一般在歸一化到20*20的訓練圖片中,可供使用的Haar特征數在一萬個左右,因此在這種特征規模的情況下,可以利用機器學習的算法進行分類和識別。

      得到Haar特征后,可以利用Adaboost進行分類,Adaboost算法是一種將多個比較弱的分類方法合在一起,組合出新的強分類方法。根據該級聯分類器,和訓練好的各個特征選擇閾值,就可以完成對人臉的檢測。

      從上述方法可以看出,傳統的機器學習算法是基于特征的算法,因此需要大量的算法工程師的專家經驗進行特征工程和調參等工作,算法效果也不是很好。而且人工設計在無約束環境中對不同變化情況都魯棒很困難的。過去的圖像算法是工程師更多的是通過傳統的圖像處理方法,根據現實場景和專家經驗提取大量的特征,然后對提取的特征再進行統計學習的處理,這樣整體算法的性能就非常依賴于現實場景和專家經驗,對于人臉這種類別巨大,每類樣本不均衡情況嚴重的無約束場景效果并不是很好。因此,近幾年隨著深度學習在圖像處理中取得的巨大成功,人臉識別技術也都以深度學習為主,并且已經達到了非常好的效果。

      深度學習在人臉識別領域的應用

      在深度學習的人臉識別系統中,該問題被分成了一個目標檢測問題和一個分類問題,而目標檢測問題在深度學習中本質還是一個分類問題和回歸問題,因此隨著卷積神經網絡在圖片分類上的成功應用,人臉識別系統的效果得到了快速且巨大的提升,并以此誕生了大量的視覺算法公司,并將人臉識別應用在了社會生活的各個方面。

      其實利用神經網絡來做人臉識別并不是什么新思想,1997年就有研究者為人臉檢測、眼部定位和人臉識別提出了一種名為基于概率決策的神經網絡的方法。這種人臉識別?PDBNN 被分成了每一個訓練主體一個全連接子網絡,以降低隱藏單元的數量和避免過擬合。研究者使用密度和邊特征分別訓練了兩個 PBDNN,然后將它們的輸出組合起來得到最終分類決定。但是受限于當時算力和數據的嚴重不足,算法相對簡單,因此該算法并沒有得到很好的效果。隨著僅今年反向傳播理論和算力框架等的日趨成熟,人臉識別算法的效果才開始得到巨大的提升。

      在深度學習中,一個完整的人臉識別系統也包括圖1所示的四個步驟,其中第一步驟叫做人臉檢測算法,本質也是一個目標檢測算法。第二個步驟叫做人臉對齊,目前又基于關鍵點的幾何對齊和基于深度學習的人臉對齊。第三個步驟特征表示,在深度學習中是通過分類網絡的思想,提取分類網絡中的一些feature層作為人臉的特征表示,然后用相同的方式對標準人臉像進行處理,最后通過比對查詢的方式完成整體的人臉識別系統。下面主要對人臉檢測和人臉識別算法的發展進行簡單綜述。

      人臉檢測

      深度學習在圖像分類中的巨大成功后很快被用于人臉檢測的問題,起初解決該問題的思路大多是基于CNN網絡的尺度不變性,對圖片進行不同尺度的縮放,然后進行推理并直接對類別和位置信息進行預測。另外,由于對feature map中的每一個點直接進行位置回歸,得到的人臉框精度比較低,因此有人提出了基于多階段分類器由粗到細的檢測策略檢測人臉,例如主要方法有Cascade CNN、 DenseBox和MTCNN等等。

      MTCNN是一個多任務的方法,第一次將人臉區域檢測和人臉關鍵點檢測放在了一起,與Cascade CNN一樣也是基于cascade的框架,但是整體思路更加的巧妙合理,MTCNN總體來說分為三個部分:PNet、RNet和ONet,網絡結構如下圖4所示。

      圖4 MTCNN網絡結構示意圖

      首先PNet網絡對輸入圖片resize到不同尺寸,作為輸入,直接經過兩層卷積后,回歸人臉分類和人臉檢測框,這部分稱之為粗檢測。將粗檢測得到的人臉從原圖中crop出來后,在輸入的R-Net,再進行一次人臉檢測。最后將得到的人臉最終輸入O-Net,得到的O-Net輸出結果為最終的人臉檢測結果。MTCNN整體流程相對比較簡單,能夠快速的進行部署和實現,但是MTCNN的缺點也很多。包括多階段任務訓練費時,大量中間結果的保存需要占用大量的存儲空間。另外,由于改網絡直接對feature點進行bounding box的回歸,對于小目標人臉檢測的效果也不是很好。還有,該網絡在推理的過程中為了滿足不同大小人臉檢測需要,要將人臉圖片resize到不同尺寸內,嚴重影響了推理的速度。

      隨著目標檢測領域的發展,越來越多的實驗證據證明目標檢測中更多的瓶頸在于底層網絡語義低但定位精度相對較高和高層網絡語義高但定位精度低的矛盾,目標檢測網絡也開始流行anchor-based的策略和跨層融合的策略,例如著名的Faster-rcnn、SSD和yolo系列等。因此,人臉檢測算法也越來越多的利用anchor和多路輸出來滿足不同大小人臉檢出的效果,其中最著名的算法就是SSH網絡結構。

      圖5 SSH網絡結構示意圖

      從上圖中可以看出,SSH網絡已經有對不同網絡層輸出進行處理的方法,只需要一遍推理就能完成不同大小人臉的檢測過程,因此稱之為Single Stage。SSH的網絡也比較簡單,就是對VGG不同卷積層驚醒了分支計算并輸出。另外還對高層feature進行了上采樣,與底層feature做Eltwise Sum來完成底層與高層的特征融合。另外SSH網絡還設計了detection module和context module,其中context module作為detection module的一部分,采用了inception的結構,獲取更多上下文信息以及更大的感受野。

      圖6 SSH中的detection module模塊

      圖7 SSH中detection module里的context module模塊

      SSH利用1×1卷積對輸出最終的回歸和分類的分支結果,并沒有利用全連接層,因此可以保證不同尺寸圖片的輸入都能得到輸出的結果,也是響應了當時全卷積設計方式的潮流。遺憾的是該網絡并沒有輸出landmark點,另外其實上下文結構也沒有用到比較流行的特征金字塔結構,VGG16的backbone也相對較淺,隨著人臉優化技術的不斷進行,各種各樣的trick也都日趨成熟。因此,最后向大家介紹一下目前人臉檢測算法中應用比較廣的Retinaface網絡。

      Retinaface由google提出,本質是基于RetinaNet的網絡結構,采用特征金字塔技術,實現了多尺度信息的融合,對檢測小物體有重要的作用。網絡結構如下所示。

      圖8 RetinaFace網絡結構示意圖

      從上圖可以看出,Retinaface的backbone網絡為常見的卷積神經網絡,然后加入特征金子塔結構和Context Module模塊,進一步融合上下文的信息,并完成包括分類、檢測、landmark點回歸以及圖像自增強的多種任務。

      因為人臉檢測的本質是目標檢測任務,目標檢測未來的方向也適用于人臉的優化方向。目前在目標檢測中小目標、遮擋目標的檢測依舊很困難,另外大部份檢測網絡更多的開始部署在端側,因此基于端側的網絡模型壓縮和重構加速等等更加考驗算法工程師對與深度學習檢測算法的理解和應用。

      人臉識別

      人臉識別問題本質是一個分類問題,即每一個人作為一類進行分類檢測,但實際應用過程中會出現很多問題。第一,人臉類別很多,如果要識別一個城鎮的所有人,那么分類類別就將近十萬以上的類別,另外每一個人之間可獲得的標注樣本很少,會出現很多長尾數據。根據上述問題,要對傳統的CNN分類網絡進行修改。

      我們知道深度卷積網絡雖然作為一種黑盒模型,但是能夠通過數據訓練的方式去表征圖片或者物體的特征。因此人臉識別算法可以通過卷積網絡提取出大量的人臉特征向量,然后根據相似度判斷與底庫比較完成人臉的識別過程,因此算法網絡能不能對不同的人臉生成不同的特征,對同一人臉生成相似的特征,將是這類embedding任務的重點,也就是怎么樣能夠最大化類間距離以及最小化類內距離。

      在人臉識別中,主干網絡可以利用各種卷積神經網絡完成特征提取的工作,例如resnet,inception等等經典的卷積神經網絡作為backbone,關鍵在于最后一層loss function的設計和實現。現在從兩個思路分析一下基于深度學習的人臉識別算法中各種損失函數。

      思路1:metric learning,包括contrastive loss, triplet loss以及sampling method

      思路2:margin based classification,包括softmax with center loss, sphereface, normface, AM-sofrmax(cosface) 和arcface。

      ?? Metric Larning

      1.??????? Contrastive loss

      深度學習中最先應用metric learning思想之一的便是DeepID2了。其中DeepID2最主要的改進是同一個網絡同時訓練verification和classification(有兩個監督信號)。其中在verification loss的特征層中引入了contrastive loss。

      Contrastive loss不僅考慮了相同類別的距離最小化,也同時考慮了不同類別的距離最大化,通過充分運用訓練樣本的label信息提升人臉識別的準確性。因此,該loss函數本質上使得同一個人的照片在特征空間距離足夠近,不同人在特征空間里相距足夠遠直到超過某個閾值。(聽起來和triplet loss有點像)。

      Contrastive loss引入了兩個信號,并通過兩個信號對網絡進行訓練。其中識別信號的表達式如下:

      驗證信號的表達式如下:

      基于這樣的信號,DeepID2在訓練的時候就不是以一張圖片為單位了,而是以Image Pair為單位,每次輸入兩張圖片,為同一人則為1,如果不是同一人則為-1.

      2.??????? Triplet loss from FaceNet

      這篇15年來自Google的FaceNet同樣是人臉識別領域分水嶺性質的工作。它提出了一個絕大部分人臉問題的統一解決框架,即:識別、驗證、搜索等問題都可以放到特征空間里做,需要專注解決的僅僅是如何將人臉更好的映射到特征空間。

      Google在DeepID2的基礎上,拋棄了分類層即Classification Loss,將Contrastive Loss改進為Triplet loss,只為了一個目的:學習到更好的feature。

      直接貼出Triplet loss的損失函數,其輸入的不再是Image Pair,而是三張圖片(Triplet),分別為Anchor Face, Negative Face和Positive Face。Anchor與Positive Face為同一人,與Negative Face為不同的人。那么Triplet loss的損失函數即可表示為:

      該式子的直觀解釋為:在特征空間里Anchor與Positive的距離要小于Anchor與Negative的距離并超過一個Margin Alpha。他與Contrastive loss的直觀區別由下圖所示。

      3.??????? Metric learning的問題

      上述的兩個loss function效果很不錯,而且也符合人的客觀認知,在實際項目中也有大量的應用,但該方法仍有一些不足之處。

      ·???????? 模型訓練依賴大量的數據,擬合過程很慢。由于contrastive loss和triplet loss都是基于pair或者triplet的,需要準備大量的正負樣本,,訓練很長時間都不可能完全遍歷所有可能的樣本間組合。網上有博客說10000人、500000張左右的亞洲數據集上花一個月才能完成擬合。

      ·???????? Sample方式影響模型的訓練。比如對于triplet loss來說,在訓練過程中要隨機的采樣anchor face, negative face以及positive face,好的樣本采樣能夠加快訓練速度和模型收斂,但是在隨機抽取的過程中很難做到非常好。

      ·???????? 缺少對hard triplets的挖掘,這也是大多數模型訓練的問題。比如說在人臉識別領域中,hard negatives表示相似但不同的人,而hard positive表示同一個人但完全不同的姿態、表情等等。而對hard example進行學習和特殊處理對于提高識別模型的精度至關重要。

      4.??????? 對于Metric Learning不足進行修正的各種trick

      a.?????? Finetune

      參考論文:Deep Face Recognition

      在論文《Deep Face Recognition》中,為了加快triplet loss的訓練,坐著先用softmax訓練人臉識別模型,然后移除頂層的classification layer,然后用triplet loss對模型進行特征層finetune,在加速訓練的同時也取得了很不錯的效果。該方法也是現在訓練triplet loss時最常用的方法。

      b.????? 對Triplet loss的修改

      參考論文:In Defense of the Triplet Loss for Person Re-Identification

      在Google提供的facenet triplet loss訓練時,一旦選定B triplets集合,數據就會按照順序排好的3個一組,那么總共的組合就有3B種,但是這些3B個圖像實際上有多達種有效的triplets組合,僅僅使用3B種就很浪費。

      其中是人為設定的閾值參數。TriHard loss會計算a和batch中的每一張圖片在特征空間的歐氏距離,然后選出與a距離最遠(最不像)的正樣本p和距離最近(最像)的負樣本n來計算三元組損失。其中d表示歐式距離。損失函數的另一種寫法如下:

      ?? 平方后的歐式距離不如開方后的真實歐氏距離(后續會簡單提一下原因)

      ?? 提出了Soft-Margin損失函數替代原始的Triplet loss表達式,soft-margin能夠使得損失函數更加平滑,避免函數收斂在bad local處,能夠一定程度上加速算法收斂。

      ?? 引進了Batch Hard Sampling

      該方法考慮了hard example后效果比傳統的triplet loss好。

      c.?????? 對loss以及sample方法的修改

      參考論文:Deep Metric Learning via Lifted Structured Feature Embedding

      該論文首先提出了現有的三元組方法無法充分利用minibatch SGD training的training batches的優勢,創造性的將the vector of pairwise distances轉換成the matrix of pairwise distance,然后設計了一個新的結構化損失函數,取得了非常好的效果。如下圖所示,是contrastice embedding,triplet embedding以及lifted structured embedding三種方式的采樣示意圖。

      其中P是正樣本集合,N是負樣本集合。可以看到對比上述的損失函數,該損失函數開始考慮一個樣本集合的問題。但是,并不是所有樣本對之間的negative edges都攜帶了有用的信息,也就是說隨機采樣的樣本對之間的negative edges攜帶了非常有限的信息,因此我們需要設計一種非隨機的采樣方法。

      通過上述的結構化損失函數我們可以看到,在最終計算損失函數時,考慮了最像和最不像的hard pairs(也就是損失函數中max的用處),也就相當于在訓練過程中添加了difficult neighbors的信息了訓練mini-batch,通過這種方式訓練數據能夠大概率的搜尋到hard negatives和hard positives的樣本,而隨著訓練的不斷進行,對hard樣本的訓練也將實現最大化類間距離和最小化類內距離的目的。

      d.????? 對sample方式和對triplet loss的進一步修改

      參考論文:Sampling Matters in Deep Embedding Learning

      1)??????? 對采樣方式的修改

      在現實狀態下,我們隊所有的樣本進行兩兩采樣,計算其距離,最終得到點對距離的分布有著如下的關系:

      那么根據給定的距離,通過上述函數的反函數就可以得到其采樣概率,根據該概率決定每個距離需要采樣的比例。給定一個anchor,采樣負例的概率為下式:

      2)??????? 對loss function的修改

      我們稱anchor樣本與正例樣本之間的距離為正例對距離;稱anchor樣本與負例樣本之間的距離為負例對距離。公式中的參數beta定義了正例對距離與負例對距離之間的界限,如果正例對距離Dij大于beta,則損失加大;或者負例對距離Dij小于beta,損失加大。A控制樣本的分離間隔;當樣本為正例對時,yij為1,樣本為負例對時,yij為-1。下圖為損失函數曲線。

      ?? Margin Based?Classification

      Margin based classification不像在feature層直接計算損失的metric learning那樣對feature加直觀的強限制,是依然把人臉識別當 classification 任務進行訓練,通過對 softmax 公式的改造,間接實現了對 feature 層施加 margin 的限制,使網絡最后得到的 feature 更 discriminative。

      1.????? Center loss

      參考論文:A Discriminative Feature Learning Approach for Deep Face Recognition

      ECCV 2016的這篇文章主要是提出了一個新的Loss:Center Loss,用以輔助Softmax Loss進行人臉的訓練,為了讓同一個類別壓縮在一起,最終獲取更加discriminative的features。center loss意思即為:為每一個類別提供一個類別中心,最小化min-batch中每個樣本與對應類別中心的距離,這樣就可以達到縮小類內距離的目的。下圖為最小化樣本和類別中心距離的損失函數。

      為每個batch中每個樣本對應的類別中心,和特征的維度一樣,用歐式距離作為高維流形體距離表達。因此,在softmax的基礎上,center loss的損失函數為:

      個人理解Center loss就如同在損失函數中加入了聚類的功能,隨著訓練的進行,樣本自覺地聚類在每一個batch的中心,進一步實現類間差異最大化。但是我覺得,對于高維特征,歐氏距離并不能反映聚類的距離,因此這樣簡單的聚類并不能在高維上取得更好的效果。

      2.????? L-Softmax

      原始的Softmax的目的是使得,將向量相乘的方式變換為向量的模與角度的關系,即,在這個基礎上,L-Softmax希望可以通過增加一個正整數變量m,可以看到:

      使得產生的決策邊界可以更加嚴格地約束上述不等式,讓類內的間距更加的緊湊,讓類間的間距更加有區分性。所以基于上式和softmax的公式,可以得到L-softmax的公式為:

      由于cos是減函數,所以乘以m會使得內積變小,最終隨著訓練,類本身之間的距離會增大。通過控制m的大小,可以看到類內和類間距離的變化,二維圖顯示如下:

      有人反饋L-Softmax調參難度較大,對m的調參需要反復進行,才能達到更好的效果。

      3.????? Normface

      參考論文:NormFace: L2 Hypersphere Embedding for Face Verification

      這篇論文是一篇很有意思的文章,文章對于權重與特征歸一化做了很多有意思的探討。文章提出,sphereface雖然好,但是它不優美。在測試階段,sphereface通過特征間的余弦值來衡量相似性,即以角度為相似性度量。但在訓練過程中也有一個問題,權重沒有歸一化,loss function在訓練過程中減小的同時,會使得權重的模越來越大,所以sphereface損失函數的優化方向并不是很嚴謹,其實優化的方向還有一部分去增大特征的長度了。有博主做實驗發現,隨著m的增大,坐標的尺度也在不斷增大,如下圖所示。

      4.????? AM-softmax/CosFace

      參考論文:Additive Margin Softmax for Face Verification

      CosFace: Large Margin Cosine Loss for Deep Face Recognition

      看上面的論文,會發現少了一個東西,那就是margin,或者說是margin的意味少了一些,所以AM-softmax在歸一化的基礎上有引入了margin。損失函數如下:

      直觀上來看,-m比更小,所以損失函數值比Normface里的更大,因此有了margin的感覺。m是一個超參數,控制懲罰,當m越大,懲罰越強。該方法好的一點是容易復現,而且沒有很多調參的tricks,效果也很好。

      5.????? ArcFace

      與 AM-softmax 相比,區別在于 Arcface 引入 margin 的方式不同,損失函數:

      乍一看是不是和 AM-softmax一樣?注意 m 是在余弦里面。文章指出基于上式優化得到的特征間的 boundary 更為優越,具有更強的幾何解釋。

      然而這樣引入 margin 是否會有問題?仔細想 cos(θ+m) 是否一定比 cos(θ) 小?

      最后我們用文章中的圖來解釋這個問題,并且也由此做一個本章 Margin-based?Classification?部分的總結。

      這幅圖出自于 Arcface,橫坐標為 θ 為特征與類中心的角度,縱坐標為損失函數分子指數部分的值(不考慮 s),其值越小損失函數越大。

      看了這么多基于分類的人臉識別論文,相信你也有種感覺,大家似乎都在損失函數上做文章,或者更具體一點,大家都是在討論如何設計上圖的 Target logit-θ 曲線。

      這個曲線意味著你要如何優化偏離目標的樣本,或者說,根據偏離目標的程度,要給予多大的懲罰。兩點總結:

      1. 太強的約束不容易泛化。例如 Sphereface 的損失函數在 m=3 或 4 的時候能滿足類內最大距離小于類間最小距離的要求。此時損失函數值很大,即 target logits 很小。但并不意味著能泛化到訓練集以外的樣本。施加太強的約束反而會降低模型性能,且訓練不易收斂。

      2. 選擇優化什么樣的樣本很重要。Arcface 文章中指出,給予 θ∈[60° , 90°] 的樣本過多懲罰可能會導致訓練不收斂。優化 θ ∈ [30° , 60°] 的樣本可能會提高模型準確率,而過分優化 θ∈[0° , 30°] 的樣本則不會帶來明顯提升。至于更大角度的樣本,偏離目標太遠,強行優化很有可能會降低模型性能。

      這也回答了上一節留下的疑問,上圖曲線 Arcface 后面是上升的,這無關緊要甚至還有好處。因為優化大角度的 hard sample 可能沒有好處。這和 FaceNet 中對于樣本選擇的 semi-hard 策略是一個道理。

      Margin based classification 延伸閱讀

      1. A discriminative feature learning approach for deep face recognition?[14]

      提出了 center loss,加權整合進原始的 softmax loss。通過維護一個歐式空間類中心,縮小類內距離,增強特征的 discriminative power。

      2. Large-margin softmax loss for convolutional neural networks?[10]

      使用ModelArts訓練人臉模型

      人臉識別算法實現解釋

      本文我們部署的人臉識別算法模型主要包括兩部分:

      第一部分為人臉檢測算法模型,該模型將圖片中的人臉進行識別,返回人臉的位置信息;

      第二部分為人臉特征表示算法模型,也稱之為識別模型。這個部分將crop出的人臉圖像embedding到一個固定維度大小的向量,然后利用該向量與底庫進行比對,完成人臉識別的整體流程。

      如下圖9所示,整體算法實現的流程分為線下和線上兩個部分,在每次對不同的人進行識別之前首先利用訓練好的算法生成人臉標準底庫,將底庫數據保存在modelarts上。然后在每次推理的過程中,圖片輸入會經過人臉檢測模型和人臉識別模型得到人臉特征,然后基于該特征在底庫中搜索相似對最高的特征,完成人臉識別的過程。

      圖9 ModelArts中人臉識別算法實現流程

      在實現過程中,我們采用了基于Retinaface+resnet50+arcface的算法完成人臉圖像的特征提取,其中Retinaface作為檢測模型,resnet50+arcface作為特征提取模型。

      在鏡像中,運行訓練的腳本有兩個,分別對應人臉檢測的訓練和人臉識別的訓練。

      ?? 人臉檢測的訓練腳本為:run_face_detection_train.sh

      該腳本的啟動命令為 sh run_face_detection_train.sh data_path model_output_path

      其中model_output_path為模型輸出的路徑,data_path為人臉檢測訓練集的輸入路徑,輸入的圖片路徑結構如下:

      detection_train_data/

      train/

      images/

      label.txt

      val/

      images/

      label.txt

      test/

      images/

      label.txt

      ?? 人臉識別的訓練腳本為:run_face_recognition_train.sh

      該腳本的啟動命令為 sh run_face_recognition_train.sh data_path model_output_path

      其中model_output_path為模型輸出的路徑,data_path為人臉檢測訓練集的輸入路徑,輸入的圖片路徑結構如下:

      recognition_train_data/

      cele.idx

      cele.lst

      cele.rec

      property

      ?? 底庫生成的腳本:run_generate_data_base.sh

      該腳本的啟動命令為:sh run_generate_data_base.sh data_path detect_model_path recognize_model_path db_output_path

      其中data_path為底庫輸入路徑,detect_model_path為檢測模型輸入路徑,recognize_model_path為識別模型輸入路徑,db_output_path為底庫輸出路徑。

      ?? 底庫生成的腳本:run_face_recognition.sh

      該腳本的啟動命令為:sh run_generate_data_base.sh data_path db_path detect_model_path recognize_model_path

      其中data_path為測試圖片輸入路徑,db_path為底庫路徑,detect_model_path為檢測模型的輸入路徑,recognize_model_path為識別模型的輸入路徑

      訓練過程

      華為云ModelArts有訓練作業的功能,可以用來作模型訓練以及對模型訓練的參數和版本進行管理。這個功能對于多版本迭代開發的開發者有一定的幫助。訓練作業中有預置的一些鏡像和算法,當前對于常用的框架均有預置鏡像(包括Caffe, MXNet, Pytorch, TensorFlow )和華為自己的昇騰芯片的引擎鏡像(Ascend-Powered-Engine)。

      本文我們會基于ModelArts的自定義鏡像特性,上傳自己在本機調試完畢的完整鏡像,利用華為云的GPU資源訓練模型。

      我們是想在華為云上的ModelArts基于網站上常見的明星的數據訓練完成一個人臉識別模型。在這個過程中,由于人臉識別網絡是工程師自己設計的網絡結構,所以需要通過自定義鏡像進行上傳。所以整個人臉訓練的過程分為以下九步:

      1.???????? 構建本地Docker環境

      2.???????? 從華為云下載基礎鏡像

      3.???????? 根據自己需求構建自定義鏡像環境

      4.???????? 導入訓練數據到自定義鏡像

      5.???????? 導入人臉識別底庫到自定義鏡像

      6.???????? 導入預訓練模型到自定義鏡像

      7.???????? 上傳自定義鏡像到SWR

      8.???????? 使用華為云訓練作業進行訓練

      9.???????? 使用華為云進行推理工作

      構建本地Docker環境

      Docker環境可以在本地計算機進行構建,也可以在華為云上購買一臺彈性云服務器進行Docker環境構建。全過程參考Docker官方的文檔進行:

      https://docs.docker.com/engine/install/binaries/#install-static-binaries

      從華為云下載基礎鏡像

      官網說明網址:

      https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0085.html#modelarts_23_0085__section19397101102

      我們訓練需要使用到的是MXNet的環境,首先需要從華為云上下載相對應的自定義鏡像的基礎鏡像。官網給出的下載命令如下:

      在訓練作業基礎鏡像的規范里,找到了這個命令的解釋。

      https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0217.html

      根據我們的腳本要求,我使用的是cuda9的鏡像:

      官方還給出了另一種方法,就是使用docker file的。基礎鏡像的dockerfile也是在訓練作業基礎鏡像的規范里找到的。可以參考一下的dockerfile:

      https://github.com/huaweicloud/ModelArts-Lab/tree/master/docs/custom_image/custom_base

      根據自己需求構建自定義鏡像環境

      由于比較懶,所以還是沒有使用Dockerfile的方式自己構建鏡像。我采用的是另一種方式!

      因為我們的需求就是cuda 9 還有一些相關的python依賴包,假設官方的鏡像提供的是cuda 9的,我們大可以在訓練腳本中跟著這個教程加一個requirement.txt。簡單高效快捷就能解決需求!!!下面是教程~~~

      https://support.huaweicloud.com/modelarts_faq/modelarts_05_0063.html

      上傳自定義鏡像到SWR

      官網教程:

      ·?????????? https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0085.html#modelarts_23_0085__section19397101102

      ·?????????? https://support.huaweicloud.com/usermanual-swr/swr_01_0011.html

      上傳鏡像的頁面寫著,文件解壓后不得超過2GB。但是官方提供的基礎鏡像就3.11GB,我們加上需要的預訓練的模型后鏡像是5+GB,所以不能使用頁面進行上傳的工作,必須使用客戶端。上傳鏡像首先要創建組織,

      如果覺得產品文檔理解還是比較難,可以嘗試一下SWR頁面的pull/push鏡像體驗:

      這里后面引導了客戶如何將本地鏡像推上云端,第一步是登陸倉庫:

      第二步拉取鏡像,這個我們就用自己打的自定義鏡像代替,

      第三步修改組織,使用根據產品文檔創建的組織名。在這一步需要將本地的一個鏡像重命名為云上識別的鏡像命。具體看下圖解釋:

      第四步推送鏡像,

      當熟練掌握這四步技巧的時候,可以脫離這個教程,使用客戶端進行上傳。使用客戶端登陸然后上傳。客戶端登陸可以使用生成臨時docker loging指令。這個頁面在”我的鏡像“-> ”客戶端上傳“->”生成臨時docker login指令“中:

      在本地docker環境中,使用這個生成的臨時docker login指令登陸后,使用下面的命令進行上傳鏡像:

      使用華為云訓練作業進行訓練

      華為云ModelArts提供訓練作業給用戶進行模型訓練。在訓練作業中有預置鏡像和可以選擇自定義鏡像。預置的鏡像包含市面上大部分框架,沒有特殊要求的時候,使用這些框架的鏡像進行訓練也是很方便的。本次測試還是使用的自定義鏡像。

      自定義鏡像中不僅需要在鏡像中進行配置自己的環境,假如改變了訓練作業啟動的方式,還需要修改訓練的啟動腳本。從華為云ModelArts官網拉取下來的官方鏡像的/home/work/路徑下有一個啟動腳本”run_train.sh”,自定義的啟動腳本需要基于這個腳本進行修改。主要是要注意 “dls_get_app”,這個是從OBS下載相關的命令。其他的部分根據自己的訓練腳本進行修改。

      如果需要上傳訓練結果或者模型到OBS,需要參考”dls_get_app”加”dls_upload_model”的命令。在我們這次訓練中,上傳的腳本如下:

      訓練作業進行調試的時候,當前可以使用免費提供的一小時V100。ModelArts的訓練作業一個比較好的地方是方便了我們版本管理。版本中會記錄所有通過運行參數傳入到訓練腳本里的所有參數,還可以使用版本對比進行參數對比。還有個比較方便的地方是可以基于某一個版本進行修改,減少了重新輸入所有參數這一步驟,比較方便調試。

      在訓練作業中訓練完成后,還可以在ModelArts中進行模型部署上線。

      后記

      目前針對人臉識別算法的優化已經到達一個瓶頸期,但是在技術層面針對人臉面部結構的相似性、人臉的姿態、年齡變化、復雜環境的光照變化、人臉的飾物遮擋等還面臨這很多的問題,因此基于多種算法技術的融合解決人臉識別中的各種問題仍然在安防、互聯網中有著巨大的市場。另外,隨著人臉支付的逐漸完善,人臉識別系統也應用于銀行、商場等等,因此人臉識別的安全問題和防攻擊問題也是一個亟待解決的問題,例如活體檢測、3D面部識別等等。

      最后,人臉識別作為目前深度學習中應用比較成熟的項目,其發展還與深度學習本身技術發展息息相關,目前在很多優化上,深度學習最大的缺點是沒有相應的數學理論支撐,優化所提升的性能也很有限,因此對深度學習算法本身的研究也是未來的重點。

      Leon Li:浙江大學光電系畢業生,在大華工作2年后,18年4月入職華為,一直從事圖像算法的優化以及相關產品落地的工作。

      Hannah Ding:英國UCL(倫敦大學學院)數據科學畢業生, 2018年6月應屆畢業生身份入職華為,機器學習平臺算法落地負責人。

      麥克周:在華為,每一位員工都會有自己的導師,我是Leon和Hannah的領路人。

      行業類

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:java框架-spring面試題 丨【奔跑吧!JAVA】(java spring框架面試題)
      下一篇:CBNetV2:北大提出的復合主干網絡,COCO成績60.1%
      相關文章
      亚洲AV成人潮喷综合网| 久久综合亚洲色HEZYO社区 | 男人的天堂av亚洲一区2区| 91亚洲性爱在线视频| 日韩亚洲人成在线综合日本| 中文字幕亚洲图片| 亚洲午夜福利精品久久| 夜色阁亚洲一区二区三区| 亚洲AV网一区二区三区| 亚洲AV色无码乱码在线观看| 日韩国产欧美亚洲v片| WWW国产亚洲精品久久麻豆| 亚洲中文字幕一区精品自拍| 亚洲无码一区二区三区| 亚洲另类无码一区二区三区| 亚洲精品乱码久久久久蜜桃 | 狠狠色伊人亚洲综合网站色| 激情亚洲一区国产精品| www.亚洲成在线| 亚洲欧美日韩中文无线码| 亚洲AV无码专区在线电影成人| 豆国产96在线|亚洲| 深夜国产福利99亚洲视频| 亚洲免费在线观看| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产亚洲人成在线影院| 亚洲国产精品一区二区三区久久| 久久亚洲中文字幕精品一区| 亚洲精品字幕在线观看| 亚洲AV成人片色在线观看 | 日本系列1页亚洲系列| 亚洲色偷偷综合亚洲AV伊人| 伊伊人成亚洲综合人网7777| 国产亚洲色婷婷久久99精品| 亚洲国产综合专区在线电影 | 亚洲国产日韩成人综合天堂| 亚洲最大激情中文字幕| 亚洲AV无码AV男人的天堂| 亚洲女人初试黑人巨高清| 一本色道久久88亚洲精品综合| 国产综合成人亚洲区|