楊俊欽,張雨楠,林實鋒,徐偉臻
(廣州大學計算機科學與教育軟件學院,廣州 510006)
人臉作為人體顯著的生物特征之一,與指紋、虹膜一樣包含著豐富的個人信息,如:性別、年齡、種族、表情、發(fā)型、是否戴口罩帽子,等等。這些人臉屬性信息在海量圖像檢索、智能視頻監(jiān)控、輔助駕駛、人機交互、精準廣告投放、娛樂休閑等系統(tǒng)中有著廣泛的應用,涉及安防、金融、廣告、娛樂等多個領域,與人們的生活息息相關。此外,相比于指紋、虹膜等生物特征所含有的信息,人臉屬性具有信息易于獲取、識別符合人類習慣等優(yōu)勢。
在傳統(tǒng)的人臉屬性識別方法中,程序通常先檢測人臉區(qū)域,再提取以關鍵點為中心的圖像塊的高維特征,如方向梯度直方圖特征(Histogram of Oriented Gra?dient,HOG)[1]或局部二值模式特征(Local Binary Pat?tern,LBP)[2],然后將其拉伸成長向量訓練分類器對屬性進行識別。這類方法對于限定條件下的正臉圖像表現尚可,但在非限定條件下易受復雜環(huán)境影響,其準確率不高,難以滿足人們的需求。
近年來,深度神經網絡發(fā)展迅速,許多圖像識別研究基于深度學習開展。在人臉屬性識別問題上也出現了多種深度神經網絡的方法和應用,如L-MFCNN方法[3],面向嵌入式應用的DeepID網絡模型[4],等等。但是大多神經網絡方法主要針對單一或者少量的人臉屬性,很少做到多個屬性識別,難以滿足市場的需求。根據上述問題,本文設計并實現了一種基于深度卷積神經網絡(Deep Convolution Neural Networks,DCNNs)的人臉多屬性識別系統(tǒng)。該系統(tǒng)利用公開的人臉屬性數據集CelebA[5],基于PyTorch深度學習框架設計訓練了級聯的深度卷積神經網絡模型,模型在CelebA上的平均識別準確率達到了90.09%。
為了提高自然場景下的人臉屬性識別的準確率和效率,本系統(tǒng)基于深度學習算法,設計了人臉屬性識別模型,模型級聯了人臉關鍵點(landmark)定位和人臉屬性識別兩個網絡。對于自然場景下的圖片輸入,模型首先使用人臉關鍵點定位網絡對人臉進行關鍵點定位,進而根據定位結果校準并截取人臉圖像,最后將對齊后的人臉圖像輸出到人臉屬性識別網絡中,完成屬性識別。其整體工作流程如圖1所示。
圖1 人臉屬性識別流程圖
人臉關鍵點定位,即在原始圖像的基礎上定位人臉的關鍵點,例如眼睛、鼻子、嘴巴等的坐標。其目的是為了利用定位的關鍵點進行人臉圖像的校準與截取,排除角度、姿態(tài)因素對于人臉圖像分類的影響。
本文采用一個主干-分支的全卷積神經網絡模型(Backbone-Branches Fully-Convolutional Neural Net?work,BB-FCN)來進行人臉關鍵點定位。該模型能夠直接從原始圖像產生人臉關鍵點熱度圖而不需要任何預處理工作。模型采用了從粗到精的定位過程,先采用全局的主干網絡粗略地估計人臉關鍵點的位置,然后對全局關鍵點位置取圖像塊訓練分支網絡,進一步優(yōu)化該關鍵點的定位。為了提高算法的運行效率,模型只標注人臉的雙眼、鼻子和嘴巴的兩個嘴角共計5個關鍵點。
模型進行關鍵點定位的具體操作過程是:首先把整幅圖像輸入到BB-FCN的主干網,主干網由多個卷積層和最大值池化層交替堆疊而成,處理所有關鍵點、輸出低分辨率的響應圖像;然后根據響應圖像反向定位關鍵點,以關鍵點為中心提取原圖像中的相應的圖像塊;接下來以包含關鍵點的圖像塊為輸入訓練分支網絡,分支網絡僅包含卷積層以保證最后輸出準確定位高分辨率的響應圖像。
關鍵點定位完成以后,本文以雙眼的坐標連線的中點為原點建立二維直角坐標系,將圖片旋轉變換,使雙眼的坐標點位于水平軸方向上,以此完成人臉的對齊。之后,借助已定位的關鍵點坐標的橫、縱向位置,分別估計出人臉的高度和寬度,以此截取出對齊的人臉圖像。
經過人臉關鍵點網絡的定位后,系統(tǒng)得到對齊的人臉圖像,根據對齊的人臉圖像,系統(tǒng)需要進行進一步的人臉多屬性分類。
在人臉屬性識別模型中,文獻[5]最先提出使用ANet+LNet的深度學習方法進行人臉多屬性進行識別,超越了傳統(tǒng)方法。MOON[6]在DCNNs的基礎上,通過改進網絡模型和人臉屬性數據集的不平衡時難以對深度卷積神經網絡進行多任務聯合優(yōu)化的問題,進一步提高了準確率。隨著近年來深度學習的快速發(fā)展,深度卷積神經網絡的模型性能不斷完善,人臉多屬性識別的準確率還可進一步提升。
本文采用殘差網絡來進行人臉屬性識別。殘差網絡是利用殘差來重構神經網絡的映射,把輸入x再次引人到結果,其相比其他網絡模型更易于優(yōu)化,并且可以大幅增加網絡深度,從而提高識別準確率。殘差網絡的結構是由多個殘差塊堆疊而成,單個殘差塊采用跨層連接的模式設計,內部由兩個卷積結構組成,其結構如圖2所示。
圖2 殘差塊模型
本文采用了香港中文大學發(fā)布的CelebA人臉屬性數據集作為實驗數據集。該數據集包含約20萬張人臉圖像,每張圖片提供了40個人臉屬性標注和5個人臉關鍵點的位置信息。本文依據CelebA官方的標準,取其中的約16萬張人臉圖像用于網絡模型的訓練,約2萬張圖像用于驗證,2萬張圖像用于測試網絡模型。本實驗在CelebA提供的圖片數據集上進行模型準確率的測試,并聯合整個系統(tǒng)進行系統(tǒng)的性能測試,對系統(tǒng)的現實應用能力進行綜合評估。
針對多標簽分類問題,本系統(tǒng)算法使用交叉熵作為損失函數進行訓練,該函數創(chuàng)建一個衡量目標和輸出之間的交叉熵的標準,其公式如公式(1):
公式(1)中的m表示屬性總數,ni表示第i個屬性的樣本總數,y(i)指第i個屬性第j個樣本的標注值,而jhx(i)指第i個屬性第j個樣本的預測值。θj
為了方便與其他網絡模型的實驗結果比較,本文采用了多屬性平均識別準確率(mACC)作為評價標準,其計算公式如下公式(2):
本文隨機抽取12項人臉屬性進行測試,其平均識別準確率達到了90.02%。實驗結果見表1,在相同的測試條件下,所有屬性的識別準確率均高于已有的方法 ANet+LNet和 MOON。
表1 在數據集CelebA上識別正確率比較
系統(tǒng)運行平臺為Windows 10操作系統(tǒng),開發(fā)語言為Python 3.5.2,基于PyTorch神經網絡開源框架開發(fā)。
本文的人臉屬性識別系統(tǒng)功能主要分為兩部分:圖像獲取和屬性識別。
圖像獲取分為兩種方式:第一種方式是系統(tǒng)調用攝像頭設備,拍攝并采集圖像,將圖像存入內存進行識別。本系統(tǒng)對攝像頭的調用通過OpenCV(Open Source Computer Vision Library)計算機視覺庫實現。OpenCV調用攝像頭獲取圖像的步驟為:①利用Video?Capture函數獲取攝像頭對象;②在內存中開辟三維矩陣空間用以保存彩色(多通道)圖像;③將圖像的像素以矩陣形式保存到內存中。
第二種方式是通過用戶選取保存在硬盤內部的人臉圖像文件,將其送入內存中。
屬性識別部分的具體工作流程主要包括以下幾個步驟:從內存中獲取圖像,對圖像進行人臉關鍵點定位、人臉校準以及人臉截取處理,預處理后進行人臉屬性識別,最后將識別結果輸出。
具體工作流程如圖3所示。
圖3 系統(tǒng)運作主要流程
系統(tǒng)效率的主要影響因素為神經網絡模型的加載和對圖像的處理速度。我們在CelebA數據集上進行測試,單張圖片從加載到完成所有屬性的識別需時236ms。該時長保證了用戶在使用系統(tǒng)時能有較好的交互體驗。
系統(tǒng)運行時的效果如圖4所示。系統(tǒng)提供了用攝像頭獲取圖像、從本機選取圖像、屬性識別圖像等多種功能。用戶能夠通過兩種方式輸入圖像,對系統(tǒng)進行識別。一種是從本機中選取人臉圖像,圖像選擇后將顯示在界面中部;另一種是通過調用計算機配備的攝像頭直接獲取用戶圖像,將獲取的圖像顯示在界面中部。識別之后界面右側出現識別結果。
圖4 系統(tǒng)運行結果
本文設計并實現了一個人臉多屬性識別系統(tǒng)。該系統(tǒng)設計了級聯的神經網絡分別對圖像進行關鍵點定位和屬性識別,其中關鍵點定位采用了主干-分支網絡結構,能夠直接從原始圖像中提取關鍵點信息,進而幫助系統(tǒng)獲取對齊后的人臉;屬性識別方面則使用了較為先進的殘差網絡,提高了系統(tǒng)的識別準確率(平均識別準確率為90.02%),有良好的應用前景。