基于深度学习的手势图像识别处理系统 毕业论文+答辩PPT+项目源码及数据库文件

!!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!!

 💕💕作者:优创学社
💕💕个人简介:本人在读博士研究生,拥有多年程序开发经验,辅导过上万人毕业设计,支持各类专业;如果需要论文、毕设辅导,程序定制可以联系作者
💕💕各类成品java系统 。javaweb,ssh,ssm,springboot等等项目框架,源码丰富,欢迎咨询交流。学习资料、程序开发、技术解答、代码讲解、源码部署,需要请看文末联系方式。

目  录

1 题目... 2

2 需求分析... 2

2.1要求... 2

2.2运行环境... 2

2.3开发语言... 2

3 概要设计... 2

3.1系统流程图... 2

3.2函数流程图... 3

4 详细设计... 6

4.1分析和设计... 6

4.2具体代码实现... 13

4.3运行结果... 22

5 课程设计总结... 23

参考文献... 24

1 题目

图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题。手势识别属于图像分类中的一个细分类问题。本课题要求初识深度学习和图像处理技术,利用python语言实现手势识别的实践任务。

2 需求分析

2.1要求

(1)用Python语言实现程序设计;

(2)初识深度学习和图像处理技术;

(3)了解深度神经网络(Deep Neural Networks,简称DNN)相关知识;

(4)【难点】了解LeNet-5 卷积神经网络模型,并进行模型训练;

(5)【难点】调参数、优化,提高测试集准确率;

(6)实现手势识别的功能,程序要有注释。

2.2运行环境

(1)WINDOWS 10系统

(2)Pycharm2020+anaconda3

2.3开发语言

Python

3 概要设计

3.1系统流程图

本课题要求初识深度学习和图像处理技术,利用python语言实现手势识别的实践任务。该任务主要分为两步:模型训练和模型预测,步骤如图3.1.1所示。

图3.1.1 系统流程图

3.2函数流程图

本任务设计第一步是进行模型训练。其主要步骤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 详细设计

4.1分析和设计

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等语言项目。项目均包含完整前后端源码,可正常运行!

!!! 有需要的小伙伴可以点击下方链接咨询我哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优创学社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值