返回顶部
首页 > 资讯 > 后端开发 > Python >Python基于keras训练如何实现微笑识别
  • 636
分享到

Python基于keras训练如何实现微笑识别

2023-06-29 01:06:10 636人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍python基于keras训练如何实现微笑识别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、数据预处理实验数据来自genki4k提取含有完整人脸的图片def init_file():&n

这篇文章主要介绍python基于keras训练如何实现微笑识别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、数据预处理

实验数据来自genki4k

Python基于keras训练如何实现微笑识别

提取含有完整人脸的图片

def init_file():    num = 0    bar = 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.shape        img_height = img_shape[0]        img_width = img_shape[1]        # 用来存储生成的单张人脸的路径        # dlib检测        dets = detector(img, 1)        for k, d in enumerate(dets):            if len(dets) > 1:                continue            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:  # 防止越界                    continue                for j in range(width):                    if d.left() + j >= img_width:  # 防止越界                        continue                    img_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 directory        train_dir,        # All images will be resized to 150x150        target_size=(150, 150),        batch_size=32,        # Since we use binary_crossentropy loss, we need binary labels        class_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.h6")    return history

训练结果

准确率

Python基于keras训练如何实现微笑识别

丢失率

Python基于keras训练如何实现微笑识别

训练过程

Python基于keras训练如何实现微笑识别

三、预测

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

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:        break    rec(img_rd)    if cv2.waiTKEy(1) & 0xFF == ord('q'):        break

效果

Python基于keras训练如何实现微笑识别

Python基于keras训练如何实现微笑识别

四、源代码

pretreatment.py

import dlib  # 人脸识别的库dlibimport numpy as np  # 数据处理的库numpyimport cv2  # 图像处理的库OpenCVimport osimport shutilfrom tqdm import tqdmimport 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 = 0    bar = 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.shape        img_height = img_shape[0]        img_width = img_shape[1]        # 用来存储生成的单张人脸的路径        # dlib检测        dets = detector(img, 1)        for k, d in enumerate(dets):            if len(dets) > 1:                continue            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:  # 防止越界                    continue                for j in range(width):                    if d.left() + j >= img_width:  # 防止越界                        continue                    img_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 = message    for 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 osfrom keras import layersfrom keras import modelsfrom Tensorflow import optimizersimport matplotlib.pyplot as pltfrom 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 directory        train_dir,        # All images will be resized to 150x150        target_size=(150, 150),        batch_size=32,        # Since we use binary_crossentropy loss, we need binary labels        class_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.h6")    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 osfrom keras import layersfrom keras import modelsfrom tensorflow import optimizersimport matplotlib.pyplot as pltfrom keras.preprocessing.image import ImageDataGeneratortrain_dir = "../resources/data/train"validation_dir = "../resources/data/validation"# 创建网络# 检测视频或者摄像头中的人脸import cv2from keras.preprocessing import imagefrom keras.models import load_modelimport numpy as npimport dlibfrom PIL import Imagemodel = load_model('../output/model/smileDetect.h6')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:        break    rec(img_rd)    if cv2.waitKey(1) & 0xFF == ord('q'):        breakvideo.release()cv2.destroyAllwindows()

以上是“Python基于keras训练如何实现微笑识别”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网Python频道!

--结束END--

本文标题: Python基于keras训练如何实现微笑识别

