基于Python的面部表情识别分析系统
資源下載地址:https://download.csdn.net/download/sheziqiong/85660758
面部表情識別
練習技能:
- 爬蟲
- 數據清洗
- 計算機視覺(圖片基本處理,信息提取)
- 深度學習
圖像識別技術文檔
一、項目概述
-
項目名稱:面部表情識別
-
項目背景:在與客戶交流的過程中,通過客戶的面部表情來判斷用戶對話題是否感興趣,營銷人員或者溝通人員可以從中找到客戶感興趣的方面,或者判斷客戶的購買欲望
-
圖像識別是指利用計算機對圖像進行處理、分析、理解,圖像識別的過程可分為圖像處理和圖像分析兩個過程
圖像處理是指對所需要分析的圖像進行一系列的圖形操作,包括拉伸縮放、旋轉翻轉、顏色變換、像素保留……,圖像分析是指通過圖像的特征來反饋圖像信息并且分類,最簡單的是基于統計的方法、最常用的是深度學習方法 -
技術支持
圖像處理:VoTT、OpenCV、PIL
圖像分析:TensorFlow、Keras、CNN
二、應用領域
總體目標
- 一級目標
- 通過客戶的面部表情變化,來抓住客戶感興趣的點,提高溝通效率
- 二級目標
- 學習圖像識別的技術
- 三級目標
- 學習深度學習實現工具
- 四級目標
- 了解圖像識別技術實現的步驟,技術原理
三、實驗步驟
3.1 資源
- 數據資源:本次實驗為面部表情的二分類識別,情緒為高興和沮喪,各表情圖像 5000 張
- 技術支持:Keras、TensorFlow、VoTT、OpenCV、PIL
Keras
Keras 是一個由 Python 編寫的開源人工神經網絡庫,可以作為 Tensorflow、Microsoft-CNTK 和 Theano 的高階應用程序接口,進行深度學習模型的設計、調試、評估、應用和可視化,Keras 的神經網絡 API 是在封裝后與使用者直接進行交互的 API 組件,在使用時可以調用 Keras 的其它組件。除數據預處理外,使用者可以通過神經網絡 API 實現機器學習任務中的常見操作,包括人工神經網絡的構建、編譯、學習、評估、測試等。
TensorFlow
TensorFlow 由谷歌人工智能團隊谷歌大腦(Google Brain)開發和維護,擁有包括 TensorFlow Hub、TensorFlow Lite、TensorFlow Research Cloud 在內的多個項目以及各類[應用程序接口]( API) [2] 。自 2015 年 11 月 9 日起,TensorFlow 依據阿帕奇授權協議(Apache 2.0 open source license)開放源代碼,TensorFlow 是一個基于數據流編程(dataflow programming)的符號數學系統,被廣泛應用于各類機器學習(machine learning)算法的編程實現,谷歌大腦自 2011 年成立起開展了面向科學研究和谷歌產品開發的大規模深度學習應用研究,其早期工作即是 TensorFlow 的前身 DistBelief。
VoTT
VoTT 是一個用 TypeScript 編寫的 React + Redux Web 應用程序。該項目是通過 Create React App 啟動的,用于圖像和視頻資產的開源注釋和標簽工具,VoTT 可以作為本機應用程序安裝,也可以從源代碼運行。VoTT 也可以作為獨立的 Web 應用程序使用,并且可以在任何現代 Web 瀏覽器中使用。
OpenCV
OpenCV 是一個基于 BSD 許可(開源)發行的跨平臺計算機視覺庫,可以運行在 Linux、Windows、Android 和 Mac OS 操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了 Python、Ruby、MATLAB 等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。
PIL
python 圖像處理庫,這個庫支持多種文件格式,并提供了強大的圖像處理和圖形處理能力。
3.2 方法
3.2.1 試驗階段
- 在項目開始初步試驗階段,通過人工百度搜索人像表情圖像,利用 VoTT 工具進行裁切和標注,各表情 100 張,并按照 7,2,1 的比列把數據分為訓練集、測試集、驗證集。
- 利用 Keras 深度學歷框架搭建簡單的 CNN 進行訓練,結果顯示 CNN 在圖像處理領域效果很不錯,在模型未經過調整前準確率能超過 50%。
3.2.2 中期工作
-
擴大數據集,利用爬蟲批量獲取人像圖片,在爬取百度圖片的過程中,如果直接獲取那最多只能獲取到 30 張圖像,之后程序就自動停止了,采用的解決方法是,通過觀察 url 發現可以添加 page 頁碼這個選擇來達到滾輪向下刷新圖片的作用,因此添加一個頁碼循環來爬取圖像。
所以采用 VoTT 加 Python 的方式來完成圖像標注和裁切,在 VoTT 新建項目,選擇圖像位置進行框選和標注,完成后保存導出 JSON 格式文件,在利用 Python 讀取 JSON 文件,打開對應圖像按照框選的大小進行裁切,然后轉化為數組也就是像素保存,按照 6,2,2 的比例劃分數據集保存 CSV 文件。
-
打開 VoTT,選擇新建項目
-
新建連接點
-
選擇為添加位置
-
選擇圖像所在文件夾位置,添加確認
-
工作界面右上角區域為標簽處理區域,可以進行標簽的添加刪除和位置更改操作
-
正上方區域為框選工作區域
-
左邊為文件選項,可以選擇框選圖像已經導出
-
標注好的圖像導出為 JSON 格式
-
卷積神經網絡和普通神經網絡的區別主要在于“卷積”二字,卷積也就是我們說的內積計算方式,就是將矩陣相乘再相加,卷積的操作是為了提取區域的主要特征,也是一種減少維度的方法,并且在圖像識別中這種方式也是很合理的,卷積這個操作最開始來自于計算機波紋處理,后來應用到計算機視覺領域得到了顯著的作用。
-
卷積操作可以作為物體的邊緣檢測,這在圖像識別上提供了很大的幫助,在將我們的濾波器放在選中的像素上之后,我們將卷積核中的每一個數值和圖像中對應的數值成對相乘。最后將乘積的結果相加,然后把結果放在輸出特征圖的正確位置上。我們在上邊的動畫中可以以一個微觀的形式看到這個運算的過程,但是更有趣的是我們在整幅圖像上執行這個運算得到的結果。
-
“池化”操作是和“卷積”配合使用,池化操作也是一種提取重要特征的方式,但是在這一環節中沒有權重產生,它的工作方式是指定池化的大小,對數據進行掃描保留區域內最大數值,這個操作也可以保留區域內的平均數值。除了卷積層,CNN 通常會用到所謂的池化層。它們最早被用來減小張量的大小以及加速運算。這些層是比較簡單的——我們需要將我們的圖像分成不同的區域,然后在每一個部分上執行一些運算。例如,對 Max Pool 層而言,我們會選擇每個區域的最大值,并將它放到對應的輸出區域。與卷積層的情況一樣,我們有兩個可用的超參數——濾波器大小和步長。最后但同樣重要的一點是,如果你對一個多通道的圖像執行池化操作,那么每一個通道的池化應該單獨完成。
-
“全連接”,此操作是將圖像數組進行平壓之后全連接,之后的操作和普通的神經網絡原理一致,最后的輸出層利用邏輯函數進行預測。
-
數據輸入,在數據輸入過程中添加 Keras 圖像生成器模塊,擴大數據集。
-
效果展示
3.2.5 模型評估
-
訓練集
01 0 4749 216 1 283 6933 評估百分比 真陽率 96.98% 假陽率 3.02% 真陰率 5.62% 假陰率 94.38% 召回率 96.08% -
測試集
01 0 562 64 1 76 803 評估百分比 真陽率 92.62% 假陽率 7.38% 真陰率 11.91% 假陰率 88.09% 召回率 91.35%
-
實時預測
對面部表情進行實時識別需要計算機獲取攝像頭的信息,思路是通過獲取計算機攝像頭的權限,打開攝像頭進行實時畫面的捕捉,獲取當前畫面的一幀來做預測,根據刷新率不同識別的實時速率也不同 #-*- coding: utf-8 -*-import cv2 import sys import gc import json import numpy as np from keras.models import Sequential from keras.models import model_from_json root_path=os.path.abspath(".") model_path=root_path+'/model/' img_size=48 emo_labels = ["happy", 'disgust'] num_class = len(emo_labels) json_file=open(model_path+'model_json.json') loaded_model_json = json_file.read() json_file.close() model = model_from_json(loaded_model_json) model.load_weights(model_path+'model_weight.h5')if __name__ == '__main__':if len(sys.argv) == 1:print(len(sys.argv))print("Usage:%s camera_id\r\n" % (sys.argv[0]))sys.exit(0)#框住人臉的矩形邊框顏色color = (0, 0, 2555)#捕獲指定攝像頭的實時視頻流cap = cv2.VideoCapture(0)#人臉識別分類器本地存儲路徑cascade_path ="C:/ProgramData/Anaconda3/lib/site-packages/cv2/data/haarcascade_frontalface_alt.xml"#循環檢測識別人臉while True:_, frame = cap.read() #讀取一幀視頻#圖像灰化,降低計算復雜度frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#使用人臉識別分類器,讀入分類器cascade = cv2.CascadeClassifier(cascade_path)#利用分類器識別出哪個區域為人臉faceRects = cascade.detectMultiScale(frame_gray, scaleFactor = 1.1,minNeighbors = 1, minSize = (120, 120))if len(faceRects) > 0:for faceRect in faceRects:x, y, w, h = faceRectimages=[]rs_sum=np.array([0.0]*num_class)image = frame_gray[y: y + h, x: x + w ]image=cv2.resize(image,(img_size,img_size))image=image*(1./255)images.append(image)images.append(cv2.flip(image,1))images.append(cv2.resize(image[2:45,:],(img_size,img_size)))for img in images:image=img.reshape(1,img_size,img_size,1)list_of_list = model.predict_proba(image,batch_size=32,verbose=1)result = [prob for lst in list_of_list for prob in lst]rs_sum+=np.array(result)print(rs_sum)label=np.argmax(rs_sum)emo = emo_labels[label]print ('Emotion : ',emo)cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness = 2)font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(frame,'%s' % emo,(x + 30, y + 30), font, 1, (255,0,255),4)cv2.imshow("識別朕的表情!", frame)#等待10毫秒看是否有按鍵輸入k = cv2.waitKey(30)#如果輸入q則退出循環if k & 0xFF == ord('q'):break#釋放攝像頭并銷毀所有窗口cap.release()cv2.destroyAllWindows()
資源下載地址:https://download.csdn.net/download/sheziqiong/85660758
總結
以上是生活随笔為你收集整理的基于Python的面部表情识别分析系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: amap不同样式marker点_想出一手
- 下一篇: ZBrush建模的15个小技巧,萌新小白