卷积神经网络实现表情识别

卷积神经网络实现表情识别

    • CNN人脸表情识别
      • 图片预处理
        • 原本效果
        • 处理后效果
      • 图片数据集
        • 效果
      • CNN人脸识别
        • 创建模型
        • 归一化与数据增强
        • 创建网络
      • 摄像头人脸识别
      • 图片识别
    • 参考

CNN人脸表情识别

图片预处理

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:\\Project\\AIpack\\shape_predictor_68_face_landmarks.dat')# 读取图像的路径
path_read = "D:\\Project\\AIpack\\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 = "D:\\Project\\AIpack\\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
import shutil# 原始数据集路径
original_dataset_dir = 'D:\\Project\\AIpack\\genki4k\\files1'# 新的数据集
base_dir = 'D:\\Project\\AIpack\\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人脸识别

创建模型

# 创建模型
from keras import layers
from keras import modelsmodel = 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()  # 查看

归一化与数据增强

# 归一化
from tensorflow import optimizersmodel.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])
from keras.preprocessing.image import ImageDataGeneratortrain_datagen = ImageDataGenerator(rescale=1. / 255)
validation_datagen = ImageDataGenerator(rescale=1. / 255)
test_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(# 目标文件目录'D:\\Project\\AIpack\\genki4k\\files2\\train',# 所有图片的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('D:\\Project\\AIpack\\genki4k\\files2\\validation',target_size=(150, 150),batch_size=20,class_mode='binary')
test_generator = test_datagen.flow_from_directory('D:\\Project\\AIpack\\genki4k\\files2\\test',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# 数据增强
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 imagefnames = [os.path.join('D:\\Project\\AIpack\\genki4k\\files2\\train\\smile', fname) for fname in os.listdir('D:\\Project\\AIpack\\genki4k\\files2\\train\\smile')]
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()

创建网络

from keras import layers
from keras import models
from tensorflow import optimizers
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGenerator# 创建网络
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 directory'D:\\Project\\AIpack\\genki4k\\files2\\train\\',# 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('D:\\Project\\AIpack\\genki4k\\files2\\validation\\',target_size=(150, 150),batch_size=32,class_mode='binary')history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=200,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()

摄像头人脸识别

# 检测视频或者摄像头中的人脸
import cv2
from keras.preprocessing import image
from keras.models import load_model
import numpy as np
import dlib
from PIL import Imagemodel = load_model('smileAndUnsmile1.h5')
detector = dlib.get_frontal_face_detector()
video = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEXdef 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()

在这里插入图片描述

图片识别

# 单张图片进行判断  是笑脸还是非笑脸
import cv2
from keras.preprocessing import image
from keras.models import load_model
import numpy as np# 加载模型
model = load_model('smileAndUnsmile1.h5')
# 本地图片路径
img_path = './115.png'
img = image.load_img(img_path, target_size=(150, 150))img_tensor = image.img_to_array(img) / 255.0
img_tensor = np.expand_dims(img_tensor, axis=0)
prediction = model.predict(img_tensor)
print(prediction)
if prediction[0][0] > 0.5:result = '非笑脸'
else:result = '笑脸'
print(result)

在这里插入图片描述

在这里插入图片描述

参考

Python-人脸识别并判断表情 笑脸或非笑脸 使用笑脸数据集genki4k

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48855.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tensorflow 2.5 model.evaluate报错Invalid argument: required broadcastable shapes at loc(unknown)

Tensorflow 2.5使用model.evaluate进行模型评估时报错Invalid argument: required broadcastable shapes at loc unknown 1.软件环境⚙️2.问题描述🔍3.解决方法🐡4.结果预览🤔 ⚡插播一条老家自产的糖心苹果,多个品种&#xff0c…

推荐收藏!3.5万字图解 Pandas!

↓推荐关注↓ 大家好,在 Python 各个工具包中,最频繁使用的应该就是 Pandas 了。今天我以图解的方式给大家介绍 Pandas 中各种常用的操作,内容有点长,喜欢记得点赞、收藏、关注。 第一部分:Pandas 展示 请看下表: 它描…

ONLYOFFICE 文档 7.4 版本现已发布:新增绘图、雷达图、合并文档、另存为图片等功能

您现在可以使用我们最新版本的在线编辑器了,更新的功能包括:绘图、雷达图、合并文档、将某个对象或者整个文档/工作表保存为图片、更强大的编辑区域保护等等。继续阅读本文了解所有的更新。 在编辑器中绘图 尽情发挥创造力,使用画笔或荧光笔…

四十不惑-重头再来

四十不惑-重头再来 重装系统系统版本 卸载老毛桃自动安装的软件安装必备软件安装Docker DeskTop安装Docker Desktop后重启系统运行Power Shell切换环境重新运行PS DockerDesktop导入镜像启动DockeDesktop启动PS 新建容器搭建ChatGPT(pengzhile_pandora_latest_43f234c4e8a8)搭建…

大学生必备神器

大学生要掌握的办公软件因专业和工作需求而异,但是以下是一些普遍适用于大学生的办公软件,可以帮助提高学习和工作效率,今天就给大家推荐几款大学生常用的软件。 1.OneDrive 这是微软出品的云存储产品,与百度网盘有些类似&#…

北极九章CEO刘沂鑫:从自然语言一步直达数据洞察——数据驱动增长的新范式|量子位·视点分享回顾...

视点 发自 凹非寺量子位 | 公众号 QbitAI 今天,尽管人人都在谈论大数据,但数据实际价值和现有价值有巨大落差。 尽管企业采集和储存、计算数据的能力越来越强,但数据分析能力始终增长缓慢。据Forrester调研,约70%的企业数据从未被…

老胡的周刊(第089期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 MOSS[2] 来自复旦大学的开源工具增强型会话语…

从网站流量指标开始,CSDN 如何洞察运营效果异动?丨评测来了

最近,CSDN组织了一次《人人都能简单上手的指标平台》开箱测评活动,邀请了三位嘉宾,分别是 Kyligence 联合创始人兼 CTO 李扬、CSDN 战略合作总监闫辉、CSDN 开发云 CTO 冯丙见。三位嘉宾根据真实的需求场景,详细评估了指标平台的最…

跟我看 Microsoft Build 2023

又是一年一度的 Microsoft Build 了,你有和我一样熬夜看了吗?如果没有,那么你就错过了一场精彩的技术盛宴。本次的 Microsoft Build ,有非常多的干货,围绕打造 Copilot 应用展开。我会将基于 Data AI 比较重要的内容列…

ChatGPT简介|人机交互的新时代|小智ai

ChatGPT丨小智ai丨chatgpt丨人工智能丨OpenAI丨聊天机器人丨AI语音助手丨GPT-3.5丨开源AI平台 导语:随着人工智能的迅猛发展,ChatGPT(Chat Generative Pre-trained Transformer)作为一种基于深度学习的自然语言处理模型&#xff0…

从春节后央行的首批罚单,看金融反欺诈反洗钱的复杂性

目录 个人信息保护的问题 征信管理的问题 反洗钱与反欺诈的问题 金融欺诈愈加复杂多变 金融机构如何增强反欺诈反洗钱 春节后,央行公示首批罚单。其中,厦门银行被中国人民银行福州中心支行给予警告,并没收违法所得767.17元,处…

2020微信对话截图生成器,各种截图一键制作!

前言 上次有朋友说想要个微商作图神器,找了几款觉得功能一般般,就没有发出来,今天又有朋友私信了,对比了这几款,选择中一款不错的给大家分享一下,软件是安卓版的,打开就是VIP,无需去登陆了,直接使用即可!嗯!拉下去看下详情介绍叭! // 软件…

呼唤正义的 AssangeDAO 众筹,会是一个骗局吗?

Jan. 2022, Sabrinafootprint.network Data Source: Footprint Analytics 目前 AssangeDAO 是JuiceBox 历史上最大的 DAO,超过了 ConstitutionDAO 的筹集。 AssangeDAO是在2021年12月10日由一群赛博朋克发起的。它累计募集了17,442.49 ETH ,所有资金都…

中国互联网众筹行业

近些年,中国互联网发展迅速,众筹这种起源于美国的新型互联网金融模式更是一直处于风口浪尖。在“大众创业、万众创新”的背景下,这种低门槛的融资模式也深受欢迎,加上阿里、京东、苏宁三大电商的巨头的相继入场,更令这…

海外众筹 | Kickstarter热门众筹项目汇总

筹集资金:$837,890(仍在筹集中) Backer数量:3,194 VELO推出了世界上第一款可在3种尺寸之间轻松切换的硬边可扩展行李箱,它可以转换为16英寸小型随身携带;22英寸中型托运行李;26英寸…

众筹平台网站

以下收录目前国内仍在正常运营的所有众筹网站: 追梦网 - 创意计划众筹平台 和点名时间一样,最早开始涉足众筹的国内网站。 觉 JUE.SO 也是有资历了,专注预售500年。 EMIE,亿觅创意网 这个网站转型了,似乎离众筹已经越来越远。 众筹…

python生成dat文件_基于Python的DTMF信号识别

前言 我这标题起得怎么这么像课程论文呢…… 啊,放心啦,这不是课程论文,这只是一个有趣(且值钱)的程序。 起因是这样的。我加了几个软件兼职群,前几天我发现其中有一个项目,是利用FFT识别信号啥的,报价700,性价比对于我来说我觉得挺高的了,看样子好像也不难,我就接了…

他是程序员出身,做了一款最遭人“恨”的App,挑战张小龙!

????????关注后回复 “进群” ,拉你进程序员交流群???????? 作者丨流水不争先 来源丨技术领导力(ID:jishulingdaoli) “嘀嘀,嘀嘀”,无论何时何地,打工人最怕听到的声音,就是钉钉的消息提示…

《周鸿祎自述:我的互联网方法论》---- 读书笔记

文章大纲 第一章 欢迎来到互联网时代第二章 互联网里的用户至上第三章 颠覆式创新第四章 免费时代第五章 体验为王第六章 互联网方法论附录 周鸿祎批注“遗失的乔布斯访谈” 周鸿祎个人简介: 周鸿祎这个人比较有争议,如果不是他,中国互联网的…

2022年终总结(脚踏实地,仰望星空)

2022年终总结 回忆录 2022年焦虑和快乐是这一年中最大的两种情绪了。焦虑主要是因为心里的三块石头,从年初就开始悬着。第一块石头,科研论文录用,第二个石头,拿到国奖,第三个石头是拿到满意的offer。目前只剩下最后一…