女朋友啥時候怒了?Keras識別面部表情挽救你的膝蓋

  • 2019 年 11 月 12 日
  • 筆記

作者 | 葉聖

出品 | AI科技大本營(ID:rgznai100)

【導讀】隨著電腦和AI新技術及其涉及自然科學的飛速發展,整個社會上的管理系統高度大大提升,人們對類似人與人之間的交流日漸疲勞而希望有機器的理解。電腦系統和機械人如果需要像生物那樣具備解讀和傳達感情的戰鬥能力,將徹底轉變人與電腦系統兩者之間的的關係,使電腦系統需要更佳地為生物公共服務。表情識別是感情解讀的根基,是電腦系統解讀人們感情的必要,也是人們探尋和解讀人工智慧的有效途徑。

圖片表情識別是所指從等價的動態影像或靜態錄像中的分離出來特定的眼神穩定狀態 ,從而確認被辨識單純的認知焦慮,構建電腦系統對圖片眼神的解讀與辨識 ,徹底轉變人與電腦系統的的關係,從而超過更佳的嵌入式。因此,圖片表情識別在精神病學、智慧機器人、人工智慧監視、虛擬實境及製備動畫電影等各個領域有相當大的潛在應用於商業價值。

面部表情識別技術是最近幾十年來才發展起來的,由於面部表情的生態環境和複雜性,並且涉及生物化學及心理學,表情識別不具備較大的趣味性,因此,與其它生物識別技術如辨識、虹膜識別、人臉識別等相比發展狀況較慢,運用於還不廣泛。但是表情識別對於作業系統卻有重要的潛力,因此中國外很多研究中心、政府機構及學者致力於這方面的研究,並己經取得了一定的成果。

那麼下面我們將用Keras搭建面部表情識別的模型。

首先準備數據集,如圖所示:

將圖片放在不同的文件夾下,文件夾名字就為他的標籤名。

下面將建立神經網路程式碼。

首先導入需要使用的庫:

from keras.models import Sequential  from keras.layers import Conv2D,MaxPool2D,Activation,Dropout,Flatten,Dense  from keras.optimizers import Adam  from keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img  from keras.models import load_model  

下面為了充分利用數據集,對圖片加入一些裁剪等方面操作:

train_datagen = ImageDataGenerator(      rotation_range = 40,     # 隨機旋轉度數      width_shift_range = 0.2, # 隨機水平平移      height_shift_range = 0.2,# 隨機豎直平移      rescale = 1/255,         # 數據歸一化      shear_range = 20,       # 隨機錯切變換      zoom_range = 0.2,        # 隨機放大      horizontal_flip = True,  # 水平翻轉      fill_mode = 'nearest',   # 填充方式  )  

下面是網路層的搭建,利用卷積神經網路,下面每段程式碼有注釋:

添加一個卷積層,傳入固定寬高三通道的圖片,以32種不同的卷積核構建32張特徵圖,

卷積核大小為3*3,構建特徵圖比例和原圖相同,激活函數為relu函數。

model.add(Conv2D(input_shape=(IMG_W,IMG_H,3),filters=32,kernel_size=3,padding='same',activation='relu'))  

再次構建一個卷積層

model.add(Conv2D(filters=32,kernel_size=3,padding='same',activation='relu'))  

構建一個池化層,提取特徵,池化層的池化窗口為2*2,步長為2。

model.add(MaxPool2D(pool_size=2,strides=2))  

繼續構建卷積層和池化層,區別是卷積核數量為64。

model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))  model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))  model.add(MaxPool2D(pool_size=2,strides=2))  

繼續構建卷積層和池化層,區別是卷積核數量為128。

model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))  model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))  model.add(MaxPool2D(pool_size=2, strides=2))    model.add(Flatten()) #數據扁平化  model.add(Dense(128,activation='relu')) #構建一個具有128個神經元的全連接層  model.add(Dense(64,activation='relu')) #構建一個具有64個神經元的全連接層  model.add(Dropout(DROPOUT_RATE)) #加入dropout,防止過擬合。  model.add(Dense(CLASS,activation='softmax')) #輸出層  

