基于TensorFlow和Keras的垃圾分类系统
1、data_gen.py用于数据生成 2、models.py曾使用过的模型 3、train.py用于模型的训练 4、predict.py用于模型可视化预测(tf>=2.0) 5、kaggle_submit.py最终kaggle上的提交源码。 6、history为历史模型的History(loss,acc)
如今,垃圾分类已成为社会热点话题。其实在2019年4月26日,我国住房和城乡建设部等部门就发布了《关于在全国地级及以上城市全面开展生活垃圾分类工作的通知》,决定自2019年起在全国地级及以上城市全面启动生活垃圾分类工作。到2020年底,46个重点城市基本建成生活垃圾分类处理系统。[1]
基于深度学习设计一款垃圾分类识别程序。通过对垃圾进行拍照对垃圾图片进行快速识别分类,通过查询垃圾分类规则,输出该垃圾图片中物品属于的种类。
图 SEQ 图 \* ARABIC 1 https://www.kaggle.com/asdasdasasdas/garbage-classification
1、使用keras的ImageDataGenerator,用以生成一个batch的图像数据,可实时数据增强。
2、应分为训练集(train)与验证集(validation),其中训练集需要进行数据增强。
3、ImageDataGenerator.flow_from_directory(directory)进行文件流的读取,从中产生batch数据。
4、图像归一化、随机旋转、随机水平翻转、随机垂直翻转、随机投影变换等。
在人脑视觉机理:从原始信号, 做低级抽象,逐渐向高级抽象迭代下,提出深度学习。
深度学习可通过学习一种深层非线性网络结构,实现复杂函数逼近,表征输入数据分布式表示,并展现了强大的从少数样本集中学习数据集本质特征的能力。
图 SEQ 图 \* ARABIC 2 model2网络架构图
1、进行Convolution2D,进行局部特征提取;
2、Pooling降低图片的空间尺寸,增大卷积核感受野,提取更抽象(高层)特征,预防过拟合;
3、重复1、2三次,其中使用不同kernel;
4、Flatten-》Dense。“压平”,然后过渡到全连接层。softmax更适合垃圾分类这种多分类。
5、Dropout。模型的参数比较多,尤其是这次垃圾分类的数据样本太少,容易发生过拟合现象,需要适当断开神经网络的连接,减少神经元之间复杂的共适应关系,使得神经元连接的鲁棒性提高;
在多次调整网络架构,使用了不同optimizers时,模型的正确率不能超过80%时,初步分析:
- 扩大训练的数据集和数据增强
- 进行迁移学习
由于在Kaggle上进行测试,数据集固定,不考虑扩大数据集,只能进行数据增强与迁移学习。
在多次测试下,观察其中Model-Loss图,train_loss一直下降,收敛,而valid_loss周期性变动,不收敛,发生震荡,是过拟合的现象,
图 SEQ 图 \* ARABIC 3 验证曲线分析
分析:
- 数据集过小,只有2000张图
- batch_size设置过小
- 没有设置合理Dropout的范围
- epochs设置过小
从Kaggle一篇文章CNN Architectures[2]中的图 SEQ 图 \* ARABIC 4 ,可看到InceptionV3和ResNet50在多分类识别问题上效果比较好,故分别以InceptionV3、ResNet50作为base_model,并载入预训练集,对训练集进行训练。
图 SEQ 图 \* ARABIC 5 多种模型的正确率(来源[2])
图 SEQ 图 \* ARABIC 6 InceptionV3-多分类识别(来源[2])
参考仵赛飞[3]在github上关于「华为云人工智能大赛·垃圾分类挑战杯」比赛的代码,采用了他实验中正确率最高的模型,即使用EfficientNetB5作为base_model,并使用自定义的learning_rate:SGDR余弦退火学习率,进行训练,在华为比赛中最终正确率可达95%左右。
将分别以InceptionV3、ResNet50、EfficientNetB5作为模型的的预训练base_model下,进行参数调整,已获得最好的训练结果。
模型名称 | 主要内容 | epochs | batch_size | validation_score |
---|---|---|---|---|
model1 | (二维卷积、池化层)*3 全连接*2 |
100 | 32 | 0.78 |
model2 | model2基础上增加一个全连接层 在每一个全连接层后Dropout |
100 | 32 | 0.80 |
model3 | finetune-InceptionV3-pretrained | 100 | 32 | 0.80 |
model4 | 在model3基础上 增加Dense的输出维度(512-》1024) 优化器(adam-》nadam) |
100 | 32 | 0.84 |
model5 | 在model4基础上 减少Dropout的断开率(0.05-》0.02) Dense(6-》2) |
500 | 32 | 0.88 |
model4 | 使用model4 | 500 | 100 | 0.92 |
model4 | 使用model4 | 500 | 200 | 0.97 |
model6 | 在model4基础上 增加Dropout(0.05-》0.25) |
500 | 200 | 0.94 |
model7 | finetune-ResNet50-pretrained | 100 | 200 | 0.44 |
model8 | 在model7基础上 增加Dropout(0-》0.5) |
100 | 200 | 0.41 |
model9 | finetune-EffNetB5-pretrained SGDR余弦退火学习率调整 |
16 | 100 | 0.57 |
表 1 主要模型改进 |
图 SEQ 图 \* ARABIC 7 valid组抽取16张图片作为可视化验证
图 SEQ 图 \* ARABIC 8 Log
图 SEQ 图 \* ARABIC 9 无迁移学习下最优模型model2-accuracy
图 SEQ 图 \* ARABIC 10 无迁移学习下最优模型model2-loss
图 SEQ 图 \* ARABIC 11 迁移学习下最终模型model4-accuracy
图 SEQ 图 \* ARABIC 12 迁移学习下最终模型model4-loss
仵赛飞[3]的EfficientNetB5加SGDR余弦退火学习率调整效果并不好,可能是因为对比华为比赛,数据集实在太小。另外仵赛飞的图片增强做得更好,增加了随机crop。
在github上看到华为比赛中有许多人使用ResNet50作迁移学习,加上Shivam Bansal[2]写的文章,也在实验中使用了ResNet50,但效果也不好,甚至没有超过无迁移学习的模型。
图 SEQ 图 \* ARABIC 13 最优模型(Nadam优化器)
最终使用预训练的InceptionV3,在使用Nadam优化器下获得最高正确率97%,
在只有这么少数据的情况下达到97%正确率已经不错,可使用InceptionV3做迁移学习进行华为垃圾分类数据集的测试。
最开始是在github上找有关垃圾分类的源码,发现很多都出自「华为云人工智能大赛·垃圾分类挑战杯」。代码繁杂,而且数据集大,加上本地电脑无法gpu加速,操作起来很困难。为此看了许多文章,碰巧遇上一博主用的Kaggle上的数据,数据量少,而且Kaggle上有gpu加速,很适合学习。随后开通4个kaggle账号,提交不同的模型以获得最优成绩。在慢慢理解验证集曲线后,共跑了17个Version,找到了在InceptionV3迁移学习下的最优模型。
接下来讲继续使用该模型去训练华为比赛的训练集,测试模型的效果。日后有机会在kaggle上参加一些比赛,提升自我。
- 「华为云人工智能大赛·垃圾分类挑战杯」
- Shivam Bansal.CNN Architectures.
https://www.kaggle.com/shivamb/cnn-architectures-vgg-resnet-inception-tl