本文透過具體程式碼不步驟給大家詳細講述了python3 dlib實現人臉辨識以及情緒分析的方法,有需要的朋友參考下。
一、介紹
我想做的是基於人臉辨識的表情(情緒)分析。看到網路上也是有很多的開源程式庫提供使用,為開發提供了很大的方便。我選擇目前用的比較多的dlib庫進行人臉辨識與特徵標定。使用python也縮短了開發週期。
官網對於dlib的介紹是:Dlib包含廣泛的機器學習演算法。所有的設計都是高度模組化的,快速執行,並且透過一個乾淨而現代的C API,使用起來非常簡單。它用於各種應用,包括機器人技術,嵌入式設備,手機和大型高效能運算環境。
雖然應用程式都比較高大上,但是自己在PC上做個情緒分析的小軟體還挺有趣的。
依照自己的想法與思路設計辨識方式。目前也比較火的keras好像就是根據嘴型的變化作為情緒分析的一個指標。
而我的想法是利用嘴巴的張開比例,眼睛的睜開程度,眉毛的傾斜角度作為情緒分析的三個指標。但由於人與人長相的差異較大,五官的也是千差萬別,再加上我的計算方法也比較簡單。所以識別效率並不是很高。
辨識規則:
1、嘴巴張開距離佔臉部辨識框寬度的比例越大,表示情緒越激動,可能是非常開心,也可能是極度憤怒。
2、眉毛上揚,17-21 或 22-26 號特徵點距離臉部辨識框頂部與辨識框高度的比值越小,說明眉毛上揚越厲害,可表示驚訝、開心。眉毛的傾斜角度,開心時眉毛一般是上揚,憤怒時皺眉,同時眉毛下壓的比較厲害。
3、瞇眼睛,人在開懷大笑的時候會不自覺的瞇起眼睛,憤怒或驚訝的時候會瞪大眼睛。
系統缺點:不能捕捉細微表情的變化,只能大致的判斷出人的情緒,開心、憤怒、驚訝、自然。
系統優點:結構簡單,易於上手。
應用領域:微笑抓拍,捕捉瞬間的美麗、緩解兒童自閉症、互動遊戲開發。
由於人感情的複雜性,這些表情確實不能完全完全的代表一個人內心深處的情緒波動,如要提高判斷的準確性,則需要心率檢測、語音處理等綜合評價。
二、開發環境建置:
1、安裝VS2015,因為最新版的dlib-19.10需要這個版本的vscode
#2、安裝opencv(whl方式安裝):
從pythonlibs下載需要的版本whl文件,例如(opencv_python?3.3.0 contrib?cp36?cp36m?win_amd64.whl)
然後在本地使用pipip install 安裝。注意檔案位置下安裝(如:C:\download\xxx.whl)
3、安裝dlib(whl方式安裝):
在這裡下載dlib的各種版本的whl文件,然後在根目錄下打開cmd直接安裝即可。
但為了學習使用dlib中的各種python實例程序,還是需要下載一個dlib的壓縮套件。
直接存取dlib官網即可下載:http://dlib.net/ml.html
#dlib各種版本的whl檔案:https://pypi.python. org/simple/dlib/
4、如果想要使用人臉模型特徵標定的話,還需要一個人臉面部形狀預測器,這個可以透過自己的照片進行訓練,也可以使用dlib作者給出來的一個訓練好的預測器:
點選下載:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
三、實作
#四、具體步驟
首先利用dlib進行人臉辨識:)
import cv2 import dlib from skimage import io # 使用特征提取器get_frontal_face_detector detector = dlib.get_frontal_face_detector() # dlib的68点模型,使用作者训练好的特征预测器 predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 图片所在路径 img = io.imread("2.jpg") # 生成dlib的图像窗口 win = dlib.image_window() win.clear_overlay() win.set_image(img) # 特征提取器的实例化 dets = detector(img, 1) print("人脸数:", len(dets)) for k, d in enumerate(dets): print("第", k+1, "个人脸d的坐标:", "left:", d.left(), "right:", d.right(), "top:", d.top(), "bottom:", d.bottom()) width = d.right() - d.left() heigth = d.bottom() - d.top() print('人脸面积为:',(width*heigth))
然後實例化一個 shape_predictor 對象,使用dlib作者訓練好人臉特徵偵測器,進行人臉的特徵點標定。
標定的時候使用opencv的circle方法,在特徵點的座標上面加上浮水印,內容就是特徵點的序號和位置。
# 利用预测器预测 shape = predictor(img, d) # 标出68个点的位置 for i in range(68): cv2.circle(img, (shape.part(i).x, shape.part(i).y), 4, (0, 255, 0), -1, 8) cv2.putText(img, str(i), (shape.part(i).x, shape.part(i).y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255)) # 显示一下处理的图片,然后销毁窗口 cv2.imshow('face', img) cv2.waitKey(0)
到此,68個特徵點的信息就獲取到了,下面就需要跟根據這個68個特徵點的坐標信息,進行綜合 計算,作為每個表情的判斷指標。
根據上面說到的我的判斷指標,先計算嘴巴的張開比例,由於人離相機距離的遠近,導致人臉辨識框的大小不一,故選擇比例來作為判斷指標。
在選擇指標的標準數值之前,先對多個開心的人臉照片進行分析。計算開心時的嘴巴張卡比例的平均。
下面是截取對人眉毛的資料處理方法,對左邊眉毛上面的5個特徵點進行線性擬合,擬合出一個一次函數直線,用擬合直線的斜率近似代表眉毛的傾斜程度。
# 眉毛 brow_sum = 0 # 高度之和 frown_sum = 0 # 两边眉毛距离之和 for j in range(17,21): brow_sum+= (shape.part(j).y - d.top()) + (shape.part(j+5).y- d.top()) frown_sum+= shape.part(j+5).x - shape.part(j).x line_brow_x.append(shape.part(j).x) line_brow_y.append(shape.part(j).y) self.excel_brow_hight.append(round((brow_sum/10)/self.face_width,3)) self.excel_brow_width.append(round((frown_sum/5)/self.face_width,3)) brow_hight[0]+= (brow_sum/10)/self.face_width # 眉毛高度占比 brow_width[0]+= (frown_sum/5)/self.face_width # 眉毛距离占比 tempx = np.array(line_brow_x) tempy = np.array(line_brow_y) z1 = np.polyfit(tempx, tempy, 1) # 拟合成一次直线 self.brow_k = -round(z1[0], 3) # 拟合出曲线的斜率和实际眉毛的倾斜方向是相反的
我计算了25个人脸的开心表情的嘴巴张开比例、嘴巴宽度、眼睛张开程度、眉毛倾斜程度,导入excel表格生成折线图:
通过折线图能很明显的看出什么参数可以使用,什么参数的可信度不高,什么参数在那个范围内可以作为一个指标。
同样的方法,计算人愤怒、惊讶、自然时的数据折线图。
通过对多个不同表情数据的分析,得出每个指标的参考值,可以写出简单的表情分类标准:
# 分情况讨论 # 张嘴,可能是开心或者惊讶 if round(mouth_higth >= 0.03): if eye_hight >= 0.056: cv2.putText(im_rd, "amazing", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2, 4) else: cv2.putText(im_rd, "happy", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2, 4) # 没有张嘴,可能是正常和生气 else: if self.brow_k <= -0.3: cv2.putText(im_rd, "angry", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2, 4) else: cv2.putText(im_rd, "nature", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2, 4)
五、实际运行效果:
识别之后:
以上是python3+dlib實現人臉辨識與情緒分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!