接下來是訓練和保存的程式碼:

model.fit_generator( #模型擬合                      train_generator,  #訓練集迭代器                      steps_per_epoch=len(train_generator), #每個周期需要迭代多少步(圖片總量/批次大小=11200/64=175)                      epochs=EPOCHS, #迭代周期                      validation_data=test_generator, #測試集迭代器                      validation_steps=len(test_generator) #測試集迭代多少步                      )  model.save('{}.h5'.format(SAVE_PATH)) #保存模型  

然後預測顯示我們的程式碼:

image = load_img("56.jpg")  image = image_change(image)  img=cv2.imread("56.jpg")  img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  myfont = ImageFont.truetype(r'C:/Windows/Fonts/simfang.ttf', 40)  draw = ImageDraw.Draw(img_PIL)  draw.text((300, 10), label[model.predict_classes(image)][0], font=myfont, fill=(200, 100, 0))  img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)  cv2.imshow('frame', img_OpenCV)  cv2.waitKey(0)  

如果要調用攝影機就是這樣的程式碼:

cap = cv2.VideoCapture(0)  while True:      _,frame = cap.read()      bg = "temp.png"      cv2.imwrite(bg,frame)      image = load_img("temp.png")      #plt.imshow(image)      image = image_change(image)      img=cv2.imread("temp.png")      img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  myfont = ImageFont.truetype(r'C:/Windows/Fonts/simfang.ttf', 40)  draw = ImageDraw.Draw(img_PIL)  draw.text((300, 10), label[model.predict_classes(image)][0], font=myfont, fill=(200, 100, 0))  img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)  cv2.imshow('frame', img_OpenCV)  key = cv2.waitKey(1) & 0xFF    if key == ord("q"):          break  

最終輸出我們的實驗效果:

由此可見其模型基本準確。

下面簡單介紹表情識別的重要性和發展。

20世紀70至90年代,澳大利亞神經學Ekman 和 Friesen對人的表情識別做出了開創性的探索。Ekman定義了生物體的6種表情狀態:喜歡 (Love)、生氣(Angry)、驚訝 (Surprise)、憂慮(In)、厭惡(Disgust)和悲傷(Sad),證實了識別表情類別;其次是創立了面部動作編碼系統(Facial Freedom Control System,FACS),使研究者按照該系統,將一系列照片的動作分為兩組(Freedom Services,AU)來描述照片面部動作,通過照片風格和表情的的關係,進而檢測照片面部細微表情。

1978年,Suwa等人對一段影片進行了照片表情識別的最初處理,引發了一系列在照片和影片表情方面工作的展開。到七十年代至九十年代,隨著影像處理與神經網路技術的蓬勃發展,使得照片表情識別的電腦自動化處理變得可能,G Mase和 A Pentland是其中的奠基人。二人首先用光流強度處理,然後提取多處寬敞中的光流值,包含表情特徵向量,最後利用表情特徵向量構建照片表情辨識。該系統可以識別愧疚、惱怒、不滿和吃驚4種表情,識別率接近80%。

1997年,哈爾濱工業大學的教授領導團隊將照片表情識別的資料引入中國。

2003年,上海交通大學的王志良教授領導的團隊,將照片表情識別演算法應用於機器人的情感掌握研究中,並發表了2002年以來照片表情識別蓬勃發展情況的論文。2004年,浙江大學的吳文明講師在面部表情識別方面,明確指出了基於表情識別的發展方向。最近幾年,關於表情識別的項目數總體上呈現增長趨勢。清華大學、中國工程院、南京大學、天津交通大學、上海交通大學、哈爾濱工業大學、浙江大學、南京大學、國家重點實驗室、南開大學等多所學校和研究機構和政府機構參與了照片表情識別相關課題的研究。

雖然照片表情識別的商業運用於還停滯不前,但是中國外研究機構、政府機構和企業都在不盡相同的領域進行研究,部分論文早就取得了專利。因此表情識別的研究具備很大的研製潛力。

(*本文為 AI科技大本營投稿文章,轉載請微信聯繫 1092722531)