前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何构建用于垃圾分类的图像分类器

如何构建用于垃圾分类的图像分类器

作者头像
代码医生工作室
发布2019-06-21 16:58:18
3.2K0
发布2019-06-21 16:58:18
举报
文章被收录于专栏:相约机器人相约机器人

作者 | 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. 下载并提取图像
  2. 将图像组织到不同的文件夹中
  3. 训练模型
  4. 制作并评估测试预测
  5. 后续步骤

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

点击“阅读原文”进入大蛇智能鉴黄世界

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档