表情識(shí)別
面部情緒識(shí)別(FER)是指根據(jù)面部表情識(shí)別和分類人類情緒的過(guò)程。通過(guò)分析面部特征和模式,機(jī)器可以對(duì)一個(gè)人的情緒狀態(tài)作出有根據(jù)的推斷。這個(gè)面部識(shí)別的子領(lǐng)域高度跨學(xué)科,涉及計(jì)算機(jī)視覺(jué)、機(jī)器學(xué)習(xí)和心理學(xué)等領(lǐng)域的知識(shí)。
應(yīng)用領(lǐng)域
以下是一些關(guān)鍵領(lǐng)域,其中這項(xiàng)技術(shù)可能有所幫助:
社交和內(nèi)容創(chuàng)作平臺(tái):
根據(jù)情感反饋個(gè)性化用戶體驗(yàn)。
自適應(yīng)學(xué)習(xí)系統(tǒng)根據(jù)學(xué)習(xí)者的情緒狀態(tài)調(diào)整內(nèi)容,提供更具針對(duì)性的建議。
醫(yī)療研究:
監(jiān)測(cè)患者是否存在抑郁、焦慮或其他情緒障礙的跡象。
協(xié)助治療師在治療過(guò)程中跟蹤患者的進(jìn)展或反應(yīng)。
實(shí)時(shí)監(jiān)測(cè)應(yīng)激水平。
駕駛員安全機(jī)制:
監(jiān)測(cè)駕駛員是否出現(xiàn)疲勞、注意力分散、壓力或昏昏欲睡的跡象。
營(yíng)銷和市場(chǎng)研究:
實(shí)時(shí)分析觀眾對(duì)廣告的反應(yīng)。
根據(jù)觀眾的情緒狀態(tài)定制廣告內(nèi)容。
產(chǎn)品測(cè)試和反饋。
安全和監(jiān)控:
在擁擠區(qū)域檢測(cè)可疑或異常行為。
分析公共事件中人群的反應(yīng),以確保安全。
構(gòu)建面部情緒識(shí)別系統(tǒng)
本節(jié)深入探討構(gòu)建面部情緒識(shí)別系統(tǒng)的復(fù)雜性。我們首先探討一個(gè)專門為面部情緒識(shí)別設(shè)計(jì)的數(shù)據(jù)集,確保我們的模型有穩(wěn)健的基礎(chǔ)。接下來(lái),我們將介紹一種自定義的VGG13模型架構(gòu),該架構(gòu)以其在分類任務(wù)中的效率和準(zhǔn)確性而聞名,并闡明其與我們情緒識(shí)別目標(biāo)的相關(guān)性。
最后,我們花費(fèi)一些時(shí)間在實(shí)驗(yàn)結(jié)果部分,提供全面的評(píng)估,闡明系統(tǒng)的性能指標(biāo)及其潛在應(yīng)用。
面部情緒識(shí)別數(shù)據(jù)集(FER +)
FER + 數(shù)據(jù)集是原始面部表情識(shí)別(FER)數(shù)據(jù)集的一個(gè)重要擴(kuò)展。為了改進(jìn)原始數(shù)據(jù)集的局限性,F(xiàn)ER + 提供了更精細(xì)和細(xì)致的面部表情標(biāo)簽。雖然原始FER數(shù)據(jù)集將面部表情分類為六種基本情緒——快樂(lè)、悲傷、憤怒、驚訝、恐懼和厭惡——但FER + 根據(jù)這一基礎(chǔ)更進(jìn)一步引入了兩個(gè)額外的類別:中性和蔑視。
用于人臉檢測(cè)的RFB-320
Single Shot Multibox Detector (SSD)模型 在識(shí)別情緒之前,需要在輸入幀中檢測(cè)人臉。為此,使用了超輕量級(jí)人臉檢測(cè)模型RFB-320。它是一種針對(duì)邊緣計(jì)算設(shè)備進(jìn)行優(yōu)化的創(chuàng)新人臉檢測(cè)模型。該模型采用了改進(jìn)的感受野塊(RFB)模塊,在不增加計(jì)算負(fù)擔(dān)的情況下有效地捕捉多尺度的上下文信息。它在多樣化的WIDER FACE數(shù)據(jù)集上進(jìn)行訓(xùn)練,并針對(duì)320×240的輸入分辨率進(jìn)行優(yōu)化,具有出色的效率平衡,計(jì)算速度為0.2106 GFLOPs,參數(shù)量?jī)H為0.3004百萬(wàn)個(gè)。該模型基于PyTorch框架開發(fā),取得了令人稱贊的平均精度(mAP)為84.78%,在資源受限環(huán)境中成為高效人臉檢測(cè)的強(qiáng)大解決方案。在此實(shí)現(xiàn)中,RFB-320 SSD模型以Caffe格式使用。
自定義的VGG13模型架構(gòu)
情緒識(shí)別分類模型采用了定制的VGG13架構(gòu),專為64×64灰度圖像設(shè)計(jì)。它使用具有最大池化和dropout的卷積層將圖像分類為八個(gè)情緒類別,以防止過(guò)擬合。該架構(gòu)開始于兩個(gè)具有64個(gè)卷積核的卷積層,然后是最大池化和25%的dropout。額外的卷積層捕捉復(fù)雜的特征,兩個(gè)具有1024個(gè)節(jié)點(diǎn)的密集層聚合信息,然后是50%的dropout。一個(gè)softmax輸出層預(yù)測(cè)情緒類別。
讓我們編寫一些代碼來(lái)實(shí)現(xiàn)這個(gè)系統(tǒng)。
首先,需要初始化一些重要的參數(shù)。
image_mean = np.array([127, 127, 127])
image_std = 128.0
iou_threshold = 0.3
center_variance = 0.1
size_variance = 0.2
min_boxes = [
[10.0, 16.0, 24.0],
[32.0, 48.0],
[64.0, 96.0],
[128.0, 192.0, 256.0]
]
strides = [8.0, 16.0, 32.0, 64.0]
threshold = 0.5
image_mean: 在RGB通道上進(jìn)行圖像歸一化的均值。
image_std: 圖像歸一化的標(biāo)準(zhǔn)差。
iou_threshold: 確定邊界框匹配的交并比(IoU)度量的閾值。
center_variance: 預(yù)測(cè)的邊界框中心坐標(biāo)的縮放因子。
size_variance: 預(yù)測(cè)的邊界框尺寸的縮放因子。
min_boxes: 不同尺寸對(duì)象的最小邊界框尺寸。
strides: 根據(jù)圖像大小控制特征圖的尺度。
threshold: 目標(biāo)檢測(cè)的置信度閾值。
def define_img_size(image_size):
shrinkage_list = []
feature_map_w_h_list = []
for size in image_size:
feature_map = [int(ceil(size / stride)) for stride in strides]
feature_map_w_h_list.append(feature_map)
for i in range(0, len(image_size)):
shrinkage_list.append(strides)
priors = generate_priors(
feature_map_w_h_list, shrinkage_list, image_size, min_boxes
)
return priors
上述的 define_img_size
函數(shù)旨在為目標(biāo)檢測(cè)任務(wù)生成先驗(yàn)邊界框(priors)。該函數(shù)以 image_size
參數(shù)作為輸入,根據(jù)提供的圖像尺寸和一組預(yù)定義的步長(zhǎng)值計(jì)算特征圖的尺寸。這些特征圖的尺寸反映了卷積神經(jīng)網(wǎng)絡(luò)(CNN)層對(duì)不同輸入圖像尺度的期望輸出尺寸。實(shí)質(zhì)上,SSD中的先驗(yàn)邊界框提供了一種高效的方法,可以在網(wǎng)絡(luò)的單次前向傳遞中同時(shí)預(yù)測(cè)多個(gè)邊界框及其關(guān)聯(lián)的類別得分,從而實(shí)現(xiàn)實(shí)時(shí)目標(biāo)檢測(cè)。
def FER_live_cam():
emotion_dict = {
0: 'neutral',
1: 'happiness',
2: 'surprise',
3: 'sadness',
4: 'anger',
5: 'disgust',
6: 'fear'
}
# cap = cv2.VideoCapture('video1.mp4')
cap = cv2.VideoCapture(0)
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
size = (frame_width, frame_height)
result = cv2.VideoWriter('result.avi',
cv2.VideoWriter_fourcc(*'MJPG'),
10, size)
# Read ONNX model
model = 'onnx_model.onnx'
model = cv2.dnn.readNetFromONNX('emotion-ferplus-8.onnx')
# Read the Caffe face detector.
model_path = 'RFB-320/RFB-320.caffemodel'
proto_path = 'RFB-320/RFB-320.prototxt'
net = dnn.readNetFromCaffe(proto_path, model_path)
input_size = [320, 240]
width = input_size[0]
height = input_size[1]
priors = define_img_size(input_size)
while cap.isOpened():
ret, frame = cap.read()
if ret:
img_ori = frame
#print("frame size: ", frame.shape)
rect = cv2.resize(img_ori, (width, height))
rect = cv2.cvtColor(rect, cv2.COLOR_BGR2RGB)
net.setInput(dnn.blobFromImage(
rect, 1 / image_std, (width, height), 127)
)
start_time = time.time()
boxes, scores = net.forward(["boxes", "scores"])
boxes = np.expand_dims(np.reshape(boxes, (-1, 4)), axis=0)
scores = np.expand_dims(np.reshape(scores, (-1, 2)), axis=0)
boxes = convert_locations_to_boxes(
boxes, priors, center_variance, size_variance
)
boxes = center_form_to_corner_form(boxes)
boxes, labels, probs = predict(
img_ori.shape[1],
img_ori.shape[0],
scores,
boxes,
threshold
)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
for (x1, y1, x2, y2) in boxes:
w = x2 - x1
h = y2 - y1
cv2.rectangle(frame, (x1,y1), (x2, y2), (255,0,0), 2)
resize_frame = cv2.resize(
gray[y1:y1 + h, x1:x1 + w], (64, 64)
)
resize_frame = resize_frame.reshape(1, 1, 64, 64)
model.setInput(resize_frame)
output = model.forward()
end_time = time.time()
fps = 1 / (end_time - start_time)
print(f"FPS: {fps:.1f}")
pred = emotion_dict[list(output[0]).index(max(output[0]))]
cv2.rectangle(
img_ori,
(x1, y1),
(x2, y2),
(0, 255, 0),
2,
lineType=cv2.LINE_AA
)
cv2.putText(
frame,
pred,
(x1, y1),
cv2.FONT_HERSHEY_SIMPLEX,
0.8,
(0, 255, 0),
2,
lineType=cv2.LINE_AA
)
result.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
result.release()
cv2.destroyAllWindows()
FER_live_cam()
函數(shù)對(duì)視頻幀進(jìn)行實(shí)時(shí)的面部情緒識(shí)別。首先,它設(shè)置了一個(gè)字典 emotion_dict
,將數(shù)字情緒類別索引映射到可讀的情緒標(biāo)簽。視頻源被初始化,盡管也可以使用網(wǎng)絡(luò)攝像頭輸入。該函數(shù)還初始化了一個(gè)輸出視頻寫入器,用于保存帶有情緒注釋的處理過(guò)的幀。主要的情緒預(yù)測(cè)模型以O(shè)NNX格式保存,在使用OpenCV DNN的 readNetFromONNX
方法讀取并與以Caffe格式保存的RFB-30 SSD人臉檢測(cè)模型一起加載。在逐幀處理視頻時(shí),人臉檢測(cè)模型通過(guò)邊界框識(shí)別出人臉。
檢測(cè)到的人臉在輸入情緒識(shí)別模型之前經(jīng)過(guò)預(yù)處理,包括調(diào)整大小和轉(zhuǎn)換為灰度圖像。通過(guò)從模型的輸出分?jǐn)?shù)中選擇最大值確定識(shí)別出的情緒,并使用 emotion_dict
將其映射到標(biāo)簽。然后,在檢測(cè)到的人臉周圍添加矩形框和情緒標(biāo)簽,將幀保存到輸出視頻文件中,并實(shí)時(shí)顯示。用戶可以通過(guò)按下 ‘q’ 鍵停止視頻顯示。一旦視頻處理完成或中斷,資源如視頻捕獲和寫入器將被釋放,并關(guān)閉任何打開的窗口。值得注意的是,該函數(shù)引用了一些在其作用域內(nèi)未定義的變量和輔助函數(shù),這表明它們是整個(gè)代碼庫(kù)的一部分。
推理結(jié)果
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-706031.html
框和情緒標(biāo)簽,將幀保存到輸出視頻文件中,并實(shí)時(shí)顯示。用戶可以通過(guò)按下 ‘q’ 鍵停止視頻顯示。一旦視頻處理完成或中斷,資源如視頻捕獲和寫入器將被釋放,并關(guān)閉任何打開的窗口。值得注意的是,該函數(shù)引用了一些在其作用域內(nèi)未定義的變量和輔助函數(shù),這表明它們是整個(gè)代碼庫(kù)的一部分。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-706031.html
寫在最后
論文輔導(dǎo),代碼獲取,作業(yè)輔助等聯(lián)系我扣扣1309399183
到了這里,關(guān)于表情識(shí)別-情感分析-人臉識(shí)別(代碼+教程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!