本文链接: https://lsjlt.com/news/321738.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python基于keras训练如何实现微笑识别
    这篇文章主要介绍Python基于keras训练如何实现微笑识别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、数据预处理实验数据来自genki4k提取含有完整人脸的图片def init_file():&n...
    99+
    2023-06-29
  • Python基于keras训练实现微笑识别的示例详解
    目录一、数据预处理二、训练模型创建模型训练模型训练结果三、预测效果四、源代码pretreatment.pytrain.pypredict.py一、数据预处理 实验数据来自genki4...
    99+
    2024-04-02
  • Keras中如何实现对抗性训练
    对抗性训练是一种用于增强模型对抗攻击的方法。在Keras中,可以通过以下步骤实现对抗性训练: 导入所需的库: import te...
    99+
    2024-04-02
  • Python怎么实现人脸识别微笑检测
    这篇文章主要介绍“Python怎么实现人脸识别微笑检测”,在日常操作中,相信很多人在Python怎么实现人脸识别微笑检测问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么实现人脸识别微笑检测”的疑...
    99+
    2023-06-21
  • 基于python+opencv调用电脑摄像头实现实时人脸眼睛以及微笑识别
    本文教大家调用电脑摄像头进行实时人脸+眼睛识别+微笑识别,供大家参考,具体内容如下 一、调用电脑摄像头进行实时人脸+眼睛识别 # 调用电脑摄像头进行实时人脸+眼睛识别,可直接复制...
    99+
    2024-04-02
  • 基于Python如何实现植物识别小系统
    这篇文章主要介绍了基于Python如何实现植物识别小系统,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。正文1)环境安装本文用到的环境:Python3.7  Pych...
    99+
    2023-06-22
  • 基于face_recognition如何实现人脸识别
    这篇文章将为大家详细讲解有关基于face_recognition如何实现人脸识别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。准备工作我们的人脸识别基于face_recognition库。f...
    99+
    2023-06-17
  • Python+OpenCV如何实现基于颜色的目标识别
    这篇文章给大家介绍Python+OpenCV如何实现基于颜色的目标识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。任务让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。因为场地固定,背景单一,所以省下来很多操...
    99+
    2023-06-22
  • Android基于ArcSoft如何实现人脸识别
    小编给大家分享一下Android基于ArcSoft如何实现人脸识别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在虹软的开发者中心创建一个自己的应用,将APP_I...
    99+
    2023-06-22
  • 如何基于SpringBoot实现人脸识别功能
    目录前言需求分析一、人脸注册二、人脸登录具体实现一、人脸注册二、刷脸登录总结前言 去年在公司参与了一个某某机场建设智能机场的一个项目,人脸登机是其中的一个功能模块,当时只是写了后台的...
    99+
    2024-04-02
  • 基于OpenMV如何实现数字识别功能
    这篇文章主要介绍基于OpenMV如何实现数字识别功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!基于OpenMV的图像识别OpenMV简介什么是OpenMVOpenMV是由美国克里斯团队基于MicroPython发...
    99+
    2023-06-25
  • 基于Python的车牌识别系统实现
    本文将以基于Python的车牌识别系统实现为方向,介绍车牌识别技术的基本原理、常用算法和方法,并详细讲解如何利用Python语言实现一个完整的车牌识别系统。 目录 引言车牌识别技...
    99+
    2023-10-18
    python 车牌识别 计算机视觉 机器学习 原力计划
  • Python基于ImageAI实现图像识别详解
    目录背景简介图像预测算法引入目标检测图像目标检测视频目标检测背景简介 ImageAI是一个面向计算机视觉编程的Python库,支持最先进的机器学习算法。主要图像预测,物体检测,视频对...
    99+
    2023-02-01
    Python ImageAI图像识别 Python 图像识别 Python ImageAI
  • 基于Python的货币识别技术实现
    目录 介绍 本文的目的和意义 货币识别技术的应用场景 货币识别的基本原理 图像处理技术在货币识别中...
    99+
    2024-01-21
    Python 货币识别 图像处理 图像识别
  • 如何利用opencv训练自己的模型实现特定物体的识别
    目录1.说明2.效果3.准备3.1 程序准备3.2 样本数据准备3.3 正样本VEC文件创建4.样本数据训练5.测试代码6.编译说明备注总结1.说明 opencv安装包中有训练好的分...
    99+
    2024-04-02
  • 如何基于opencv实现简单的数字识别
    目录前言要解决的问题解决问题的思路总结前言 由于自己学识尚浅,不能用python深度学习来识别这里的数字,所以就完全采用opencv来识别数字,然后在这里分享、记录一下自己在学习过程...
    99+
    2024-04-02
  • 基于Python实现对PDF文件的OCR识别
    最近在做一个项目的时候,需要将PDF文件作为输入,从中输出文本,然后将文本存入数据库中。为此,我找寻了很久的解决方案,最终才确定使用tesseract。所以不要浪费时间了,我们开始吧。 1.安装tesser...
    99+
    2022-06-04
    文件 Python PDF
  • 基于Python的车牌识别系统的实现
    目录 第1章 绪论 1 1.1研究背景与意义 1 1.2课题研究现状 1 1.3研究目标 1 1.4研究内容与论文组织结构 1 第2章 相关理论与关键技术 3 2.1计算机视觉概述 3 2.2 Ope...
    99+
    2023-10-20
    python 计算机视觉 opencv 车牌识别系统 毕业设计
  • Python+OpenCV实现基于颜色的目标识别
    目录任务主要代码效果展示学习了一点opencv的知识于是找了个小项目来实践一下。这里先说明一下,我的实现方法不见得是最好的(因为这只是一个用于练习的项目)仅作参考,也欢迎各位大佬指正...
    99+
    2024-04-02
  • Python中基于Opencv怎么实现人脸识别
    这篇文章主要讲解了“Python中基于Opencv怎么实现人脸识别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中基于Opencv怎么实现人脸识别”吧!检测人脸。这应该是最基本的...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作