keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)

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

Keras系列:

Keras系列:

1、keras系列︱Sequential与Model模型、keras基本结构功能(一)

2、keras系列︱Application中五款已训练模型、VGG16框架(Sequential式、Model式)解读(二)

3、keras系列︱图像多分类训练与利用bottleneck features进行微调(三)

4、keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)

5、keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测、完整案例(五)

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

  • 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的人脸识别

参考《opencv+Recorder︱OpenCV 中使用 Haar 分类器进行面部检测》 理论略过,直接来看重点: (1)加载人脸检测器,haarcascade_frontalface_default.xml; (2)图片加载并灰化,cvtColor,可参考: opencv︱图像的色彩空間cvtColor(HSV、HSL、HSB 、BGR) (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。 网络结构:

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)

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专知

【论文推荐】最新八篇知识图谱相关论文—神经信息检索、可解释推理网络、Zero-Shot、上下文、Attentive RNN

【导读】专知内容组今天为大家推出八篇知识图谱(Knowledge Graph)相关论文,欢迎查看!

1803
来自专栏专知

【论文推荐】最新六篇知识图谱相关论文—事件演化图、神经词义消歧、增强神经网络、Mem2Seq、用户偏好传播、概率嵌入

【导读】专知内容组既前两天推出十五篇知识图谱(Knowledge Graph)相关论文,今天为大家推出六篇知识图谱(Knowledge Graph)相关论文,欢...

1935
来自专栏专知

【论文推荐】最新八篇主题模型相关论文—主题建模优化、变分推断、情绪强度、神经语言模型、搜索、社区聚合、主题建模的问题、光谱学习

【导读】专知内容组整理了最近八篇主题模型(Topic Model)相关文章,为大家进行介绍,欢迎查看! 1. Application of Rényi and ...

43912
来自专栏专知

【论文推荐】最新5篇视频分类相关论文—上下文门限、深度学习、时态特征、结构化标签推理、自动机器学习调优

【导读】专知内容组整理了最近五篇视频分类(Video Classification)相关文章,为大家进行介绍,欢迎查看! 1.Learnable pooling...

3385
来自专栏专知

【论文推荐】最新六篇图像描述生成相关论文—字符级推断、视觉解释、语义对齐、实体感知、确定性非自回归

1987
来自专栏机器之心

解读实践中最广泛应用的分类模型:朴素贝叶斯算法

机器之心专栏 作者:伏宸实验室研究员Windson Yang 贝叶斯模型在机器学习以及人工智能中都有出现,cherry 分类器(https://github.c...

2934
来自专栏专知

【最新】机器学习顶会 NIPS 2017 Pre-Proceedings 论文列表(附pdf下载链接)

【导读】机器学习领域顶尖学术会议——神经信息处理系统进展大会(Advances in NeuralInformation Processing Systems,...

4739
来自专栏AI科技大本营的专栏

ICLR vs arxiv-sanity

我觉得交叉对比 ICLR 2017(一个备受欢迎的深度学习大会)的论文决策(分为四类:Oral、Poster、Workshop 和 Reject)与所有论文在 ...

3485
来自专栏专知

【论文推荐】最新四篇CVPR2018 视频描述生成相关论文—双向注意力、Transformer、重构网络、层次强化学习

【导读】专知内容组在昨天推出八篇视频描述生成(Video Captioning)相关文章,今天为大家推出CVPR2018最新视频描述生成相关论文,欢迎查看!

1692
来自专栏专知

【论文推荐】最新八篇目标跟踪相关论文—自适应相关滤波、因果关系图模型、TrackingNet、ClickBAIT、图像矩模型

【导读】专知内容组整理了最近八篇目标跟踪(Object Tracking)相关文章,为大家进行介绍,欢迎查看! 1. Adaptive Correlation ...

4098

扫码关注云+社区