Python基于keras训练简单微笑识别

文章目录

  • 一、数据预处理
  • 二、训练模型
    • 创建模型
    • 训练模型
    • 训练结果
  • 三、预测
    • 效果
  • 四、源代码
    • pretreatment.py
    • train.py
    • predict.py

一、数据预处理

实验数据来自genki4k
在这里插入图片描述
提取含有完整人脸的图片

def init_file():num = 0bar = tqdm(os.listdir(read_path))for file_name in bar:bar.desc = "预处理图片: "# a图片的全路径img_path = (read_path + "/" + file_name)# 读入的图片的路径中含非英文img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)# 获取图片的宽高img_shape = img.shapeimg_height = img_shape[0]img_width = img_shape[1]# 用来存储生成的单张人脸的路径# dlib检测dets = detector(img, 1)for k, d in enumerate(dets):if len(dets) > 1:continuenum += 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(save_path + "/" + "file" + str(num) + ".jpg")logging.info("一共", len(os.listdir(read_path)), "个样本")logging.info("有效样本", num)

二、训练模型

创建模型

# 创建网络
def create_model():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'])return model

训练模型

# 训练模型
def train_model(model):# 归一化处理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=60,epochs=12,validation_data=validation_generator,validation_steps=30)# 保存模型save_path = "../output/model"if not os.path.exists(save_path):os.makedirs(save_path)model.save(save_path + "/smileDetect.h5")return history

训练结果

准确率
在这里插入图片描述
丢失率
在这里插入图片描述
训练过程
在这里插入图片描述

三、预测

通过读取摄像头内容进行预测

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

效果

在这里插入图片描述
在这里插入图片描述

四、源代码

pretreatment.py

import dlib  # 人脸识别的库dlib
import numpy as np  # 数据处理的库numpy
import cv2  # 图像处理的库OpenCv
import os
import shutil
from tqdm import tqdm
import logging# dlib预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('../resources/shape_predictor_68_face_landmarks.dat')
# 原图片路径
read_path = "../resources/genki4k/files"
# 提取人脸存储路径
save_path = "../output/genki4k/files"
if not os.path.exists(save_path):os.makedirs(save_path)# 新的数据集
data_dir = '../resources/data'
if not os.path.exists(data_dir):os.makedirs(data_dir)# 训练集
train_dir = data_dir + "/train"
if not os.path.exists(train_dir):os.makedirs(train_dir)
# 验证集
validation_dir = os.path.join(data_dir, 'validation')
if not os.path.exists(validation_dir):os.makedirs(validation_dir)
# 测试集
test_dir = os.path.join(data_dir, 'test')
if not os.path.exists(test_dir):os.makedirs(test_dir)# 初始化训练数据
def init_data(file_list):# 如果不存在文件夹则新建for file_path in file_list:if not os.path.exists(file_path):os.makedirs(file_path)# 存在则清空里面所有数据else:for i in os.listdir(file_path):path = os.path.join(file_path, i)if os.path.isfile(path):os.remove(path)def init_file():num = 0bar = tqdm(os.listdir(read_path))for file_name in bar:bar.desc = "预处理图片: "# a图片的全路径img_path = (read_path + "/" + file_name)# 读入的图片的路径中含非英文img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)# 获取图片的宽高img_shape = img.shapeimg_height = img_shape[0]img_width = img_shape[1]# 用来存储生成的单张人脸的路径# dlib检测dets = detector(img, 1)for k, d in enumerate(dets):if len(dets) > 1:continuenum += 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(save_path + "/" + "file" + str(num) + ".jpg")logging.info("一共", len(os.listdir(read_path)), "个样本")logging.info("有效样本", num)# 划分数据集
def divide_data(file_path, message, begin, end):files = ['file{}.jpg'.format(i) for i in range(begin, end)]bar = tqdm(files)bar.desc = messagefor file in bar:src = os.path.join(save_path, file)dst = os.path.join(file_path, file)shutil.copyfile(src, dst)if __name__ == "__main__":init_file()positive_train_dir = os.path.join(train_dir, 'smile')negative_train_dir = os.path.join(train_dir, 'unSmile')positive_validation_dir = os.path.join(validation_dir, 'smile')negative_validation_dir = os.path.join(validation_dir, 'unSmile')positive_test_dir = os.path.join(test_dir, 'smile')negative_test_dir = os.path.join(test_dir, 'unSmile')file_list = [positive_train_dir, positive_validation_dir, positive_test_dir,negative_train_dir, negative_validation_dir, negative_test_dir]init_data(file_list)divide_data(positive_train_dir, "划分训练集正样本", 1, 1001)divide_data(negative_train_dir, "划分训练集负样本", 2200, 3200)divide_data(positive_validation_dir, "划分验证集正样本", 1000, 1500)divide_data(negative_validation_dir, "划分验证集负样本", 3000, 3500)divide_data(positive_test_dir, "划分测试集正样本", 1500, 2000)divide_data(negative_test_dir, "划分测试集负样本", 2800, 3500)

