我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这篇文章主要介绍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:        class="lazy" data-src = os.path.join(save_path, file)        dst = os.path.join(file_path, file)        shutil.copyfile(class="lazy" data-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训练如何实现微笑识别”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

基于Python如何实现植物识别小系统

这篇文章主要介绍了基于Python如何实现植物识别小系统,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。正文1)环境安装本文用到的环境:Python3.7 Pycharm社区
2023-06-22

基于face_recognition如何实现人脸识别

这篇文章将为大家详细讲解有关基于face_recognition如何实现人脸识别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。准备工作我们的人脸识别基于face_recognition库。f
2023-06-17

Python+OpenCV如何实现基于颜色的目标识别

这篇文章给大家介绍Python+OpenCV如何实现基于颜色的目标识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。任务让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。因为场地固定,背景单一,所以省下来很多操
2023-06-22

Android基于ArcSoft如何实现人脸识别

小编给大家分享一下Android基于ArcSoft如何实现人脸识别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、在虹软的开发者中心创建一个自己的应用,将APP
2023-06-22

基于OpenMV如何实现数字识别功能

这篇文章主要介绍基于OpenMV如何实现数字识别功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!基于OpenMV的图像识别OpenMV简介什么是OpenMVOpenMV是由美国克里斯团队基于MicroPython发
2023-06-25

基于Python如何实现微信自动回复功能

这篇文章主要介绍“基于Python如何实现微信自动回复功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现微信自动回复功能”文章能帮助大家解决问题。实现自动回复的功能,我们需要
2023-07-02

单层的基础神经网络基于TensorFlow如何实现手写字识别

本篇文章为大家展示了单层的基础神经网络基于TensorFlow如何实现手写字识别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。先上代码import tensorflow from tensorfl
2023-06-17

如何分析使用wxpy这个基于python实现的微信工具库的常见问题

本篇文章为大家展示了如何分析使用wxpy这个基于python实现的微信工具库的常见问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用如下的命令行安装:pip install wxpyCollec
2023-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录