1. 程式人生 > >keras系列︱人臉表情分類與識別:opencv人臉檢測+Keras情緒分類(四)

keras系列︱人臉表情分類與識別:opencv人臉檢測+Keras情緒分類(四)

人臉識別熱門,表情識別更加。但是表情識別很難,因為人臉的微表情很多,本節介紹一種比較粗線條的表情分類與識別的辦法。

Keras系列:

本次講述的表情分類是識別的分析流程分為:

  • 1、載入pre-model網路與權重;
  • 2、利用opencv的函式進行簡單的人臉檢測;
  • 3、摳出人臉的圖並灰化;
  • 4、表情分類器檢測

.

一、表情資料集

主要來源於kaggle比賽,下載地址
有七種表情類別: (0=Angry, 1=Disgust, 2=Fear, 3=Happy, 4=Sad, 5=Surprise, 6=Neutral).
資料是48x48 灰度圖,格式比較奇葩。
第一列是情緒分類,第二列是影象的numpy,第三列是train or test。
這裡寫圖片描述


.

二、opencv的人臉識別

# (1)載入人臉檢測器
cascPath = '/.../haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(cascPath)

# (2)圖片載入並灰化
jpg_file = '/home/ubuntu/keras/image/8c80abb4gw1f3b5hxd3aaj20jg0cx411.jpg'
img_gray = cv2.imread(jpg_file)
img_gray = cv2.cvtColor(img_gray, cv2.COLOR_BGR2GRAY)

# 人臉探測
faces = faceCascade.detectMultiScale( img_gray, scaleFactor=1.1, minNeighbors=1,# minNeighbors=5比較難檢測 minSize=(30, 30), flags=cv2.cv.CV_HAAR_SCALE_IMAGE )

其中minNeighbors設定小一些,容易檢測出來。這個檢測器還是有點粗糙。
.

三、表情分類與識別

本節源自github的mememoji
網路結構:
這裡寫圖片描述

這裡寫圖片描述

opencv中的人臉檢測的pre-model檔案(haarcascade_frontalface_default.xml)和表情識別pre-model檔案(model.h5)都在

作者的github下載。

是利用Keras實現的。直接來看完整的程式碼:

import cv2
import sys
import json
import time
import numpy as np
from keras.models import model_from_json


emotion_labels = ['angry', 'fear', 'happy', 'sad', 'surprise', 'neutral']

# load json and create model arch
json_file = open('/.../model.json','r')
loaded_model_json = json_file.read()
json_file.close()
model = model_from_json(loaded_model_json)

# load weights into new model
model.load_weights('/.../model.h5')

def predict_emotion(face_image_gray): # a single cropped face
    resized_img = cv2.resize(face_image_gray, (48,48), interpolation = cv2.INTER_AREA)
    # cv2.imwrite(str(index)+'.png', resized_img)
    image = resized_img.reshape(1, 1, 48, 48)
    list_of_list = model.predict(image, batch_size=1, verbose=1)
    angry, fear, happy, sad, surprise, neutral = [prob for lst in list_of_list for prob in lst]
    return [angry, fear, happy, sad, surprise, neutral]


# -------------------直接預測-----------------------
img_gray = cv2.imread('/.../real-time_emotion_analyzer-master/meme_faces/angry-angry.png')
img_gray = cv2.cvtColor(img_gray, cv2.COLOR_BGR2GRAY)
angry, fear, happy, sad, surprise, neutral = predict_emotion(img_gray)


# -------------------人臉預測-----------------------
# 載入檢測器
cascPath = '/.../real-time_emotion_analyzer-master/haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(cascPath)

# 影象灰化
jpg_file = '/.../001.jpg'
img_gray = cv2.imread(jpg_file)
img_gray = cv2.cvtColor(img_gray, cv2.COLOR_BGR2GRAY)

# 人臉檢測
faces = faceCascade.detectMultiScale(
        img_gray,
        scaleFactor=1.1,
        minNeighbors=1,# minNeighbors=5比較難檢測
        minSize=(30, 30),
        flags=cv2.cv.CV_HAAR_SCALE_IMAGE
    )

# 表情畫框
for (x, y, w, h) in faces:
    face_image_gray = img_gray[y:y+h, x:x+w]
    cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
    angry, fear, happy, sad, surprise, neutral = predict_emotion(face_image_gray)