homework for ZJU: https://mo.zju.edu.cn/homework/zju_ai_2020_ss
1. 实验介绍
1.1 实验背景
自今年 7 月 1 日起,上海市将正式实施 《上海市生活垃圾管理条例》。
垃圾分类,看似是微不足道的“小事”,实则关系到13亿多人生活环境的改善,理应大力提倡。
垃圾识别分类数据集中包括玻璃 (glass) 、硬纸板 (cardboard) 、金属 (metal) 、纸 (paper) 、塑料 (plastic) 、一般垃圾 (trash) ,共6个类别。
生活垃圾由于种类繁多,具体分类缺乏统一标准,大多人在实际操作时会“选择困难”,基于深度学习技术建立准确的分类模型,利用技术手段改善人居环境。
1.2 实验要求
a)建立深度神经网络模型,并尽可能将其调到最佳状态。
b)绘制深度神经网络模型图、绘制并分析学习曲线。
c)用准确率等指标对模型进行评估。
1.3 实验环境
可以使用基于 Python 的 OpenCV 库进行图像相关处理,使用 Numpy 库进行相关数值运算,使用 Keras 等框架建立深度学习模型等。
2.实验内容
2.1 介绍数据集
该数据集包含了 2307 个生活垃圾图片。数据集的创建者将垃圾分为了 6 个类别,分别是:
序号 | 中文名 | 英文名 | 数据集大小 |
---|---|---|---|
1 | 玻璃 | glass | 457 |
2 | 纸 | paper | 540 |
3 | 硬纸板 | cardboard | 370 |
4 | 塑料 | plastic | 445 |
5 | 金属 | metal | 380 |
6 | 一般垃圾 | trash | 115 |
- 物品都是放在白板上在日光/室内光源下拍摄的,压缩后的尺寸为 512 * 384
2.2 图片预处理
图片生成器 ImageDataGenerator: keras.preprocessing.image 模块中的图片生成器,主要用以生成一个 batch 的图像数据,支持实时数据提升。训练时该函数会无限生成数据,直到达到规定的 epoch 次数为止。同时也可以在 batch 中对数据进行增强,扩充数据集大小,增强模型的泛化能力,比如进行旋转,变形,归一化等等。
图片生成器的主要方法:
-
fit(x, augment=False, rounds=1):计算依赖于数据的变换所需要的统计信息(均值方差等)。
-
flow(self, X, y, batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix=’’, save_format=‘png’):接收 Numpy 数组和标签为参数,生成经过数据提升或标准化后的 batch 数据,并在一个无限循环中不断的返回 batch 数据。
-
flow_from_directory(directory): 以文件夹路径为参数,会从路径推测 label,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生 batch 数据。
根据上面的介绍和我们数据集的特性,我们主要运用
ImageDataGenerator()
和flow_from_directory()
方法。我们将数据处理过程封装成为一个函数:
1 | # 导入图片生成器 |
2.3 采用 Keras 建立一个简单的深度神经网络模型
通过 Keras 构建深度学习模型的步骤如下:
1. 定义模型——创建一个模型并添加配置层
Keras 的核心数据结构是 model,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。
- 方式一: 使用 .add() 方法将各层添加到模型中
1 | # 方式一: 使用 .add() 方法将各层添加到模型中 |
-
方式二:网络层实例的列表构建序贯模型
1
2
3
4
5
6
7
8
9
10
11
12
13# 方式二:网络层实例的列表构建序贯模型
# 导入相关的包
from keras.models import Sequential
from keras.layers import Dense, Activation
# 选择模型,选择序贯模型(Sequential())
# 通过将网络层实例的列表传递给 Sequential 的构造器,来创建一个 Sequential 模型
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu')
])
# 打印模型概况
model.summary() -
方式三:函数式模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 方式三:函数式模型
# 导入相关的包
from keras.layers import Input, Dense,Activation
from keras.models import Model
# 输入层,返回一个张量 tensor
inputs = Input(shape=(784,))
# 全连接层,返回一个张量
output_1 = Dense(32)(inputs)
# 激活函数层
predictions= Activation(activation='relu')(output_1)
# 创建一个模型,包含输入层、全连接层和激活层
model = Model(inputs=inputs, outputs=predictions)
# 打印模型概况
model.summary()
2. 编译模型——指定损失函数和优化器,并调用模型的 compile() 函数,完成模型编译。
1 | # 导入相关包 |
3. 训练模型——通过调用模型的 fit() 函数来训练模型。
1 | # 开始时间 |
- 查看模型训练效果
1 | def plot_training_history(res): |
4. 模型预测——调用模型的 evaluate()或者 predict() 等函数对新数据进行预测。
1 | def load_and_model_prediction(validation_generator): |
(预测可视化):
1 | from keras.models import load_model |
5. 使用模型
1 | import os |
Mycode
编写 数据处理、创建模型、训练模型、保存模型 和 评估模型 等部分的代码
完成模型
1 | def processing_data(data_path): |
模型预测
1 | from keras.models import load_model |
Mo项目上代码-> accuracy为56%
1 | import torch |
VGG16代码:accurary:92%
1 | ############################################################################### |
VGG16说明:https://baijiahao.baidu.com/s?id=1667221544796169037&wfr=spider&for=pc
附录
CSDN
Github
Author: Mrli
Link: https://nymrli.top/2020/12/11/浙大2020春夏-人工智能习题2——垃圾分类/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.