【课后作业02】 基于CNN的彩色图片识别(手势识别) 习题答案

作者:欧新宇(Xinyu OU)
开发平台:Paddle 2.1
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
特别注意:本案例使用Paddle 2.1进行开发,但所使用的动态图库函数为Paddle 1.8,这些API将在未来的版本中被废弃。

本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。

最后更新:2021年8月14日


【实验目的】

  1. 学会对下载的数据集进行初步整理,包括处理非法文件名、创建数据列表
  2. 学会将数据集划分为训练集、验证集和测试集
  3. 学会按照神经网络的设计要求创建神经网络类
  4. 学会使用mini-batch方法实现卷积神经网络的训练并进行预测
  5. 学会保存模型,并使用保存的模型进行预测(即应用模型到生产环境)
  6. 学会使用函数化编程方法完成卷积神经网络的训练和测试
  7. 学会在已有代码的基础上完成新任务的迭代

【实验要求】

  1. 所有作业均在AIStudio上进行提交,提交时包含源代码和运行结果
  2. 补全数据集划分代码(Q1-10分
  3. 完成数据预处理代码,(Q2-10分
  4. 完成Cifar10模型初始化定义和前向传输(Q3-20分
  5. 完成模型训练函数的主体部分(Q4-30分
  6. 完成执行主函数的模型实例化和调用(Q5-10分
  7. 完成离线测试的模型载入(Q6-10分
  8. 完成模型推理的代码(Q7-10分

【实验一】 数据集准备

实验摘要: 对于模型训练的任务,需要数据预处理,将数据整理成为适合给模型训练使用的格式。手势识别是一个简单的多分类的任务,数据集中有10个不同的手势,总共2062张图片,包含从0-9,A-Z,以及各省简称的图片。每个图片都是100×100的彩色图像,我们需要将图片读入,并按照7:1:2划分训练集、测试集和测试集。

实验目的:

  1. 学会观察数据集的文件,并实现基本的数据清理方法,包括删除无法读取的样本、处理冗长不合规范的文件命名等
  2. 能够按照训练集、验证集、训练验证集、测试集四种子集对数据集进行划分,并生成数据列表
  3. 能简单展示和预览数据的基本信息,包括数据量,规模,数据类型和位深度等

1.1 数据集介绍

手势识别 数据集是由土耳其一所中学制作,数据集由Data文件夹中的训练验证数据Infer文件夹中的预测数据组成,包含0-9共10种数字的手势。以下为该数据集的官方描述:

This dataset is prepared by Turkey Ankara Ayrancı Anadolu high school students.
Image size: 100 x 100 pixels
Color space: RGB
Number of classes: 10 (Digits: 0-9)
Number of participant students: 218
Number of samples per student: 10
Dataset Url:https://github.com/ardamavi/Sign-Language-Digits-Dataset

Ch02ex01

数据集下载:https://aistudio.baidu.com/aistudio/datasetdetail/54000

Q1: 补全下列代码,实现将数据集按照7:1:2的比例分为训练集train, 验证集val 和测试集test(10分) ([Your codes 1])

【实验二】 全局参数设置及数据准备

实验摘要: 基于CNN的彩色图片识别是一种多分类问题,本项目使用CIFAR-10网络作为CNN模型对手势识别图片进行分类。实验二通过PaddlePaddle构造一个CIFAR10卷积神经的网络,最后一层采用Softmax激活函数完成分类任务。

实验目的:

  1. 学会使用配置文件定义全局参数
  2. 学会设置和载入数据集
  3. 学会对输入样本进行基本的预处理
  4. 学会定义可视化函数,可视化训练过程

2.1 导入依赖及全局参数设置

Q2:完成数据预处理部分代码(10分) ([Your codes 2])

要求:

2.3 设置训练和测试数据提供器

对于要使用的所有数据均需要设置数据提供器,本例我们给出基于训练集、验证集和测试集和训练验证集划分的设置。

2.4 定义过程可视化函数

定义训练过程中用到的可视化方法, 包括训练损失, 训练集批准确率, 测试集准确率. 根据具体的需求,可以在训练后展示这些数据和迭代次数的关系. 值得注意的是, 训练过程中可以每个epoch绘制一个数据点,也可以每个batch绘制一个数据点,也可以每个n个batch或n个epoch绘制一个数据点.

【实验三】 模型训练与评估

实验摘要: 基于CNN的彩色图片识别是一种多分类问题,本项目使用CIFAR-10网络作为CNN模型对手势识别图片进行分类。实验二通过PaddlePaddle构造一个CIFAR10卷积神经的网络,最后一层采用Softmax激活函数完成分类任务。

实验目的:

  1. 掌握卷积神经网络的构建和基本原理
  2. 深刻理解训练集、验证集、训练验证集及测试集在模型训练中的作用
  3. 学会在线测试和离线测试两种测试方法

3.1 配置网络

3.1.1 网络拓扑结构图

Ch04assign002CIFAR10

3.1.2 网络参数配置表

将网络结构图转换为配置及参数表如下。

Layer Input Kernels_num Kernels_size Stride Padding PoolingType Output Parameters
Input 3×32×32 3×32×32
Conv1 3×32×32 32 3×5×5 1 0 32×28×28 (3×5×5+1)×32=2432
Pool1 32×28×28 32 32×2×2 2 0 Max 32×14×14 0
Conv2 32×14×14 32 32×5×5 1 0 32×10×10 (32×5×5+1)×32=25632
Pool2 32×10×10 32 32×2×2 2 0 Avg 32×5×5 0
Conv3 32×5×5 64 32×4×4 1 0 64×2×2 (32×4×4+1)×64=32832
Pool3 64×2×2 64 64×2×2 2 0 Avg 64×1×1 0
FC1 (64×1×1)×1 64×1 (64+1)×64=4160
FC2 64×1 64×10 (64+1)×10=650
Output 10×1
Total = 65706

Q3: 根据Cifar10拓扑结构图和网络参数配置表完成下列Cifar10模型的类定义(20分) ([Your codes 3~4])

3.1.4 输出网络各层的超参数

3.2 模型训练及评估

3.2.1 定义测试函数

Q4. 完成下列模型训练函数的主体部分(30分) ([Your codes 5])

Q5. 完成主函数的定义(10分) ([Your codes 6])

要求:

Q6. 完成离线测试的模型载入代码(10分) ([Your codes 7])

【实验四】 模型预测(应用)

实验摘要: 对训练过的模型,我们通过测试集进行模型效果评估,并可以在实际场景中进行预测,查看模型的效果。

实验目的:

  1. 掌握模型转换与推理

4.1 导入依赖库及全局参数配置

4.2 获取待预测数据

注意:数据预处理应该将样本压缩至模型输入的尺寸

Q7. 完成模型推理的代码(10分) ([Your codes 8])

要求: