keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)
来源:互联网 发布:ubuntu怎么启动mysql 编辑:程序博客网 时间:2024/06/06 08:48
人脸识别热门,表情识别更加。但是表情识别很难,因为人脸的微表情很多,本节介绍一种比较粗线条的表情分类与识别的办法。
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 cv2import sysimport jsonimport timeimport numpy as npfrom keras.models import model_from_jsonemotion_labels = ['angry', 'fear', 'happy', 'sad', 'surprise', 'neutral']# load json and create model archjson_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 modelmodel.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)
- keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)
- keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)
- keras实战︱人脸表情分类与识别:人脸检测+情绪分类
- 目标检测与分类学习之路----opencv人脸检测识别(zero)
- keras搬砖系列-分类
- Keras RNN 与 情感分类(代码)
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
- keras实现Unet进行字符定位与识别分类
- 人脸识别keras实现教程
- keras/构建卷积神经网络人脸识别
- Keras classifier分类(二)
- keras + lstm 情感分类
- 利用keras进行分类
- keras -- 实现cifar10分类
- 使用Keras做猫狗分类
- (人脸识别2-2)——利用opencv内置分类器检测人脸
- OpenCV学习笔记:人脸检测(级联分类器)
- Java基础——HashMap和TreeMap的区别
- splinter,selenium 找不到chromedriver
- Java链接mongodb数据
- 解决Android Studio Refreshing XXX Project时间过长的方法
- Nios II 无法使用printf()函数的解决办法
- keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)
- webpack打包单页面引用的js
- css绘制各种角度三角形方法
- Hibernate与Mybatis对比
- YUV使用总结 —— Android常用的几种格式:NV21/NV12/YV12/YUV420P的区别
- Win32判断当前进程是否激活(失去焦点)
- 尝试使用云服务器
- Jeesite中shiro的用法讲解
- Python SQLAlchemy