!!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!!
💕💕作者:优创学社
💕💕个人简介:本人在读博士研究生,拥有多年程序开发经验,辅导过上万人毕业设计,支持各类专业;如果需要论文、毕设辅导,程序定制可以联系作者
💕💕各类成品java系统 。javaweb,ssh,ssm,springboot等等项目框架,源码丰富,欢迎咨询交流。学习资料、程序开发、技术解答、代码讲解、源码部署,需要请看文末联系方式。
目 录
图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题。手势识别属于图像分类中的一个细分类问题。本课题要求初识深度学习和图像处理技术,利用python语言实现手势识别的实践任务。
2.1要求
(1)用Python语言实现程序设计;
(2)初识深度学习和图像处理技术;
(3)了解深度神经网络(Deep Neural Networks,简称DNN)相关知识;
(4)【难点】了解LeNet-5 卷积神经网络模型,并进行模型训练;
(5)【难点】调参数、优化,提高测试集准确率;
(6)实现手势识别的功能,程序要有注释。
(1)WINDOWS 10系统
(2)Pycharm2020+anaconda3
2.3开发语言
Python
本课题要求初识深度学习和图像处理技术,利用python语言实现手势识别的实践任务。该任务主要分为两步:模型训练和模型预测,步骤如图3.1.1所示。
图3.1.1 系统流程图
本任务设计第一步是进行模型训练。其主要步骤1.准备数据2.配置网络3.训练网络4.模型评估,流程如图3.2.1所示。
图3.2.1 模型训练流程图
准备数据工作中,首先遍历数据集图片,根据文件夹名称,生成label。其次,按1:9比例划分测试集和训练集,生成train_list和test_list。最后,将数据集定义成模型可以识别的格式。流程如图3.2.2所示。
图3.2.2 准备数据流程图
配置网络工作中,我们根据LeNet-5 模型的架构设计LENET5模型并编写paddle代码。
训练网络工作中,我们共有10个步骤分别为:模型实例化、训练模式、选用优化器、控制迭代次数、遍历训练集、进行预测、计算loss值、执行反向网络、优化loss值、保存模型。流程如图3.2.3所示。
图3.2.3 训练网络流程图
模型评估工作中,我们共有5个步骤分别为:加载模型、加载模型参数、评估模式、使用测试集评估、计算平均准确率。流程如图3.2.4所示。
图3.2.4 训练网络流程图
4.1.1总体任务的分析和设计
本任务设计第一步是进行模型训练。其主要步骤1.准备数据2.配置网络3.训练网络4.模型评估,四个步骤。
首先我们先导入本任务需要的库。
import os
import numpy as np
from PIL import Image
import paddle
import paddle.fluid as fluid
from multiprocessing import cpu_count
from paddle.fluid.dygraph import Pool2D,Conv2D
from paddle.fluid.dygraph import Linear
4.1.2准备数据工作的分析和设计
准备数据工作中,首先遍历数据集图片,根据文件夹名称,生成label。
# 生成图像列表
data_path = '/Dataset'
# 返回指定的文件夹包含的文件或文件夹的名字的列表。
character_folders = os.listdir(data_path)
# 删除存在的train_data.list和test_data.list
if (os.path.exists('./train_data.list')):
os.remove('./train_data.list')
if (os.path.exists('./test_data.list')):
os.remove('./test_data.list')
其次,按1:9比例划分测试集和训练集,生成train_list和test_list。
for character_folder in character_folders:
# 写入train_data
with open('./train_data.list', 'a') as f_train:
with open('./test_data.list', 'a') as f_test:
# 遍历目录下的所有图片文件
character_imgs = os.listdir(os.path.join(data_path, character_folder))
# 用count图片分类
count = 0
for img in character_imgs:
# 这里是9:1的设置为训练集和测试集
if count % 10 == 0:
f_test.write(os.path.join(data_path, character_folder, img) + '\t' + character_folder + '\n')
else:
f_train.write(os.path.join(data_path, character_folder, img) + '\t' + character_folder + '\n')
count += 1
图4.1.1 训练集列表
图4.1.2 测试机列表
最后,我们定义一下方法。将数据集定义成模型可以识别的格式。
data_mapper(): 读取图片,对图片进行归一化处理,返回图片和标签。
data_reader(): 按照train_list和test_list批量化读取图片。
train_reader(): 用于训练的数据提供器,乱序、按批次提供数据
test_reader():用于测试的数据提供器
4.1.3配置网络工作的分析和设计
配置网络工作中,我们根据LeNet-5 模型的架构设计LENET5模型并编写paddle代码。模型架构图如图4.1.3所示。
图4.1.3 LeNet-5模型的架构图
- LENET-5网络的input层
Yann LeCun教授的输入是灰度的图片单通道的,大小32×32。所以输入应该是是32×32×1,但是我们用的手势数据是彩色的三通道的,所以我们需要做一点修改并且把输入的图片resize成32×32×3,resize代码:
images = np.array([x[0].reshape(3,32,32) for x in data],np.float32)
- LENET-5网络的C1层
卷积核大小:5*5
卷积核数目:6
卷积步长:1
输入通道数:3
注意卷积核数目,一个卷积核会对应图片的一种特征,n个卷积核就能得出n个特征,n个输出的特征就是下一层的通道个数。
本任务采用的是彩色图片所以input是32*32*3,也就是C1层的输入是3通道的,C1层卷积核个数是6个,卷积核尺寸是5,步长是1所以得出paddle源码:
self.c1 = Conv2D(3,6,5,1)
- LENET-5网络的S2层池化层
池化大小:2×2
池化步长:2
paddle源码:
self.s2 = Pool2D(pool_size=2, pool_type='max', pool_stride=2)
- LENET-5网络的C3层
卷积核大小:5*5
卷积核数目:16
卷积步长:1
输入通道数:6
paddle源码:
self.c3 = Conv2D(6,16,5,1)
- LENET-5网络的S4层池化层
池化大小:2×2
池化步长:2
paddle源码:
self.s4 = Pool2D(pool_size=2, pool_type='max', pool_stride=2)
- LENET-5网络的C5层
卷积核大小:5*5
卷积核数目:120
卷积步长:1
输入通道数:16
paddle源码:
self.c5 = Conv2D(16,120,5,1)
- LENET-5网络的F6层
全连接层输入:120
全连接层输出:84
paddle源码:
self.f6 = Linear(120, 84, act='relu')
- LENET-5网络的OUTPUT层
全连接层输入:84
全连接层输出:0
paddle源码:
self.f7 = Linear(84, 10, act='softmax')
- 前向传播模型构建
x = fluid.layers.reshape(x, shape=[-1, 120])
在卷积层和全连接层间有一个过度,C5层的输出是120×1×1的,相当于是一维的,所以这里要做一个reshape,reshape中的-1参数表示设置为一维,120就是输入的通道数。
4.1.4训练网络工作的分析和设计
训练网络工作中,我们共有10个步骤分别为:模型实例化、训练模式、选用优化器、控制迭代次数、遍历训练集、进行预测、计算loss值、执行反向网络、优化loss值、保存模型。
首先,对模型实例化。我们进入训练模式。选用sgd优化器,设置迭代次数去遍历测试集。首先先将图像压缩成32*32的格式,开始训练最后我们计算模型的loss率来取平均数,通过飞浆提供的最小化参数去优化loss值,直到迭代结束保存模型。
with fluid.dygraph.guard():
model = MyLeNet() # 模型实例化
model.train() # 训练模式
opt = fluid.optimizer.SGDOptimizer(learning_rate=0.01,
parameter_list=model.parameters()) # 优化器选用SGD随机梯度下降,学习率为0.001.
# fluid.optimizer提供了很多优化器可随机选择
epochs_num = 50 # 迭代次数
# 不宜过大,容易导致过拟合现象《如何调整合理的超参也是深度学习必备的一颗》
for pass_num in range(epochs_num):
for batch_id, data in enumerate(train_reader()):
# 将图片大小处理成3 * 32 × 32的为了与lenet相同
images = np.array([x[0].reshape(3, 32, 32)
for x in data], np.float32)
labels = np.array([x[1] for x in data]).astype('int64')
# 给labels升维度
labels = labels[:, np.newaxis]
# print(images.shape)
# 将Numpy转换为DyGraph接收的输入.该函数实现从numpy.ndarray对象创建一个Variable类型的对象。
image = fluid.dygraph.to_variable(images)
label = fluid.dygraph.to_variable(labels)
predict = model(image) # 预测
# print(predict)
loss = fluid.layers.cross_entropy(predict, label)
avg_loss = fluid.layers.mean(loss) # 获取loss值
# loss值越小 模型精度越高
acc = fluid.layers.accuracy(predict, label) # 计算精度
if batch_id != 0 and batch_id % 50 == 0:
print("train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num, batch_id,
avg_loss.numpy(), acc.numpy()))
avg_loss.backward() # 使用backward()方法可以执行反向网络
# 只有进行反向传播才可以优化网络,调整参数
# 调用定义的优化器对象的minimize方法进行参数更新(最小化这个loss)
opt.minimize(avg_loss)
model.clear_gradients() # 每一轮参数更新完成后我们调用clear_gradients()来重置梯度,以保证下一轮的正确性
fluid.save_dygraph(model.state_dict(), 'MyLeNet') # 保存模型
4.1.5模型评估工作的分析和设计
模型评估工作中,我们共有5个步骤分别为:加载模型、加载模型参数、评估模式、使用测试集评估、计算平均准确率。
首先,直接使用fluid.load_dygraph读取我们的模型,并对模型实例化。我们进入评估模式。去遍历测试集。首先先将图像压缩成32*32的格式,开始评估最后我们计算模型的正确率来测试模型的精度。
with fluid.dygraph.guard():
accs = []
# 加载模型
model_dict, _ = fluid.load_dygraph('MyLeNet')
model = MyLeNet()
model.load_dict(model_dict) # 加载模型参数
model.eval() # 评估模式
for batch_id, data in enumerate(test_reader()): # 测试集
images = np.array([x[0].reshape(3, 32, 32)
for x in data], np.float32)
labels = np.array([x[1] for x in data]).astype('int64')
labels = labels[:, np.newaxis]
image = fluid.dygraph.to_variable(images)
label = fluid.dygraph.to_variable(labels)
predict = model(image)
acc = fluid.layers.accuracy(predict, label)
accs.append(acc.numpy()[0])
avg_acc = np.mean(accs)
print(avg_acc)
图4.3.2 模型预测结果截图
更多项目:
另有10000+份项目源码,项目有java(包含springboot,ssm,jsp等),小程序,python,php,net等语言项目。项目均包含完整前后端源码,可正常运行!
!!! 有需要的小伙伴可以点击下方链接咨询我哦!!!