SVM算法应用人脸表情识别
一、实验准备
环境搭建
pip install tensorflow==1.2.0pip install keras==2.0.6pip install dlib==19.6.1pip install h5py==2.10
如果是新建虚拟环境,还需安装以下包
pip install opencv_python==4.1.2.30pip install pillowpip install matplotlibpip install h5py
使用genki-4k数据集
下载地址:https://inc.ucsd.edu/mplab/wordpress/index.html%3Fp=398.html
二、图片预处理
打开数据集
我们需要将人脸检测出来并对图片进行裁剪
代码如下:
import dlib # 人脸识别的库dlib
import numpy as np # 数据处理的库numpy
import cv2 # 图像处理的库OpenCv
import os# dlib预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('D:\\shape_predictor_68_face_landmarks.dat')# 读取图像的路径
path_read = "C:\\Users\\28205\\Documents\\Tencent Files\\2820535964\\FileRecv\\genki4k\\files"
num=0
for file_name in os.listdir(path_read):#aa是图片的全路径aa=(path_read +"/"+file_name)#读入的图片的路径中含非英文img=cv2.imdecode(np.fromfile(aa, dtype=np.uint8), cv2.IMREAD_UNCHANGED)#获取图片的宽高img_shape=img.shapeimg_height=img_shape[0]img_width=img_shape[1]# 用来存储生成的单张人脸的路径path_save="C:\\Users\\28205\\Documents\\Tencent Files\\2820535964\\FileRecv\\genki4k\\files1" # dlib检测dets = detector(img,1)print("人脸数:", len(dets))for k, d in enumerate(dets):if len(dets)>1:continuenum=num+1# 计算矩形大小# (x,y), (宽度width, 高度height)pos_start = tuple([d.left(), d.top()])pos_end = tuple([d.right(), d.bottom()])# 计算矩形框大小height = d.bottom()-d.top()width = d.right()-d.left()# 根据人脸大小生成空的图像img_blank = np.zeros((height, width, 3), np.uint8)for i in range(height):if d.top()+i>=img_height:# 防止越界continuefor j in range(width):if d.left()+j>=img_width:# 防止越界continueimg_blank[i][j] = img[d.top()+i][d.left()+j]img_blank = cv2.resize(img_blank, (200, 200), interpolation=cv2.INTER_CUBIC)cv2.imencode('.jpg', img_blank)[1].tofile(path_save+"\\"+"file"+str(num)+".jpg") # 正确方法
运行效果如下:
三、划分数据集
代码:
import os, shutil
# 原始数据集路径
original_dataset_dir = 'C:\\Users\\28205\\Documents\\Tencent Files\\2820535964\\FileRecv\\genki4k\\files1'# 新的数据集
base_dir = 'C:\\Users\\28205\\Documents\\Tencent Files\\2820535964\\FileRecv\\genki4k\\files2'
os.mkdir(base_dir)# 训练图像、验证图像、测试图像的目录
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)train_cats_dir = os.path.join(train_dir, 'smile')
os.mkdir(train_cats_dir)train_dogs_dir = os.path.join(train_dir, 'unsmile')
os.mkdir(train_dogs_dir)validation_cats_dir = os.path.join(validation_dir, 'smile')
os.mkdir(validation_cats_dir)validation_dogs_dir = os.path.join(validation_dir, 'unsmile')
os.mkdir(validation_dogs_dir)test_cats_dir = os.path.join(test_dir, 'smile')
os.mkdir(test_cats_dir)test_dogs_dir = os.path.join(test_dir, 'unsmile')
os.mkdir(test_dogs_dir)# 复制1000张笑脸图片到train_c_dir
fnames = ['file{}.jpg'.format(i) for i in range(1,900)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(train_cats_dir, fname)shutil.copyfile(src, dst)fnames = ['file{}.jpg'.format(i) for i in range(900, 1350)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(validation_cats_dir, fname)shutil.copyfile(src, dst)# Copy next 500 cat images to test_cats_dir
fnames = ['file{}.jpg'.format(i) for i in range(1350, 1800)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(test_cats_dir, fname)shutil.copyfile(src, dst)fnames = ['file{}.jpg'.format(i) for i in range(2127,3000)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(train_dogs_dir, fname)shutil.copyfile(src, dst)# Copy next 500 dog images to validation_dogs_dir
fnames = ['file{}.jpg'.format(i) for i in range(3000,3878)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(validation_dogs_dir, fname)shutil.copyfile(src, dst)# Copy next 500 dog images to test_dogs_dir
fnames = ['file{}.jpg'.format(i) for i in range(3000,3878)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(test_dogs_dir, fname)shutil.copyfile(src, dst)
运行效果如下:
四、CNN提取人脸识别笑脸和非笑脸
1.创建模型
代码:
#创建模型
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.summary()#查看
运行效果:
2.归一化处理
代码:
#归一化
from keras import optimizers
model.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen=ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(# 目标文件目录train_dir,#所有图片的size必须是150x150target_size=(150, 150),batch_size=20,# Since we use binary_crossentropy loss, we need binary labelsclass_mode='binary')
validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
test_generator = test_datagen.flow_from_directory(test_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
for data_batch, labels_batch in train_generator:print('data batch shape:', data_batch.shape)print('labels batch shape:', labels_batch)break
#'smile': 0, 'unsmile': 1
3.数据增强
代码:
#数据增强
datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')
#数据增强后图片变化
import matplotlib.pyplot as plt
# This is module with image preprocessing utilities
from keras.preprocessing import image
fnames = [os.path.join(train_smile_dir, fname) for fname in os.listdir(train_smile_dir)]
img_path = fnames[3]
img = image.load_img(img_path, target_size=(150, 150))
x = image.img_to_array(img)
x = x.reshape((1,) + x.shape)
i = 0
for batch in datagen.flow(x, batch_size=1):plt.figure(i)imgplot = plt.imshow(image.array_to_img(batch[0]))i += 1if i % 4 == 0:break
plt.show()
运行效果:
4.创建网络
代码:
#创建网络
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])
#归一化处理
train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,)test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(# This is the target directorytrain_dir,# All images will be resized to 150x150target_size=(150, 150),batch_size=32,# Since we use binary_crossentropy loss, we need binary labelsclass_mode='binary')validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=32,class_mode='binary')history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=60, validation_data=validation_generator,validation_steps=50)
model.save('smileAndUnsmile1.h5')#数据增强过后的训练集与验证集的精确度与损失度的图形
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']epochs = range(len(acc))plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
运行结果:
5.摄像头实时测试
#检测视频或者摄像头中的人脸
import cv2
from keras.preprocessing import image
from keras.models import load_model
import numpy as np
import dlib
from PIL import Image
model = load_model('smileAndUnsmile1.h5')
detector = dlib.get_frontal_face_detector()
video=cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
def rec(img):gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)dets=detector(gray,1)if dets is not None:for face in dets:left=face.left()top=face.top()right=face.right()bottom=face.bottom()cv2.rectangle(img,(left,top),(right,bottom),(0,255,0),2)img1=cv2.resize(img[top:bottom,left:right],dsize=(150,150))img1=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)img1 = np.array(img1)/255.img_tensor = img1.reshape(-1,150,150,3)prediction =model.predict(img_tensor) if prediction[0][0]>0.5:result='unsmile'else:result='smile'cv2.putText(img, result, (left,top), font, 2, (0, 255, 0), 2, cv2.LINE_AA)cv2.imshow('Video', img)
while video.isOpened():res, img_rd = video.read()if not res:breakrec(img_rd)if cv2.waitKey(1) & 0xFF == ord('q'):break
video.release()
cv2.destroyAllWindows()
运行结果:
六、参考链接
https://blog.csdn.net/weixin_44436677/article/details/107171190
SVM算法应用人脸表情识别相关推荐
- 基于SVM算法的人脸表情识别
基于SVM算法的人脸
- 基于SVM算法的人脸微笑识别
一.环境搭建 安装项目所需要的包: 包括sklearn.pandas.joblib等: 哪些红色就安装哪些 二.下载数据集 我用的是genki-4k数据集,后面我会提供整个项目,包括数据集,也可以自己 ...
- 【图像识别】基于支持向量机算法svm实现脸部动态特征人脸表情识别附matlab代码
1 简介 人脸表情识别技术涉及情感计算,图像处理,机器视觉模式识别,生物特征识别等研究领域,是一个极富挑战性的交叉课题.该文介绍一种基于lpq特征,利用支持向量机(SVM)进行分类的人脸表情识别技术. ...
- 卷积神经网络实现人脸表情识别
文章目录 一.实现过程 1.1 下载数据集 1.2 根据猫狗数据集训练的方法来训练笑脸数据集 1.2 图片分类 1.3 作为健全性检查,计算一下在每个训练分割中我们有多少图片(训练/验证/测试): 1 ...
- SVM算法人脸表情识别
SVM算法人脸表情识别 前言 一.算法简介 (一)流程 (二)原理图 (三)HOG特征提取原理 二.代码实现 三.总结 参考资料 前言 准备资料 百度网盘 链接:https://pan.baidu.c ...
- 基于堆栈二值化自动编码器和二值化神经的无约束人脸表情识别算法(An efficient unconstrained FERa based on BAEs and BNN)
摘要(abstract) 虽然深度学习在许多模式识别任务中都取得了良好的效果,但对于含有大量参数集.标记数据有限的深度网络,过拟合问题仍然是一个严重的问题.在这项工作中,二进制自动编码器(BAEs)和 ...
- 高精度人脸表情识别(附GitHub地址)
编者按:本文原作者吴捷,目前于中山大学就读研究生.研究领域为计算机视觉与自然语言处理.本文原载于知乎,经作者授权发布.欢迎去GitHub给大佬加星. 先放出GitHub地址: https://gith ...
- 【技术综述】人脸表情识别研究
李振东 北京邮电大学硕士在读,计算机视觉方向 言有三 毕业于中国科学院,计算机视觉方向从业者,有三工作室等创始人 作者 | 李振东/言有三 编辑 | 言有三 随着机器学习和深度神经网络两个领域的迅速发 ...
- 人脸表情识别概述(一)
一.人脸表情识别技术目前主要的应用领域包括人机交互.安全.机器人制造.医疗.通信和汽车领域等 二.1971年,心理学家Ekman与Friesen的研究最早提出人类有六种主要情感,每种情感以唯一的表情来 ...
最新文章
- Nginx 入门到实战,新手必懂。
- 一个SAP开发人员2017年在编程和游泳上的双重修炼过程
- express基本原理
- 没有找到dllregisterserver输入点_「Mac实用技巧」将浏览器的点密码转换成文本密码的三种方法分享...
- linux ghost dd,在Linux上用dd命令实现ghost功能
- AtCoder ARC 076D - Built?
- qnap威联通作文件服务器,QNAP 威联通 453BT3 网络存储服务器 使用手记,Nas中的小钢炮...
- 1000款商务通用PPT模板免费下载
- unity.UGUI事件系统之Drag滑动事件
- VGA高速PCB布局布线设计指南
- js android 复制粘贴板,js实现复制到粘贴板方法
- 计算机msvcp100.dll,msvcp100.dll丢失的解决方法
- 好书推荐之《不能承受的生命之轻》 隐私策略(Privacy policy)
- excel日期函数的应用
- 牛客 20859 兔子的名字
- mysql查询每个部门的最高和最低工资_SQL数据库 计算出每个部门的平均工资 最高工资和最低工资 语法怎么写?...
- 《茶馆》再开张 这出戏濮存昕、冯远征演了20年
- 图学习笔记(一):图
- 关于win 10 WLAN连接红叉的问题解决
- 鸿水点评:春晚四小花旦