基于深度学习的图像分类(Classification)

作者:欧新宇(Xinyu OU)

本文档所展示的测试结果,均运行于:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。

最后更新:2021年3月6日


本教案以蝴蝶数据集为例进行介绍。

一、基于深度学习的图像分类的基本代码框架图

基于深度学习的图像分类包括很多实现的代码,有些是通用的,例如日志文件,绘图文件;有些是属于工程性的,例如数据准备文件;也有一部分是项目私有代码,例如配置文件。

Lec02_03CodesArchitecture

二. 数据准备和数据预处理

1. 数据准备:主要任务是将下载(收集)好的数据进行初步准备,包括数据清洗数据标注数据列表的生成。其中,

所有的数据集都按照工程习惯生成四个数据集,具体包括:

  1. 一般来说,训练集和验证集都是训练模型时的训练数据,其中训练集用于模型训练,验证集用于超参数评估。为了更好地完成超参数的选择,通常会将原始的训练集分割成训练集验证集;并进行模型训练,在完成超参数选择后,再将训练集验证集合并在一起后,进行统一训练。
  2. 测试集在很多情况下是没有标注的,并且测试集也不应该被用来参与模型参数的选择,只能在模型训练好,进行一次性的结果输出或性能评估。

2. 数据预处理:数据预处理主要负责实现数据的增广、通道变化、归一化、数据批次划分等,对于训练数据可能会包含多种数据增广操作,对于测试数据则一般只包含十重切割。

3. 数据读取:主要任务将读入的数据进行封装,并送入训练或预测代码

数据准备和数据预处理(图像增广)的相关知识和代码可以参考: [数据准备] [图像增广]

三. 全局配置(config)

全局配置是每个项目的私有代码,包括项目的各种参数,路径和初始化

四. 日志输出(logger)和可视化(draw)

  1. 日志输出是指将训练所涉及的各种参数信息、模型信息和训练过程参数进行输出保存,一般使用logger库完成。

  2. 可视化的目的是为了辅助、监控和调优训练过程,一般有三种方法:

    1. 收集训练过程中的运行结果进行可视化。目前本课程主要采取该方法,优点是清晰、简介;缺点是不灵活,必须在训练结束之后才能输出可视化。
    2. 调用logger输出的日志进行可视化。优点,可实时输出可视化结果。
    3. 调用开放平台的第三方可视化工具,例如:Paddle VisualDL, Tensorflow Board,优点是功能强大。

五. 优化器设置(optimize)

优化器设置主要包括优化算法和学习率设置,常见的优化算法包括:Momentum, RMS, SGD, Adam; 常见的学习率包括:PiecewiseDecay, CosinaAnealingDecay, ExponentialDecay, PolynomialDecay, 以及固定学习率。

该部分的技术文档将在后续推出,或请大家自行Baidu.

下面的代码将实现以上叙述的多种学习率和优化算法,并可根据config文件进行配置和调用。

六. 模型训练

深度学习的训练一般包括四种模式:

模型训练,可以生产两种模型:

七. 验证集评估

验证集评估可以使用调优模型,也可以使用部署模型,但是为了方便代码重用,建议直接使用调优模型。因为基于调优模型的验证集评估的代码,可以被训练代码共用,从而减少代码量。

八. 测试集评估和预测结果输出

对于测试集的处理,一般包含两个部分:

1. 测试集评估

2. 样本预测

四、实验结果及评价

下面我们将在ResNet50, VGG16和Mobilenetv2三个数据集对蝴蝶数据集进行评估,所有的测评结果均基于包含67张图片的验证集完成。
蝴蝶数据集包含7个类,其中训练集423, 验证集67, 测试集129。

模型名称 Baseline模型 ImageNet预训练 learning_rate best_epoch top-1 acc top-5 acc loss 单batch时间/总训练时间(s) 可训练参数/总参数
Butterfly_ResNet50_pretrained ResNet50 0.01 7/10 0.98507 1.00000 0.00140 0.57/51.79 23,469,255/23,575,495
Butterfly_ResNet50_without_pretrained ResNet50 0.01 38/50 0.80597 0.98507 0.0603 0.57/249.99 23,469,255/23,575,495
Butterfly_VGG16_pretrained VGG16 0.001 5/10 0.94030 1.00000 0.00323 0.78/165.53.5 134,289,223/134,289,223
Butterfly_VGG16_without_pretrained VGG16 0.001 33/50 0.77612 1.00000 0.01234 0.78/618.06 134,289,223/134,289,223
Butterfly_Mobilenetv2_pretrained Mobilenetv2 0.01 7/10 0.97015 1.00000 0.00295 0.38/33.26 2,198,727/2,266,951
Butterfly_Mobilenetv2_without_pretrained Mobilenetv2 0.01 50/50 0.88060 0.98507 0.00829 0.38/151.35 2,198,727/2,266,951

从实验结果可以得到以下几个结论:

  1. 基于Imagenet预训练模型的微调训练(finetune)比从头训练要更快收敛,并且更容易获得较好的性能
  2. VGG16因为参数较多,因此被应用到简单的蝴蝶数据集时更容易发生过拟合,训练起来更困难
  3. VGG16模型因为参数较多,且没有类似残差结构的辅助,需要更低的学习率来进行训练
  4. 参数的数量训练时间有较大的影响
  5. 从损失loss和精确度来看,三个没有使用Imagenet预训练参数的模型都还有上升的空间,即都还没有完全收敛。也证明了迁移学习在计算机视觉任务中的作用明显
  6. 同一种模型的参数数量是固定的,主要由其卷积层、全连接层等内部结构决定
  7. 由于任务比较简单,三种模型的top5精度都比较高,说明模型的判别能力还是不错的
  8. 总体里看,ResNet50的性能要优于VGG16,但总体上和Mobilenet v2相当。一方面可能是因为任务比较简单,另一方面也体现了Mobilenetv2的性能是可观的,此外Mobilenetv2只有ResNet50模型10%的参数量,使其更适合部署在移动设备上

值得注意的是,由于数据集比较简单,参数的初始化以及随机梯度下降算法对于训练的过程影响比较大。即每次训练的过程(甚至结果)可能会有一定的波动,但较好的超参数设置仍然有助于获得较好的性能。