基于卷积神经网络的笑脸数据集训练

本文探讨了使用卷积神经网络进行笑脸数据集(genki4k)的训练与测试,包括SVM和CNN模型,实现了摄像头实时笑脸识别,并将数据集替换为口罩数据集,进行口罩佩戴情况的识别。实验中面临时间限制和数据量不足的问题,影响了最终精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

人工智能机器学习大作业


实验内容

1 理解人脸图像特征提取的各种方法(至少包括HoG、Dlib和卷积神经网络特征);2. 掌握笑脸数据集(genki4k)正负样本的划分、模型训练和测试的过程(至少包括SVM、CNN),输出模型训练精度和测试精度(F1-score和ROC);3. 完成一个摄像头采集自己人脸、并对表情(笑脸和非笑脸)的实时分类判读(输出分类文字)的程序;4. 将笑脸数据集换成口罩数据集,完成对口罩佩戴与否的模型训练,采取合适的特征提取方法,重新做上述2-3部。

2 完成实验报告和技术报告,技术报告写入博客,提交博客地址到学习通,Markdown和代码发邮件。实验报告按照最初的doc实验报告模版格式撰写(实验类型写“综合性、创新性”),也提交至邮箱。

笑脸数据集(genki4k)正负样本的划分、模型训练和测试的过程
训练数据集

import keras
keras.__version__
import os, shutil
# The path to the directory where the original
# dataset was uncompressed
riginal_dataset_dir = 'C:\\Users\\Desktop\\genki4k'
# The directory where we will
# store our smaller dataset
base_dir = 'C:\\Users\\Desktop\\genki4k\\smile_and_unsmile'
os.mkdir(base_dir)
# Directories for our training,
# validation and test splits
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)
# Directory with our training smile pictures
train_smile_dir = os.path.join(train_dir, 'smile')
os.mkdir(train_smile_dir)
# Directory with our training unsmile pictures
train_unsmile_dir = os.path.join(train_dir,
'unsmile')
os.mkdir(train_unsmile_dir)
#Directory with our validation smile pictures
validation_smile_dir = os.path.join(validation_dir,
'smile')
os.mkdir(validation_smile_dir)
# Directory with our validation unsmile pictures
validation_unsmile_dir =
os.path.join(validation_dir, 'unsmile')
os.mkdir(validation_unsmile_dir)
# Directory with our validation smile pictures
test_smile_dir = os.path.join(test_dir, 'smile')
os.mkdir(test_smile_dir)
# Directory with our validation un
### 使用卷积神经网络(CNN)实现笑脸图像分类 #### 一、卷积神经网络概述 卷积神经网络是一种专门用于处理具有网格结构的数据深度学习模型,如时间序列数据或二维图像数据。这类网络通过局部感知域和权值共享机制来减少参数数量并提高泛化性能[^1]。 #### 二、图片预处理 对于笑脸图像分类任务,在构建CNN之前需先对原始图片做适当调整以便于后续训过程顺利开展。这一步骤主要包括但不限于尺寸统一、灰度转换以及标准化操作等。例如: - 将所有输入图片裁剪成相同大小; - 如果是彩色照片,则可能要将其转化为黑白形式以简化问题复杂度; - 对像素值实施零均值规范化或其他类型的缩放变换。 ```python from PIL import Image import numpy as np def preprocess_image(image_path, target_size=(48, 48)): img = Image.open(image_path).convert('L') # 转换为灰度图 resized_img = img.resize(target_size) # 统一尺寸 normalized_array = (np.array(resized_img) - 127.5) / 127.5 # 归一化到[-1, 1] return normalized_array.reshape((target_size[0], target_size[1], 1)) ``` #### 三、划分数据集 为了评估所建立模型的效果好坏,应该把收集来的样本随机分成两部分——一部分用来训模型本身;另一部分则留作验证之用。理想情况下还应保留一小批独立测试集直到最后才动用它来进行最终评测。 #### 四、CNN架构设计 针对本案例中的笑容识别需求,可以采用如下简单的三层卷积加两个全连接层构成的基础版CNN框架: - 输入层接受固定宽度高度的一维向量表示法下的单通道灰度位图; - 接下来依次堆叠若干组交替排列着的小型滤波器阵列(即所谓的“卷积核”),每经历一次这样的组合都会紧跟着最大池化单元进一步压缩维度直至达到合适规模为止; - 最终经Flatten展平后的特征映射被送入标准MLP完成多类别概率分布预测工作。 ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout model = Sequential([ Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(48, 48, 1)), MaxPooling2D(pool_size=(2, 2)), Conv2D(64, kernel_size=(3, 3), activation='relu'), MaxPooling2D(pool_size=(2, 2)), Conv2D(128, kernel_size=(3, 3), activation='relu'), MaxPooling2D(pool_size=(2, 2)), Flatten(), Dense(128, activation='relu'), Dropout(0.5), Dense(2, activation='softmax') ]) ``` #### 五、编译与训模型 定义好损失函数、优化方法之后就可以调用fit()接口启动迭代更新流程了。期间建议开启早停策略防止过拟合现象发生
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值