【竞赛一】垃圾分类(Garbage Classification) Baseline

作者:欧新宇(Xinyu OU)
开发平台:Paddle 2.1
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti

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

最后更新:2021年8月23日


所有作业均在AIStudio上进行提交,提交时包含源代码和运行结果

【任务描述】

近年来,随着人工智能的发展,其在语音识别、自然语言处理、图像与视频分析等诸多领域取得了巨大成功。随着政府对环境保护的呼吁,垃圾分类成为一个亟待解决的问题,本次竞赛将聚焦在垃圾图片的分类,利用人工智能技术,对居民生活垃圾图片进行检测,找出图片中有哪些类别的垃圾。 要求参赛者基于Paddle,给出一个算法或模型,对于给定的图片,检测出图片中的垃圾类别。给定图片数据,选手据此训练模型,为每张测试数据预测出最正确的类别。

【数据说明】

本竞赛所用训练和测试图片均来自生活场景。总共四十个类别,类别和标签对应关系在训练集中的dict文件里。图片中垃圾的类别,格式是“一级类别/二级类别”,二级类别是具体的垃圾物体类别,也就是训练数据中标注的类别,比如一次性快餐盒、果皮果肉、旧衣服等。一级类别有四种类别:可回收物、厨余垃圾、有害垃圾和其他垃圾。

数据文件包括训练集(有标注)和测试集(无标注),训练集的所有图片分别保存在train文件夹下面的0-39个文件夹中,文件名即类别标签,测试集共有400张待分类的垃圾图片在test文件夹下。

class_dict

【分数评定】

  1. 所有奖励分数均叠加到期末总成绩中
  2. 所有参与竞赛者,奖励1分
  3. 最分数评定高于Baseline的成绩,奖励2分
  4. 额外奖励:第一名奖励10分,第二名奖励7分,第三名奖励5分
  5. 竞赛成果应用到学科(互联网+)竞赛,获奖队伍所有成员奖励20分(校级以上,不含校级)

【提交答案】

  1. 所有内容均在AIStudio上进行提交,提交时包含源代码和运行结果
  2. 提交完整程序代码,包括运行过程
  3. 提交结果文件。结果文件为.txt 文件格式,命名为model_result.txt,文件内的字段需要按照指定格式写入。
    • 每个类别的行数和测试集原始数据行数应一一对应,不可乱序。
    • 输出结果应检查是否为400行数据,否则成绩无效。
    • 输出结果文件命名为model_result.txt,一行一个类别标签(数字) 样例如下:

···
35
3
2
37
10

【参考代码】

一、生成图像数据列表

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

2.2 数据集定义及数据预处理

在Paddle 2.0+ 中,我们可使用paddle.io来构造标准的数据集类,用于通过数据列表读取样本,并对样本进行预处理。全新的paddle.vision.transforms可以轻松的实现样本的多种预处理功能,而不用手动去写数据预处理的函数,这大简化了代码的复杂性。

代码最后给出了该了简单测试,输出两种不同模式的样本,进行数据预处理和不进行数据预处理。

2.3 设置数据提供器

结合paddle.io.DataLoader工具包,可以将读入的数据进行batch划分,确定是否进行随机打乱和是否丢弃最后的冗余样本。

  1. 一般来说,对于训练样本(包括train和trainvl),我们需要进行随机打乱,让每次输入到网络中的样本处于不同的组合形式,防止过拟合的产生;对于验证数据和测试数据,由于每次测试都需要对所有样本进行一次完整的遍历,并计算最终的平均值,因此是否进行打乱,并不影响最终的结果。
  2. 由于在最终输出的loss和accuracy的平均值时,会事先进行一次批内的平均,因此如果最后一个batch的数据并不能构成完整的一批,即实际样本数量小于batch_size,会导致最终计算精度产生一定的偏差。所以,当样本数较多的时候,可以考虑在训练时丢弃最后一个batch的数据。但值得注意的是,验证集和测试集不能进行丢弃,否则会有一部分样本无法进行测试。

2.4 定义过程可视化函数

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

下面的程序除了实现训练后自动可视化的函数,同时实现将可视化的图片和数据进行保存,保存的文件夹由 final_figures_path 指定。

2.5 定义日志输出函数

logging是一个专业的日志输出库,可以用于在屏幕上打印运行结果(和print()函数一致),也可以实现将这些运行结果保存到指定的文件夹中,用于后续的研究。

三、模型训练与评估

3.1 定义优化方法

3.2 定义验证函数

3.3 模型训练及在线测试

训练完成后,建议将 *ExpResults* 文件夹的最终文件 **copy** 到 *ExpDeployments* 用于进行部署和应用。

3.5 离线测试

注意Garage数据集中的 test 样本未提供 label 信息,因此无法进行准确度评估

【结果分析】

需要注意的是此处的精度与训练过程中输出的测试精度是不相同的,因为训练过程中使用的是验证集, 而这里的离线测试使用的是测试集.

四、模型测试与应用

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

4.2 定义推理时的数据载入和预处理函数

4.3 批量预测与单样本推理

五、实验结果及评价

下面我们将在ResNet50, ResNet18, Mobilenetv2, VGG16四个模型对垃圾分类进行评估,所有模型设置batch_size=64,学习率0.001。所有模型均采用Imagenet预训练模型进行训练,训练集为train。

1. 实验结果

模型名称 Baseline模型 ImageNet预训练 learning_rate best_epoch top-1 acc top-5 acc loss 单batch时间/总训练时间(s) 可训练参数/总参数
Garbage_Resnet18 ResNet18 0.001 10/10 0.75240 0.95679 0.01308 5.48/1172.13 11,172,042/11,191,242
Garbage_Resnet50 ResNet50 0.001 8/10 0.87723 0.98834 0.00697 5.94/1536.76 23,479,500/23,585,740
Garbage_Resnet50 ResNet50 0.01 10/10 0.74211 0.95062 0.01485 8.35/1835.17 23,479,500/23,585,740
Garbage_VGG16 VGG16 0.001 8/10 0.70165 0.94444 0.01514 10.35/2346.10 134,424,424/134,424,424
Garbage_Mobilenetv2 Mobilenetv2 0.001 9/10 0.77572 0.96228 0.01208 6.02/1540.33 2,205,132/2,273,356

2. 结果输出

经过初步训练,在10个epoch下,Resnet50模型具有最好的性能。因此,我们固定所有参数,将训练集改为trainval,同样训练10个周期后停止训练。最终的Baseline模型使用test子集在trainval输出的模型上进行推理。