作者 | Collin Ching
来源 | Towards Data Science
编辑 | 代码医生团队
为何要垃圾分类?
当垃圾处理不当时,就会发生回收污染 - 比如回收带有油的披萨盒。或者当垃圾被正确处理但准备不当时 - 如回收未经冲洗的果酱罐。
污染是回收行业中的一个巨大问题,可以通过自动化垃圾分类来减轻污染。尝试原型化图像分类器来分类垃圾和可回收物 - 这个分类器可以在光学分拣系统中应用。
构建图像分类器
训练一个卷积神经网络,用fastai库(建在PyTorch上)将图像分类为纸板,玻璃,金属,纸张,塑料或垃圾。使用了由Gary Thung和Mindy Yang手动收集的图像数据集。在此处下载其数据集,然后将其移至与笔记本相同的目录中。(注意:需要使用GPU来加速训练。)
https://github.com/garythung/trashnet/blob/master/data/dataset-resized.zip
https://github.com/collindching/Waste-Sorter
建模管道:
1.提取数据
首先需要提取“dataset-resized.zip”的内容。
从zip文件中提取图像的代码
解压缩后,数据集调整大小的文件夹有六个子文件夹:
忽略.DS_Store
2.将图像组织到不同的文件夹中
现在已经提取了数据,把图像分成训练,验证和测试图像文件夹,分成50-25-25。定义了一些帮助快速构建它的函数,可以在笔记本中查看。
https://nbviewer.jupyter.org/github/collindching/Waste-Sorter/blob/master/Waste%20sorter.ipynb
接下来,将根据ImageNet目录约定创建一堆目标文件夹。这意味着它将有一个包含三个子文件夹的外部文件夹(称之为数据):训练,验证和测试。在每个文件夹中,有一个名为纸板,玻璃,金属,纸张,塑料和垃圾的文件夹。
ImageDataBunch.from_folder()指定将从ImageNet结构中的文件夹中提取训练,验证和测试数据。
批量大小bs是一次训练的图像数量。如果计算机内存较少,请选择较小的批处理大小。
可以使用get_transforms()函数来扩充数据。
以下是数据的示例:
优秀的垃圾照片
3.模型训练
在一行代码中指定CNN
什么是resnet34?
残余神经网络是具有许多层的卷积神经网络(CNN)。特别是resnet34是一个CNN,在ImageNet数据库上预先训练了34层。预训练的CNN在新的图像分类任务上表现更好,因为它已经学习了一些视觉特征并且可以将这些知识迁移(因此迁移学习)。
由于它们能够描述更多的复杂性,因此理论上深度神经网络在训练数据上应该比浅层网络表现更好。但实际上,深度神经网络在经验上往往比浅层神经网络差。
创建了Resnets以使用称为快捷方式连接的黑客来规避这个故障。如果图层中的某些节点具有次优值,则可以调整权重和偏差; 如果节点是最优的(其残差为0),为什么不单独留下?仅根据需要对节点进行调整(当存在非零残差时)。
需要调整时,快捷方式连接应用标识功能将信息传递给后续层。这在可能的情况下缩短了神经网络,并允许resnet具有深层体系结构,并且更像浅层神经网络。resnet34中的34只是指层数。
找到学习率
找到梯度下降的学习率,以确保神经网络合理快速收敛而不会错过最佳误差。
学习速率发现者建议学习率为5.13e-03。有了这个可以训练模型。
训练
验证集训练结果
模型运行了20个时期。这种拟合方法的优点在于学习率随着每个时期而降低,能够越来越接近最佳状态。在8.6%时,验证错误看起来非常好......看看它如何对测试数据执行。
首先可以看看哪些图像分类错误。
可视化大多数不正确的图像
回收装置表现不佳的图像实际上已经降级了。看起来这些照片曝光太多,所以这实际上并不是模型的错!
这种模式经常混淆玻璃塑料和玻璃混淆金属。最困惑的图像列表如下。
4.对测试数据做出新的预测
要了解此模式的实际执行情况,需要对测试数据进行预测。首先将使用learner.get_preds()方法对测试数据进行预测。
注意: learner.predict()仅预测单个图像,而learner.get_preds()预测一组图像。强烈建议您阅读文档以了解有关predict()和get_preds()的更多信息。
get_preds(ds_type)中的ds_type参数采用DataSet参数。示例值是DataSet.Train,DataSet.Valid和DataSet.Test。之所以提到这一点是因为错误地传递了实际数据(learn.data.test_ds),它给了错误的输出并且花了很长时间来调试。
不要犯这个错误!不传递数据 - 传入数据集类型!
这些是每个图像的预测概率。该张量有365行 - 每个图像一个 - 和6列 - 每个材料类别一个。
现在要将上面张量中的概率转换为预测类名的向量。
这些是所有图像的预测标签!检查第一张图像是否真的是玻璃。
接下来将从测试数据集中获取实际标签。
看起来前五个预测相匹配!
这个模型如何整体表现?可以使用混淆矩阵来找出答案。
测试混淆矩阵
混淆矩阵数组
打算让这个矩阵更漂亮一点:
同样,该模型似乎混淆了金属玻璃和塑料玻璃。有了更多的时间,相信进一步的调查可以帮助减少这些错误。
最终在测试数据上获得了92.1%的准确度,这非常棒 - TrashNet数据集的原始创建者在70-30测试训练拆分中使用支持向量机实现了63%的测试精度(训练了神经网络以及27%的测试精度)。
5.后续步骤
如果有更多的时间,会回去减少玻璃的分类错误。还会从数据集中删除过度曝光的照片,因为这些图像只是坏数据。
这只是一个快速而肮脏的迷你项目,表明训练图像分类模型的速度非常快,但是使用fastai库创建最先进的模型的速度非常快。
这个项目的Github。
https://github.com/collindching/Waste-Sorter
关于图书
《深度学习之TensorFlow:入门、原理与进阶实战》和《Python带我起飞——入门、进阶、商业实战》两本图书是代码医生团队精心编著的 AI入门与提高的精品图书。配套资源丰富:配套视频、QQ读者群、实例源码、 配套论坛:http://bbs.aianaconda.com 。更多请见:https://www.aianaconda.com
点击“阅读原文”进入大蛇智能鉴黄世界
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有