還記得我們之前寫過一篇文章《手把手教你人臉識別自動開機》嗎?裡面用OpenCV對人臉進行簡單的識別,讓計算機訓練認識到某個特定人物後識別物件。今天來做點高階的,識別出人臉的情緒。
本文分為兩大部分:
1.面部檢測:檢測影像的臉部位置,輸出邊界框的座標
2.情緒檢測:將面部的情緒分為高興、生氣、悲傷、中性、驚訝、厭惡、恐懼。
一、面部檢測
可以使用上次文章( 《手把手教你人臉識別自動開機》 )中講到的方法—用openCV檢測,也可以使用face_recognition專案非常簡單地實現面部檢測。
這裡我們嘗試一下face_recognition專案, face_recognition 安裝:
Face_recognition需要用到一個包叫dlib, 通過pip可能不一定裝得上,因此這裡推薦大家使用anaconda安裝dlib:
conda install -c conda-forge dlib
然後再安裝Face_recognition:
pip install face_recognition
用face_recognition三句程式碼就能識別影像中的臉部:
import face_recognition
image = face_recognition.load_image_file("1.png")
face_locations = face_recognition.face_locations(image)
二、情緒檢測
人類習慣從面部表情中吸收非言語暗示,那麼計算機可以嗎?答案是肯定的,但是需要訓練它學會識別情緒。今天我們不太可能講收集資料、構建CNN模型等邏輯流程。我們直接用priya-dwivedi訓練好的模型,他們用Kaggle開源資料集(人臉情感識別 FER)訓練了一個六層卷積神經網路模型。
現在就呼叫模型識別一下孫哥在這張圖裡的情緒吧:
import face_recognition
import numpy as np
import cv2
from keras.models import load_model
emotion_dict= {'生氣': 0, '悲傷': 5, '中性': 4, '厭惡': 1, '驚訝': 6, '恐懼': 2, '高興': 3}
image = face_recognition.load_image_file("1.png")
# 載入影像
face_locations = face_recognition.face_locations(image)
# 尋找臉部
top, right, bottom, left = face_locations[0]
# 將臉部框起來
face_image = image[top:bottom, left:right]
face_image = cv2.resize(face_image, (48,48))
face_image = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY)
face_image = np.reshape(face_image, [1, face_image.shape[0], face_image.shape[1], 1])
# 調整到可以進入該模型輸入的大小
model = load_model("./model_v6_23.hdf5")
# 載入模型
predicted_class = np.argmax(model.predict(face_image))
# 分類情緒
label_map = dict((v,k) for k,v in emotion_dict.items())
predicted_label = label_map[predicted_class]
# 根據情緒對映表輸出情緒
print(predicted_label)
結果:
$python emotion.py
高興
從下面終端輸出的結果我們可以看到孫哥現在是高興的情緒,這個結果應該正確(畢竟孫哥還是表裡如一的)。
雖然簡單,但還是建議有興趣的同學從頭到尾做一遍試一下,過程中會遇到不少的坑,慢慢百度谷歌解決就好了。
文章到此就結束啦,如果你喜歡今天的Python 教程,請持續關注Python實用寶典,如果對你有幫助,麻煩在下面點一個贊/在看哦有任何問題都可以在下方留言區留言,我們會耐心解答的!
Python實用寶典 (pythondict.com)
不只是一個寶典
歡迎關注公眾號:Python實用寶典
原文來自Python實用寶典:Python 面部情緒識別
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Python實用寶典, pythondict.com