昇思Mindspore25天学习打卡Day18:基于MobileNet2的垃圾分类
本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。
1 实验目地
- 了解熟悉垃圾分类应用代码的编写(Python语言);
- 了解Linux操作系统的基本使用;
- 掌握atc命令进行模型转换的基本操作
2 MobileNetv2模型原理介绍
MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络,相比于传统的卷积神经网络,MobileNet网络使用深度可分离卷积(Depthwise Separable Convoltion)的思想在准确率小幅度降低的前提下,大大减小了模型参数与运算量,并引入宽度系数 α \alpha α和分辦率系数 β \beta β 使模型满足不同应用场景的需求.
由于MotieNe:网络中Relu激活函数处理低维持征信息时会存在大量的丢失,所以MobieNetV2网络提出使用倒线差结构(invenedresidualblock)和linear Botenecks来设计网络,以提高模型的准确率,且优化后的模型更小。
图中lnvented residualbiock结构是先使用1x1卷积进行升维,然后使用3x3的DepthMise卷积,最后使用1x1的卷积进行降维,与Residualblock结构相反。Residualbloc是先使用1x1的卷积进行降维,然后使用3x3的卷积,最后使用1x1的卷积进行升维。
- 说明:详细内容可参见link:MobileNetV2论文
3 实验环境
本案例支持win_x86和Linux系统,CPU/GPU/Ascend均可运行。
在动手进行实践之前,确保您已经正确安装了MindSpore。不同平台下的环境准备请参考《MindSpore环境搭建实验手册》。
4 数据处理
4.1 数据准备
MobileNetv2的代码默认使用ImageFolder格式管理数据集,每一类图片整理成单独的一个文件夹,数据集结构如下:
|
|–ImageFolder
-
|--train | Class1Folder | ... ... |-- eval Class1Folder ... ...
4.2 数据加载
将模块导入,具体如下:
配置后续训练、验证、推理用到的参数:
数据预处理操作:
利用lmageFolderDataset方法读取垃圾分类数据集,并整体对数据集进行处理。
读取数据集时指定训练集和测法集,首先对整个数据集进行臼一化,修改图像须道等预处理操作。然后对训0练集的数据依次进行RandonCropDecodeResize、RandonHorizontal
Flip, RandonColorAdjust、shuffle操作,以增加训练数据的丰富度;对测试集进行Decode、Resize、CenterCrop等预处理操作;最后返回处理后的数据集。
展示部分处理后的数据:
5 MobileNetV2模型搭建
使用MindSpore定义MobileNetV2网络的各模块时需要继承mindspore.nn.Cell。Cell是所有神经网络(Conv2d等)的基类。
神经网络的各层需要预先在_init_方法中定义,然后通过定义construct方法来完成神经网络的前向构造。原始模型激活函数为ReLU6,池化模块采用是全局平均池化层。
6 MobileNetV2模型训练与测试
训练策略
—般情况下,模型训练时采用静态学习率,如0.01。随着训练步数的增加,模型逐渐趋于收敛,对权重参数的更新幅度应该逐渐降低,以减小模型训练后期的抖动。所以,模型训练时可以采用动态下降的学习率,常见的学习率下降策略有:
- polynomial decay/square decay;
- cosine decay;
- exponential decay;
- stage decay.
这里使用cosine decay下降策略:
在模型训练过程中,可以添加检查点(Checkpoint)用于保存模型的参数,以便进行推理及中断后再训练使用。使用场景如下:
- 训练后推理场景
- 模型训练完毕后保存模型的参数,用于推理或预测操作。
- 训练过程中,通过实时验证精度,把精度最高的模型参数保存下来,用于预测操作。
- 再训练场景
- 进行长时间训练任务时,保存训练过程中的Checkpoint文件,防止任务异常退出后从初始状态开始训练。
- Fine-tuning (微调)场景,即训练一个模型并保存参数,基于该模型,面向第二个类似任务进行模型训练。
这里加载lmageNet数据上预训练的MobileNetv2进行Fine-tuning,只训练最后修改的FC层,并在训练过程中保存Checkpoint。
模型训练与测试
在进行正式的训练之前,定义训练函数,读取数据并对模型进行实例化,定义优化器和损失函数。
首先简单介绍损失函数及优化器的概念:
- 损失函数:又叫目标函数,用于衡量预测值与实际值差异的程度。深度学习通过不停地迭代来缩小损失函数的值。定义一个好的损失函
数,可以有效提高模型的性能。 - 优化器:用于最小化损失函数,从而在训练过程中改进模型。
定义了损失函数后,可以得到损失函数关于权重的梯度。梯度用于指示优化器优化权重的方向,以提高模型性能。
在训练MobileNetV2之前对MobileNetV2Backbone层的参数进行了固定,使其在训练过程中对该模块的权重参数不进行更新;只对MobileNetV2Head模块的参数进行更新。
MindSpore支持的损失函数有SoftmaxCrossEntropyWithLogits、L1L.oss、MSELoss等。这里使用SoftmaxCrossEntropyWithLogits损失函数。
训练测试过程中会打印loss值,loss值会波动,但总体来说loss值会逐步减小,精度逐步提高。每个人运行的loss值有一定随机性,不一定完全相同。
每打印一个epoch后模型都会在测试集上的计算测试精度,从打印的精度值分析MobileNetV2模型的预测能力在不断提升。
7 模型推理
加载模型Checkpoint进行推理,使用load _checkpoint接口加载数据时,需要把数据传入给原始网络,而不能传递给带有优化器和损失函数的训练网络。
8 导出AIR/GEIR/ONNX模型文件 及 打上标签和日期
导出AIR模型文件,用于后续Atlas 200 DK上的模型转换与推理。当前仅支持MindSpore+Ascend环境。