keras实战︱人脸表情分类与识别:人脸检测+情绪分类

脸识别热门,表情识别更加。但是表情识别很难,因为人脸的微表情很多,本节介绍一种比较粗线条的表情分类与识别的办法。

本次讲述的表情分类是识别的分析流程分为:

  • 1、加载pre-model网络与权重;
  • 2、利用opencv的函数进行简单的人脸检测;
  • 3、抠出人脸的图并灰化;
  • 4、表情分类器检测

一、表情数据集

主要来源于kaggle比赛,下载地址。

在公众号 datadw 里 回复 keras 即可获取。

有七种表情类别: (0=Angry, 1=Disgust, 2=Fear, 3=Happy, 4=Sad, 5=Surprise, 6=Neutral). 数据是48x48 灰度图,格式比较奇葩。

第一列是情绪分类,第二列是图像的numpy,第三列是train or test。


二、opencv的人脸识别

参考《opencv+Recorder︱OpenCV 中使用 Haar 分类器进行面部检测》

http://blog.csdn.net/sinat_26917383/article/details/69831495

理论略过,直接来看重点: (1)加载人脸检测器,haarcascade_frontalface_default.xml; (2)图片加载并灰化,cvtColor,可参考: opencv︱图像的色彩空間cvtColor(HSV、HSL、HSB 、BGR)

http://blog.csdn.net/sinat_26917383/article/details/70860910

(2)人脸探测,detectMultiScale.

# (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。

https://github.com/JostineHo/mememoji

网络结构:

opencv中的人脸检测的pre-model文件(haarcascade_frontalface_default.xml)和表情识别pre-model文件(model.h5)都在作者的github下载。

作者的github地址

在公众号 datadw 里 回复 keras 即可获取。

是利用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)

via : http://blog.csdn.net/sinat_26917383/article/details/72885715

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2017-12-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习与计算机视觉

深度学习与机器学习中开源图片数据库汇总

数据的准备工作是训练模型前的必要工作,显然这也是非常耗时的,所以在入门阶段我们完全可以用现有的开源图片库快速完成前期的准备工作: ImageNet ImageN...

4185
来自专栏深度学习之tensorflow实战篇

SPSS Modeler 介绍决策树

本文将通过 SPSS Modeler 介绍决策树 (Decision tree) 演算法于银行行销领域的应用实例。通过使用网路公开电销资料建立不同决策树模型,分...

3658
来自专栏ATYUN订阅号

【教程】OpenCV—Node.js教程系列:Node.js+OpenCV面部脸识别

最近我将OpenCV普通发布版本设计的面部识别算法添加到了opencv4nodejs,它是一个npm包,允许你在Node.js应用程序中使用OpenCV。今天,...

7588
来自专栏Crossin的编程教室

Python+OpenCV 十几行代码模仿世界名画

现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了模仿名画风格的功能,比如 prisma、versa 等,可以把你的照片变成 ...

3543
来自专栏CreateAMind

Keras和DDPG玩赛车游戏(自动驾驶)

这里,s是状态,a是行为/动作,θ是策略网络的模型参数,π是常见的表示策略的符号。我们可以设想策略是我们行为的代理人,即一个从状态到动作的映射函数。

4662
来自专栏生信技能树

第41周生信文献分享:肝癌复发的CpG甲基化信号特征

前面我们讲解了一篇2013年多组学数据探索乳腺癌细胞系药物敏感性使用的也是两个机器学习算法,不过是LS-SVM和RF,但是也有借鉴意义。

1852
来自专栏企鹅号快讯

2017年深度学习必读31篇论文

新智元报道 作者:Kloud Strife 译者:刘光明,费欣欣 【新智元导读】2017年即将擦肩而过,Kloud Strife在其博客上盘点了今年最值得关注的...

20610
来自专栏机器学习人工学weekly

机器学习人工学weekly-2018/6/17

链接:https://blog.twitter.com/engineering/en_us/topics/insights/2018/twittertensor...

1233
来自专栏专知

【论文推荐】最新六篇知识图谱相关论文—全局关系嵌入、时序关系提取、对抗学习、远距离关系、时序知识图谱

2502
来自专栏量子位

海量ICLR论文点评公开,用这几个工具可以读得更轻松

允中 李林 编译整理 量子位 出品 | 公众号 QbitAI NIPS 2017开幕在即,这两天twitter上却在热火朝天地聊着还有点遥远的ICLR 2018...

2283

扫码关注云+社区

领取腾讯云代金券