train.py

import os
from keras import layers
from keras import models
from tensorflow import optimizers
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGeneratortrain_dir = "../resources/data/train"
validation_dir = "../resources/data/validation"# 创建网络
def create_model():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'])return model# 训练模型
def train_model(model):# 归一化处理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=60,epochs=12,validation_data=validation_generator,validation_steps=30)# 保存模型save_path = "../output/model"if not os.path.exists(save_path):os.makedirs(save_path)model.save(save_path + "/smileDetect.h5")return history# 展示训练结果
def show_results(history):# 数据增强过后的训练集与验证集的精确度与损失度的图形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()if __name__ == "__main__":model = create_model()history = train_model(model)show_results(history)

predict.py

import os
from keras import layers
from keras import models
from tensorflow import optimizers
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGeneratortrain_dir = "../resources/data/train"
validation_dir = "../resources/data/validation"# 创建网络
# 检测视频或者摄像头中的人脸
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('../output/model/smileDetect.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()

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

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

相关文章

猫狗识别与分类

猫狗识别与分类 文章目录 猫狗识别与分类一、前言二、环境配置三、源码以及数据集四、基础猫狗识别程序如下1、train.pytrain.py程序结构: 2、detect.pydetect.py程序结构: 五、配置环境过程1、打开Anaconda Prompta、创建一个叫MNIST4的环境b、创建成功…

基于卷积神经网络(CNN)的猫狗识别

目录 引言 1.什么是卷积神经网络? 1.1什么是神经网络? 1.2什么是卷积? 2.准备工作 2.1一些知识: 2.2keras 2.3Conv2D 2.4 MaxPooling2D 3.基于卷积神经网络的猫狗识别 3.1导入必要库 3.2模型定义 3.3实例化模型并训练…

使用卷积神经网络构建图像分类模型检测肺炎

在本篇文章中,我将概述如何使用卷积神经网络构建可靠的图像分类模型,以便从胸部x光图像中检测肺炎的存在。 肺炎是一种常见的感染,它使肺部的气囊发炎,引起呼吸困难和发烧等症状。尽管肺炎并不难治疗,但及时诊断是至关…

实验3:卷积神经网络图像分类

卷积神经网络图像分类 1 理解卷积神经网络1.1 搭建环境1.2 猫狗分析实例 2 卷积神经网络2.1 网络模型搭建2.2 使用图像生成器读取图片 本次实验将完成以下任务: 按照 python笔记本深度学习,利用TensorFlow和Keras,自己搭建卷积神经网络完成狗猫数据集的分…

Python-猫狗数据集两阶段分类 原始数据直接训练;数据增强后训练

本博客运行环境为Jupyter Notebook-Python3.7。 由于我使用的是Anaconda3配置的jupyter环境,我也将直接在anaconda下搭建keras环境。 博客目录 下载tensorflow、keras下载数据集并重新划分数据预处理训练数据增强 由于我电脑性能不是很好,又是AMD显卡的…

python+基于Jupyter notebook完成卷积神经网络笑脸识别

一、用卷积神经网络实现,做笑脸、非笑脸等表情识别 1.数据集 2.将下载里面的datasets,放到D盘新建的smile中, 1.根据猫狗数据集训练的方法来训练笑脸数据集 1.首先将train_folder文件夹下俩个文件夹内的图片的名字做修改。(修…

使用预先训练网络和特征抽取大力提升图像识别率

神经网络在项目实践中遇到的一大问题是数据不足。任何人工智能项目,在数据不足面前都会巧妇难为无米之炊,算法再精巧,只要数据量不足,最后的效果都不尽如人意,我们目前正在做的图像识别就是如此,要想让网络…

笑脸数据集、口罩数据集划分、训练、测试(jupyter notebook)

一、HOG,Dlib,卷积神经网络介绍 1、HoG ①方法简介 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的描述子。通过计算和统计局部区域的梯度方向直方图来构成特征。Ho…

Deep Learning with Python 系列笔记(三):计算机视觉

计算机视觉的深度学习 我们将深入探讨卷积的原理以及为什么它们在计算机视觉任务中如此成功。但首先,让我们来看看一个非常简单的“convnet”示例,我们将使用我们的convnet来对MNIST数字进行分类。 下面的6行代码展示了基本的convnet是什么样子的。它是…

基于Keras实现Kaggle2013--Dogs vs. Cats12500张猫狗图像的精准分类

【下载数据集】 下载链接–百度网盘 【整理数据集】 将训练数据集分割成训练集、验证集、测试集,目录结构如图所示: 在Pycharm中新建项目,创建split_dataset.pyimport os, shutil# 数据集解压之后的目录 original_dataset_dir = D:\kaggle\dogsvscats\\train # 存放小数据集…

使用tensorflow搭建分类神经网络以及迁移学习(训练过程)

*************************************************** 码字不易,收藏之余,别忘了给我点个赞吧! *************************************************** ---------Start 本文不涉及tensorflow环境配置过程,只讲解整个项目代码…

基于卷积神经网络的图像识别技术从入门到深爱(理论思想与代码实践齐飞)

基于卷积神经网络的图像识别技术从入门到深爱(理论与代码实践齐飞!) 零、前言一、手写数字识别入门神经网络(入门篇)1. 手写数字数据集及神经网络数据概念介绍1.1 手写数字数据集1.2 神经网络数据集1.3 基于tensorflow…

卷积神经网络实现人脸识别微笑检测

一:卷积神经网络介绍: 1. 定义: 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习&a…

【053】ImageDataGenerator() 介绍

内容目录 一、ImageDataGenerator() 介绍二、数据增强处理和类的构造函数参数1、数据增强处理(data augmentation)2、ImageDataGenerator类的构造函数参数三、一般的对图像的处理流程四、ImageDataGenerator的所有方法介绍1、fit方法2、flow方法3、flow_…

2020中国华录杯·数据湖算法大赛—定向算法赛(吸烟打电话检测)baseline-tensorflow2.3-python3.6

文章目录 1.赛事背景1.主办方2.赛事介绍 2.baseline2.1 文件夹结构2.2 demo1. 01_train_test_split.py2. 02_tf2_mobilev2_classes.py3. 03_predict.py 3.问题及改进4.修改记录 1.赛事背景 1.主办方 赛事链接训练集测试集验证集 2.赛事介绍 1. 【赛题描述】行为规范&#xf…

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

卷积神经网络实现表情识别 CNN人脸表情识别图片预处理原本效果处理后效果 图片数据集效果 CNN人脸识别创建模型归一化与数据增强创建网络 摄像头人脸识别图片识别 参考 CNN人脸表情识别 图片预处理 import dlib # 人脸识别的库dlib import numpy as np # 数据处理的库numpy…

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)搭建…