葉惠仙
(福建農(nóng)業(yè)職業(yè)技術(shù)學(xué)院 信息工程學(xué)院, 福建 福州 350007)
近年來,深度學(xué)習(xí)技術(shù)尤其是卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN),逐步成為了人臉識別的主流工具,各種CNN模型在人臉檢測、關(guān)鍵點定位和人臉識別等方面的應(yīng)用已取得顯著成效。目前,相關(guān)研究者正致力于通過新的技術(shù)手段,如增強學(xué)習(xí)、遷移學(xué)習(xí)等提高人臉識別系統(tǒng)在復(fù)雜場景中的應(yīng)用表現(xiàn)[1]。多任務(wù)卷積神經(jīng)網(wǎng)絡(luò)(Multi-task Convolutional Neural Network, MTCNN)突破了CNN只能處理單一任務(wù)的局限性。它能針對人臉檢測、關(guān)鍵點定位和人臉識別3種任務(wù),通過共享底層卷積層的特征表示,實現(xiàn)對多個任務(wù)的同時學(xué)習(xí)[2]。這不僅能提高模型的泛化能力,還能夠在處理光照變化、遮擋、姿態(tài)變化等問題時取得優(yōu)異的效果。MTCNN的引入使得人臉識別系統(tǒng)能夠更全面地理解和處理人臉圖像數(shù)據(jù),為提高準確性、魯棒性和穩(wěn)定性奠定理論基礎(chǔ)[3]。通過訓(xùn)練處理人臉多方面任務(wù)的模型,能夠讓系統(tǒng)適應(yīng)多變環(huán)境,更全面、準確地識別人臉。這在安全監(jiān)控、人機交互等領(lǐng)域有著重要的意義。多任務(wù)學(xué)習(xí)可以更好地應(yīng)對真實場景中的各種挑戰(zhàn),為人臉識別技術(shù)在工業(yè)、商業(yè)和人們生活中的廣泛應(yīng)用提供更加可靠的解決方案,也有望推動人臉識別技術(shù)在實際應(yīng)用中的普及和進一步發(fā)展[4]。本文將從MTCNN的設(shè)計和優(yōu)化著手,研究不同任務(wù)之間的關(guān)聯(lián)性以及有效共享底層特征表示的方法,提高模型在人臉檢測、關(guān)鍵點定位和人臉識別中的性能;分析MTCNN在復(fù)雜場景中的性能表現(xiàn),包括在光照變化、遮擋、姿態(tài)變化時的魯棒性;測試模型在真實場景中應(yīng)用的性能。
傳統(tǒng)的人臉識別方法包括基于特征的方法和基于模型的方法。其中:基于特征的方法需先將人臉圖像表示為特征向量,再利用分類器對其進行分類;基于模型的方法需將人臉識別看作一個模型訓(xùn)練問題,是通過訓(xùn)練模型來實現(xiàn)人臉識別的。傳統(tǒng)的人臉識別方法主要基于的是圖像處理和模式識別技術(shù),包括主成分分析法、線性判別分析法和模板匹配法等[5]。這些方法曾取得了一定的應(yīng)用成果,但在處理復(fù)雜場景和變化多樣的人臉圖像時存在一些明顯的缺點。例如,它們對光照變化、表情變化、姿勢變化和遮擋等因素的魯棒性較差,且對提取特征的表示能力有限,很難準確區(qū)分不同的人臉。
多任務(wù)學(xué)習(xí)能夠通過模型訓(xùn)練,對人臉屬性如性別、年齡、表情等進行識別,在面對不同光照條件、佩戴眼鏡或口罩等復(fù)雜場景時依然能準確判斷人臉屬性,從而提高系統(tǒng)的適應(yīng)能力。多任務(wù)學(xué)習(xí)能針對人臉檢測和關(guān)鍵點定位任務(wù),通過同一模型的學(xué)習(xí)提高人臉檢測的準確性,并改善關(guān)鍵點定位的精度,使得人臉識別模型具有更強的魯性棒,以便在各種情況下精確地定位人臉的位置和關(guān)鍵特征點。多任務(wù)學(xué)習(xí)更加敏感于人的情感狀態(tài),在人臉表情識別方面更具優(yōu)勢。它通過學(xué)習(xí)多個表情分類任務(wù),能夠更好地理解和識別人臉表情。多任務(wù)學(xué)習(xí)可用于增強人臉活體檢測的能力,防止使用照片或視頻等虛假信息的欺騙行為。多任務(wù)學(xué)習(xí)通過同時學(xué)習(xí)真實人臉和虛假攻擊的任務(wù),能夠顯著提高人臉識別系統(tǒng)的安全性和可靠性。這些應(yīng)用不僅能使人臉識別系統(tǒng)更為全面,也能提高其實際應(yīng)用的效果和可靠性。一些經(jīng)典的神經(jīng)網(wǎng)絡(luò)模型如AlexNet、VGGNet、GoogLeNet和ResNet等[6],已經(jīng)在人臉識別任務(wù)中取得了令人矚目的成果。
在多任務(wù)學(xué)習(xí)中,同一個模型可以同時學(xué)習(xí)多種任務(wù),從而提高模型的泛化能力和學(xué)習(xí)效率。以人臉識別為例,多任務(wù)學(xué)習(xí)可以同時進行面部特征檢測、性別識別、年齡估計等任務(wù)的學(xué)習(xí),從而提高模型對人臉圖像數(shù)據(jù)的理解和識別能力。MTCNN模型通過學(xué)習(xí)大規(guī)模數(shù)據(jù)集中的人臉圖像,可以自動提取更具表征能力的特征,且具備較強的泛化能力。
MTCNN是一種通過堆疊多個卷積層和池化層來提取圖像特征的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。相比于傳統(tǒng)的淺層網(wǎng)絡(luò)結(jié)構(gòu),它具有更強的非線性建模能力和復(fù)雜特征提取能力。MTCNN能通過不同尺寸和深度的卷積核來捕捉不同層次的圖像信息,并通過池化操作降低特征維度,減小空間尺寸,從而減少網(wǎng)絡(luò)的參數(shù)量和計算復(fù)雜度。這種網(wǎng)絡(luò)結(jié)構(gòu)在人臉識別任務(wù)中具有廣泛的應(yīng)用,并在一些公開數(shù)據(jù)集上表現(xiàn)出了優(yōu)異的識別性能。根據(jù)文獻[7],MTCNN模型的卷積層結(jié)構(gòu)如圖1 所示。
圖1 MTCNN模型的卷積層結(jié)構(gòu)
卷積層是MTCNN模型的核心組件之一。通過卷積層輸入圖像數(shù)據(jù),與可學(xué)習(xí)的卷積核進行卷積運算,可提取圖像中的局部特征(即卷積特征)。MTCNN模型的池化層在網(wǎng)絡(luò)中起降低特征維度和減小空間尺寸的作用。通過池化操作能夠提取圖像中的主要特征并減少特征的冗余性,同時讓指定特征具有一定的平移和尺度不變性。
MTCNN模型是通過堆疊多個卷積層和池化層來構(gòu)建深層網(wǎng)絡(luò)結(jié)構(gòu)的。這些網(wǎng)絡(luò)結(jié)構(gòu)能夠增強網(wǎng)絡(luò)模型的深度和非線性表達能力,從而進一步優(yōu)化網(wǎng)絡(luò)的特征提取和分類性能。網(wǎng)絡(luò)性能優(yōu)化的關(guān)鍵在于有效地進行網(wǎng)絡(luò)參數(shù)訓(xùn)練和優(yōu)化方法的選擇。隨機梯度下降(Stochastic Gradient Descent,SGD)法是通過計算損失函數(shù)每個參數(shù)的梯度[8],并根據(jù)學(xué)習(xí)率進行參數(shù)更新實現(xiàn)性能優(yōu)化的。但其存在過程震蕩和收斂緩慢的問題。動量優(yōu)化方法則能克服SGD的缺陷。自適應(yīng)學(xué)習(xí)率方法如Adam、RMSprop,可根據(jù)參數(shù)梯度實時調(diào)整學(xué)習(xí)率。批歸一化方法能夠?qū)γ總€小批量數(shù)據(jù)進行歸一化處理,以提升訓(xùn)練速度,增強網(wǎng)絡(luò)的穩(wěn)定性。數(shù)據(jù)增強方法能夠?qū)τ?xùn)練數(shù)據(jù)進行隨機變換,以擴充訓(xùn)練集,增強模型的泛化能力。對這些方法的綜合運用和適當調(diào)整,可取得較好的網(wǎng)絡(luò)性能優(yōu)化效果。
用于人臉識別時,MTCNN需要3個不同的任務(wù)網(wǎng)絡(luò),以分別用于人臉檢測、關(guān)鍵點定位和人臉識別。每個任務(wù)網(wǎng)絡(luò)都有自己的損失函數(shù),用于評估其在相應(yīng)任務(wù)上的表現(xiàn)。這些損失函數(shù)組合在一起,可構(gòu)成總的損失函數(shù)。模型的訓(xùn)練可采用反向傳播算法,同時應(yīng)使用SGD優(yōu)化器進行優(yōu)化。根據(jù)文獻[9],可用人臉檢測器P-Net來檢測圖像中的人臉位置。該檢測器的輸出是一個邊界盒(它表示檢測到的人臉在圖像中的位置和大小)。此外,人臉識別時需要一個基于CNN的關(guān)鍵點定位器K-Net,以定位人臉的5個關(guān)鍵點,包括兩個眼睛、一個鼻子和兩個嘴巴角;還需用一個基于CNN的人臉識別器R-Net,從人臉圖像中提取特征,并將其映射到一個低維空間。該低維空間的向量可以用于識別人臉。為了使3個任務(wù)網(wǎng)絡(luò)共享底層卷積層的特征表示,應(yīng)在P-Net和K-Net的卷積層之間添加一個共享的卷積層,在K-Net和R-Net的卷積層之間也添加一個共享的卷積層[10]。這種共享卷積層可使得不同的任務(wù)網(wǎng)絡(luò)共享相同的底層特征表示,從而提高模型的泛化能力和識別準確率。
MTCNN模型的訓(xùn)練采用的是多任務(wù)學(xué)習(xí)方法,需要同時優(yōu)化3個任務(wù)網(wǎng)絡(luò)的損失函數(shù)。具體來說,它需要定義3個不同的損失函數(shù),分別用于評估人臉檢測、關(guān)鍵點定位和人臉識別的表現(xiàn)。將這3個損失函數(shù)組合在一起,就構(gòu)成了總的損失函數(shù)[11]。
總的損失函數(shù)可表示為:
Ltotal=wdet×Ldet+wkp×Lkp+wid×Lid
(1)
其中:Ldet、Lkp和Lid分別表示人臉檢測、關(guān)鍵點定位和人臉識別任務(wù)的損失函數(shù);wdet、wkp和wid分別表示它們的權(quán)重。
模型優(yōu)化過程,對于人臉檢測任務(wù),采用的是交叉熵損失函數(shù);對于關(guān)鍵點定位任務(wù),采用的是均方誤差損失函數(shù);對于人臉識別任務(wù),采用的是三元組損失函數(shù)。具體來說,首先針對每個訓(xùn)練樣本,隨機選擇兩個同類樣本和一個異類樣本,并計算它們在特征空間的距離;然后,使用三元組損失函數(shù)來約束同類樣本之間的距離,盡可能使其變小,而讓異類樣本之間的距離盡可能地大[12]。
三元組損失函數(shù)可表示為:
Ltriplet=max(0,m+||f(xa)-f(xp)||-
||f(xa)-f(xn)||)
(2)
其中:xa、xp和xn分別表示一個訓(xùn)練三元組中的錨點樣本、正樣本和負樣本;f(·)表示針對具體樣本的人臉識別器的特征映射函數(shù);m表示一個margin,用于控制同類樣本之間距離和異類樣本之間距離的差值。
在人臉識別實驗中,選擇合適的數(shù)據(jù)集對于評估和比較算法性能至關(guān)重要。數(shù)據(jù)集需要劃分為訓(xùn)練集、驗證集和測試集。一般用70%的數(shù)據(jù)作為訓(xùn)練集,10%的數(shù)據(jù)作為驗證集,剩余的20%作為測試集[13]。常用的人臉識別數(shù)據(jù)集有LFW(Labeled Faces in the Wild的縮寫)、Casia-WebFace、CelebA等。MTCNN 由于采用級聯(lián)方式進行檢測,每層網(wǎng)絡(luò)都在前一層的基礎(chǔ)上對人臉進行更加準確的檢測和定位,因此檢測精度比單一網(wǎng)絡(luò)要高。MTCNN 在檢測人臉的姿態(tài)和關(guān)鍵點方面具有更好的效果。人臉分類損失是用于評估人臉檢測模型中分類任務(wù)性能的損失函數(shù)。在MTCNN中,人臉分類損失函數(shù)通常采用的是交叉熵損失函數(shù)。MTCNN中的P-Net網(wǎng)絡(luò)能夠?qū)⑤斎雸D像劃分為多個不同大小的候選框,而這些候選框需要被分成人臉和非人臉兩類。人臉分類損失函數(shù)計算的是網(wǎng)絡(luò)輸出的分類概率與真實標簽之間的差異。在MTCNN訓(xùn)練過程中,人臉分類損失函數(shù)通常要與人臉邊框回歸損失函數(shù)、人臉關(guān)鍵點回歸損失函數(shù)一起使用,計算總損失,以優(yōu)化模型參數(shù)。
數(shù)據(jù)預(yù)處理是確保數(shù)據(jù)集一致性和可比性的重要步驟。通常用人臉檢測和對齊算法來確保圖像中的人臉區(qū)域能夠?qū)R且具有一致的尺寸。此外,數(shù)據(jù)預(yù)處理需要通過直方圖均衡化、對比度增強以及圖像旋轉(zhuǎn),對圖像進行標準化處理和增強。
使用MTCNN進行人臉檢測和對齊的程序代碼如下:
import cv2
from mtcnn import MTCNN
def detect_and_align_faces(image):
detector = MTCNN()
faces = detector.detect_faces(image)
aligned_faces = []
for face in faces:
x, y, w, h = face[‘box’]
keypoints = face[‘keypoints’]
# 對齊人臉
aligned_face = align_face(image, keypoints)
aligned_faces.append(aligned_face)
return aligned_faces
def align_face(image, keypoints):
left_eye = keypoints[‘left_eye’]
right_eye = keypoints[‘right_eye’]
nose = keypoints[‘nose’]
# 根據(jù)關(guān)鍵點進行人臉對齊
return aligned_face
# 加載圖像
image=cv2.imread(‘face_image.jpg’)
# 進行人臉檢測和對齊
aligned_faces = detect_and_align_faces(image)
# 對齊后的人臉圖像可用于后續(xù)的特征提取和人臉識別實驗。
在目標訓(xùn)練任務(wù)中,訓(xùn)練模型通常輸出的是候選框的坐標和分類結(jié)果。然而,這些候選框通常不是精準的邊框,因此需要利用框回歸技術(shù)進行修正。框回歸修正的目的是針對每個候選框,確定一個更為準確的邊框。
構(gòu)建MTCNN模型,并利用訓(xùn)練集對MTCNN模型進行訓(xùn)練時,需要使用配置良好的計算機和服務(wù)器,并配備高性能的GPU加速器,以加速模型的訓(xùn)練和推理過程;同時,需安裝必要的軟件工具和框架,如TensorFlow、PyTorch等。通過評估訓(xùn)練集和驗證集的性能表現(xiàn),選擇合適的參數(shù)和網(wǎng)絡(luò)結(jié)構(gòu),才能完成網(wǎng)絡(luò)模型的訓(xùn)練。
使用TensorFlow軟件進行MTCNN模型訓(xùn)練的程序代碼如下:
import tensorflow as tf
from tensorflow
.keras import layers
# 構(gòu)建多卷積神經(jīng)網(wǎng)絡(luò)模型
model = tf.keras.Sequential() //創(chuàng)建一個tf.keras.Sequential模型
model.add(layers.Conv2D(32, (3, 3), activation=‘relu’, input_shape=(64, 64, 3)))
model.add(layers.MaxPooling2D((2, 2))) //添加第一個卷積層和最大池化層
model.add(layers.Conv2D(64, (3, 3), activation=‘relu’))
model.add(layers.MaxPooling2D((2, 2))) //添加第二個卷積層和最大池化層
model.add(layers.Conv2D(128, (3, 3), activation=‘relu’))
model.add(layers.MaxPooling2D((2, 2))) //添加第三個卷積層和最大池化層
model.add(layers.Flatten())
model.add(layers.Dense(256, activation=‘relu’))
model.add(layers.Dense(num_classes, activation=‘softmax’)) //添加輸出層。
用上述代碼對一個具有3個卷積層和1個最大池化層的MTCNN模型進行訓(xùn)練時,輸入模型的是64像素×64像素的RGB圖像,且是分為3個通道輸入的。模型的每個卷積層后都有一個relu激活函數(shù),用于引入非線性模型,并在每個卷積層操作后用最大池化層來減小特征圖的尺寸。經(jīng)過卷積和池化的特征圖被展平成一維向量,可連接到全連接層和輸出層。模型訓(xùn)練過程使模型能夠從輸入圖像中提取關(guān)鍵特征,并在輸出層進行相應(yīng)的預(yù)測。
定義訓(xùn)練參數(shù)和優(yōu)化器的程序代碼如下:
model.compile(optimizer=‘a(chǎn)dam’,loss=‘sparse_categorical_crossentropy’,metrics=[‘a(chǎn)ccuracy’])
# 數(shù)據(jù)增強
train_images= ImageDataGenerator(
rescale=1/255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode=‘nearest’
)
validation_images = ImageDataGenerator(rescale=1/255)
# 加載和預(yù)處理數(shù)據(jù)集
train_images,train_labels,fs_images,fs_labels = load_and_preprocess_dataset()
# 進行模型訓(xùn)練
model.fit(train_images,train_labels,epochs=10,batch_size=32,validation_data=(fs_images, fs_labels))
# 在數(shù)據(jù)測試集上評估模型性能
fs_loss, fs_acc = model.evaluate(fs_images, fs_labels)
print(‘Fs accuracy:’, fs_acc)。
通過模型訓(xùn)練,可獲得圖2所示的數(shù)據(jù)集。
圖2 模型訓(xùn)練所得數(shù)據(jù)集
在模型訓(xùn)練中,使用了ImageDataGenerator函數(shù),通過對應(yīng)訓(xùn)練數(shù)據(jù)的圖像旋轉(zhuǎn)、平移、剪切、縮放、水平翻轉(zhuǎn)等進行數(shù)據(jù)擴增,生成更加多樣和豐富的訓(xùn)練樣本,從而增強了模型的泛化能力和魯棒性。這種方法使得MTCNN模型能夠更靈活地適應(yīng)各種變化的復(fù)雜場景。它提高了模型在實際應(yīng)用中的適應(yīng)性。
測試集不僅能用于評估模型性能,還可通過比較測試集的預(yù)測結(jié)果與實際標簽,計算各種評估指標如準確率、召回率、精確度和F值(F-Measure)等,了解MTCNN在不同數(shù)據(jù)集和實驗設(shè)置下相對于傳統(tǒng)方法(如支持向量機)的優(yōu)點。
用MTCNN進行人臉識別的程序代碼如下:
import numpy as np
from sklearn import svm
import tensorflow as tf
from tensorflow import keras
# 加載和預(yù)處理數(shù)據(jù)集
train_images,train_labels,fs_images,est_labels= load_and_preprocess_dataset()
# 構(gòu)建多卷積神經(jīng)網(wǎng)絡(luò)模型
model = tf.keras.Sequential()
# 添加網(wǎng)絡(luò)層
# 訓(xùn)練多卷積神經(jīng)網(wǎng)絡(luò)模型
model.fit(train_images,train_labels,epochs=10,batch_size=32, validation_data=(fs_images, fs_labels))
# 在測試集上評估多卷積神經(jīng)網(wǎng)絡(luò)模型
fs_loss, fs_acc = model.evaluate(fs_images, fs_labels)
print(‘多卷積神經(jīng)網(wǎng)絡(luò)的測試準確率:’, fs_acc)
# 使用傳統(tǒng)方法(支持向量機)進行人臉識別
# 將圖像數(shù)據(jù)轉(zhuǎn)換為特征向量
train_features = extract_features(train_images)
fs_features = extract_features(fs_images)
# 使用支持向量機進行訓(xùn)練和預(yù)測
svm_classifier=svm.svc()
svm_classifier.fit(train_features, train_labels)
svm_accuracy = svm_classifier.score(fs_features, fs_labels)
print(‘支持向量機的測試準確率:’,svm_accuracy)。
圖3所示為MTCNN的人臉識別測試結(jié)果。
圖3 MTCNN的人臉識別測試結(jié)果
本文通過人臉圖像的數(shù)據(jù)集對MTCNN模型進行訓(xùn)練和預(yù)測,并對它在人臉識別任務(wù)中的性能表現(xiàn)進行了評估。MTCNN模型訓(xùn)練的總損失是通過3個損失函數(shù)的加權(quán)計算得出的??倱p失越小則代表模型性能越優(yōu)。在其訓(xùn)練過程中,通過總損失的最小化可實現(xiàn)模型的優(yōu)化,使之能夠在人臉識別任務(wù)中更好地進行特征學(xué)習(xí)和預(yù)測。
盡管MTCNN在人臉識別中展示出了巨大的潛力,并在實驗中獲得了令人滿意的結(jié)果,但仍然存在一些挑戰(zhàn)和改進的空間,包括模型的進一步優(yōu)化、使用更大規(guī)模的人臉數(shù)據(jù),以及在隱私保護和安全領(lǐng)域的拓展性研究。隨著深度學(xué)習(xí)和人臉識別技術(shù)的不斷發(fā)展,相信MTCNN在未來的人臉識別應(yīng)用中將發(fā)揮更為重要的作用。