火善棟
(重慶三峽學院計算機科學與工程學院,重慶 404000)
到目前為止,人臉識別已經(jīng)是一項比較成熟的技術(shù),而且成功應用于各種商業(yè)領(lǐng)域,但是,這些人臉識別技術(shù)不是算法過于復雜,就是技術(shù)不夠透明。為了克服這些技術(shù)壁壘,構(gòu)建屬于自己的人臉識別系統(tǒng),本文在已有的技術(shù)之上,通過構(gòu)建孿生網(wǎng)絡來探索該網(wǎng)絡模型在人臉識別上的有效性。
人臉識別屬于圖像分類問題,神經(jīng)網(wǎng)絡模型的傳統(tǒng)做法是:先使用大量帶標簽的圖片訓練模型,然后讓訓練好的模型對不在訓練集中的圖片進行分類,去預測輸入的圖片屬于哪一類。如果采用傳統(tǒng)的方法進行人臉識別,就需要把每一個不同的人臉圖片做為一個類別,然后采集大量的相同,或不同的人臉在不同狀態(tài)下的圖片進行分類訓練,這樣造成的問題就是,一方面分類數(shù)量龐大,另一方面對個人人臉圖片采集的難度也比較大;再者,即使完成了訓練,也只能對已經(jīng)訓練過的人臉進行識別,對于陌生的人臉則無法識別。這樣,一旦要識別的人群發(fā)生變化,整個模型則需要重新進行訓練,因此,采用傳統(tǒng)的方法進行人臉識別,其網(wǎng)絡模型的可擴展性也比較差,不具備實用價值。
孿生神經(jīng)網(wǎng)絡是基于兩個人工神經(jīng)網(wǎng)絡建立的耦合網(wǎng)絡,孿生網(wǎng)絡可以利用相同樣本對和不同樣本對之間的區(qū)別,訓練出一個網(wǎng)絡模型,使同類樣本生成的特征向量相近,不同樣本的特征向量遠離,從而讓網(wǎng)絡能夠識別兩張不同人臉的差別,進而達到進行人臉識別的目的。訓練孿生網(wǎng)絡的主要目的就是提高網(wǎng)絡模型的辨別力,對于任意輸入的兩張人臉圖片,網(wǎng)絡模型能夠識別是同一個人還是兩個不同的人,由于網(wǎng)絡模型自身的特點,訓練好的網(wǎng)絡模型可以對已經(jīng)訓練過的人臉圖片或者其它任意陌生的人臉圖片進行有效的識別,因此,孿生網(wǎng)絡的通用性比較好。
采用孿生網(wǎng)絡進行人臉識別,為了提高識別速度,通常會對要進行識別的人臉圖片進行采集并預先計算出特征向量并保存在數(shù)據(jù)庫中,在進行人臉識別的時候只需計算待檢測人臉的特征向量,然后與數(shù)據(jù)庫中的特征向量做比較,并通過設置合理的閥值從而達到人臉識別的目的。
采用pytorch[2]構(gòu)建殘差網(wǎng)絡,圖1為18層殘差網(wǎng)絡的基本結(jié)構(gòu),整個網(wǎng)絡總體由輸入層、殘差層和輸出層三部分組成。輸入層由一個卷積層和一個池化層組成;輸出層由一個池化層和一個全連接層組成;殘差層由四個殘差模塊組成,每個殘差模塊包含有兩個殘差塊,每一個殘差塊由兩個卷積層組成,除第一個殘差模塊輸入和輸出向量長寬不變以外,其它殘差模塊輸出向量長寬減少一半,通道數(shù)增加一倍,由于本實驗采用18層殘差網(wǎng)絡結(jié)構(gòu)實驗效果不是太理想,故采用了34層殘差網(wǎng)絡結(jié)構(gòu),34層與18層殘差網(wǎng)絡結(jié)構(gòu)輸入層與輸出層是一樣的,不同的是每個殘差模塊中殘差塊的個數(shù)不同,18層網(wǎng)路結(jié)構(gòu)每個殘差模塊殘差塊的個數(shù)都為2,32層每個殘差模塊的殘差塊個數(shù)分別為3、4、6、3。
圖1 18層殘差網(wǎng)絡結(jié)構(gòu)圖
以34層殘差網(wǎng)絡為基本網(wǎng)絡結(jié)構(gòu),構(gòu)建孿生網(wǎng)絡,兩個34層殘差網(wǎng)絡其參數(shù)是一樣的,其網(wǎng)絡結(jié)構(gòu)如圖2所示。
圖2 孿生網(wǎng)絡結(jié)構(gòu)圖
圖中Contrastive Loss[1]為損失函數(shù)[4]:
其中:Dw代表兩個樣本輸出特征向量的歐氏距離(本實驗特征向量的長度設置為10)。
式(1)中Y為兩個樣本是否匹配的標簽,Y=0代表兩個樣本相似或者匹配(同一個人臉照片);Y=1則代表不匹配(不同的人臉照片);m為設定的閾值(本實驗定為2.5),表示當人臉不相同時,只考慮不相似特征歐式距離在0~m之間的特征差值,當特征距離超過m時,則將其loss看做為0。
ContrastiveLoss損失函數(shù)所要達到的目的是:同一個人臉不同照片特征向量的距離越小越好,不同人臉照片特征向量的距離越大越好。
從網(wǎng)上下載數(shù)據(jù)集(外國人臉數(shù)據(jù)集,一共有500個不同人的照片,每個人有5張不同狀態(tài)的照片,累計總共有2500張照片,為了縮短訓練時間,本實驗只采用了其中的200個人、1000張照片進行訓練);為了去掉圖片噪音對人臉識別的影響,采用openCV對這1000張照片進行人臉檢測。由于進行人臉檢測時,有的圖片人臉的檢測效果不是太好,為了保證訓練人臉圖片的質(zhì)量,最后通過人工的方式對無法檢測到人臉的照片或者人臉檢測錯誤的照片進行裁剪,得到正確的人臉圖片,其效果如圖3所示。
圖3 人臉檢測效果示意圖
隨機從訓練集中提取樣本數(shù)據(jù),以32個樣本(正樣本和負樣本各占50%)作為一個訓練批次(注:一次迭代總的訓練批次為1000/32=32次),網(wǎng)絡總的迭代次數(shù)設置為500(網(wǎng)絡累計訓練次數(shù)大約為32×500=16000次),其訓練效果如圖4所示,從訓練結(jié)果來看,隨著迭代次數(shù)的增多,總的趨勢是差值越來越小,但在迭代過程中,誤差損失一直不穩(wěn)定,呈現(xiàn)出細微的波動。
圖4 訓練迭代次數(shù)與損失函數(shù)差值結(jié)果圖
從數(shù)據(jù)集中未參與訓練的照片中隨機抽取16組照片(8組人臉相同,8組人臉不相同)進行對比測試,其結(jié)果如圖5、圖6所示。
圖5 不同人臉識別截圖
圖6 相同人臉識別截圖
從上面幾組照片測試結(jié)果來看,孿生網(wǎng)絡在人臉識別方面可以達到一定的效果,不相同人臉特征差基本在2.5以上;相同人臉特征差總體上雖然偏?。ㄗ钚】梢赃_到0.5102),但是,有一組特征差值達到了2.4175,這樣必然會導致人臉識別出錯。當然,以上只是在訓練樣本比較少而且有些樣本圖片比較模糊的情況下得到的結(jié)果,如果在算力允許的情況下,改善網(wǎng)絡結(jié)構(gòu),優(yōu)化訓練算法,提高訓練樣本圖片的質(zhì)量,加大訓練樣本的規(guī)模和迭代次數(shù),還是有可能達到一個比較理想的效果。
表1 不相同人臉特征差值表
表2 相同人臉特征差值表
為了比較不同網(wǎng)絡結(jié)構(gòu)對人臉識別的效果,本文也通過比較流行的VGG19、ResNet50、Inception[5]等網(wǎng)絡構(gòu)建孿生網(wǎng)絡,并進行了訓練和測試,其效果各有千秋。總之,由于用孿生網(wǎng)絡進行人臉識別最本質(zhì)的特點就是:通過學習樣本,訓練網(wǎng)絡模型對相同和不同人臉的分辨力,相同的人臉特征值差越小越好,不相同的人臉特征值越大越好,這樣必然會導致相同的人臉在狀態(tài)差別比較大或者不相同人臉在特征相貌非常相似的情況下很難達到正確識別的目的;但是,由于孿生網(wǎng)絡其原理和構(gòu)建都比較簡單,而且通過小樣本訓練就可以在一定程度上達到正確識別的目的,所以,在一些人臉識別不太嚴格的場合,例如,住宅小區(qū)人臉識別、人臉考勤等方面通過改善訓練樣本圖片的質(zhì)量,提高人臉檢測的準確度以及對人臉不同狀態(tài)進行多次識別的情況下仍然具有一定的實際意義。