来源:机械鸡
作者:Jacques Mattheij
本文长度为2300字,建议阅读4分钟
本文教你利用机器识别、搭建神经网络系统等步骤分类乐高积木。
我6岁的时候,叔叔把他的乐高玩具送给了我。作为一个孩子,在那以后的很多年里,我除了玩乐高,几乎没有做其它事。我尝试着用乐高组装各种造型。乐高陪伴我度过了一段相当美好的时光,直到后来才被电子和电脑取代。
乐高玩具在专门的网站上按块售卖,或者成盒成堆的在eBay上销售。我发现整堆没有分类的乐高玩具大概是10欧/千克,一套整合的乐高售价是40欧/千克,而一套稀有组件和乐高机械组(用来组装复杂机械作品的组件)一千克能卖到几百欧元。
很显然,这里存在一个家庭手工市场的机会。人们可以整盒或整堆购买乐高玩具,然后通过手工分类的方法,把它们分成更有价值的组合。
我觉得如果做这件事的话应该会很有趣。
于是睡觉前到eBay上对本地几个正在成堆拍卖的乐高玩具出了价。第二天早上,我一觉醒来,有相当数量的eBay卖家给我发来了交易成功的祝贺邮件。(eBay经验1:如果你赢得了这么多数量的拍卖,说明你确实出价高了。)
这个事情坏的一面是我可能确实买贵了,更糟的是我买的太多了。
当我拿到所有成功拍下的乐高玩具后,我的车库彻彻底底被这些箱子和盒子塞满了——都算起来大约有2吨重。
但这也有好的一面,那就是它确实为我的分类工作提供了足够的动力。但是手工分类的工作并没有正式开始过。在试着分类了几块组件后,我意识到如果依靠人工,需要几辈子的时间才能分完所有这些组件。
电脑技能拯救了我!我决定做一个自动扫描和分类组件的程序解决这个问题。
经过一段时间的尝试后,我发现每一步都有几个需要解决的问题。一些比较明显,一些不太明显。简单总结如下:
从漏斗放入乐高组件出乎意料的困难
我遇到的第一个问题是,把乐高组件从传送带顶部的漏斗里放入出乎意料的困难。重力和传动机器有时候能完美的把乐高组件拼装在一起。我没有找到又宽又深的漏斗,能够防止随机拼接的乐高卡在上面。
因此,我使用一个慢速传送带把连起来的组件从漏斗里拉出来,防止它们进入快速传送带。这个传送带带动组件经过一个价值30美元的放大镜。放大镜通过USB接口和PC相连进行识别。
扫描组件
为了识别组件,首先我不得不为每个组件进行拍照。这个过程充满麻烦。例如,一些组件可能会比图片边框还要长,另外一些组件的颜色和背景非常相像等等。我花费了几周的时间才实现可靠的固定和自动扫描,以便我能够生成完整的乐高组件图片。
识别组件
下面是最困难的部分:识别每个组件。乐高积木有几千种不同的形状和100种颜色(通过问一个人在他的印象中小时候玩的乐高玩具是什么颜色的,能够大概知道这个人的年龄)。除此之外还有一些其它问题需要解决。
筛选假冒的组件:这里面有很多冒牌乐高。冒牌乐高几乎不值钱,如果发现很多冒牌乐高会导致产品大幅度贬值。因此需要在发给客户前,把冒牌货挑出来。
褪色的组件:乐高积木经常是组装起来进行展示。这样很好,但如果展示地点在阳光下,组件就会随着时间慢慢褪色。白色变成黄色,蓝色变成微绿色,红色和黄色褪色等等。如果乐高没有很多的颜色,这很容易识别。但实际上乐高的很多颜色和褪色后的组件很接近。
受损的组件:不是所有的乐高都很结实,一些组件很容易破损,事实上很难发现他们是完好的。如果你不想把损坏的组件发给客户,你需要找到把他们识别和挑选出来的方法。
脏的组件:我买的大部分组件是干净的,但是也有一些看起来像是被当做了生物实验的培养皿或用来做鸟窝…
开始,我想利用OpenCV计算机视觉库对组件进行分类。使用轮廓匹配和圆检测,这个系统可以识别除基础乐高积木的区别,但也仅此而已。
之后我尝试贝叶斯分类器:我选择识别特征,并为其构建软件探测器。我一共选择了18个特征,例如组件重量、是否有洞、可以看到多少凸起等等。
构建和测试探测器花费了相当多的时间,最后我终于成功的实现了以相当高的正确率识别组件。但是系统运行的速度太慢了,无法跟上传送带的速度。经过大约6个月的失败尝试后,我决定试验神经网络。我选择了谷歌大脑团队研发的TensorFlow。TensorFlow可以运行在CPU上,但是为了大幅提升速度,我加入了价值700美元的英伟达显卡GTX1080Ti进行并行运算。
使用TensorFlow需要一个较长的学习曲线。最终我选择了Francois Chollet开发的Keras,一个高级别的Python神经网络框架。Keras像是TensorFlow的外包装,它让TensorFlow变得易用了很多,特别是在看了Jeremy Howard和Rachel Thomas关于机器学习的优秀入门课程后。
我开始热切的构建我的神经网络系统。
几天之内,我用Keras搭建的基于VGG16模型的单一分类器终于开始工作了,并首次处理超过几类组件。
下一步是给我的神经网络设定一个足够大的训练集,大概1000种乐高组件。开始这看似是个不可能完成的任务:我不知道怎样手工拍照和标注足够多的样品。即使是最乐观的估计,也需要我工作6个月或更长时间。
后来我认识到我不需要自己制作全部训练集。机器可以拍照和标注照片。我需要做的是当电脑出错时纠正过来。随着神经网络不断训练,错误越来越少,纠正标注的工作量也随之下降。
第一天我标注了大约500个起始图片,用作训练网络。第二天机器分类了2,000多个组件,其中一半左右标注错误,需要人工纠正。这2,500个图片作为下一轮训练集。之后让机器识别的另外4,000个组件中,90%是正确的!所以我只需要纠正其中的400个图片。两周以后,我已经有了20,000张标注正确的图片。
一些类型的组件在训练集中数量仍然不足,所以我需要增加这些类型的图片。我可能仅仅是标注了含有这些类型组件的一个样品集。一旦软件能够可靠分类我车库中所有类型的组件,我就可以用来分类全部的2吨乐高积木。
把组件放入正确的箱子里
一旦组件被识别,需要从传送带上移至正确的箱子里。这也是一个有趣的问题。经过一些机械推送器的实验后,我的最终方案是在传送带旁边放置一个小喷嘴,并精确地计算从扫描位置到小喷嘴需要多长时间。之后喷嘴在适当的时候喷气,把组件吹入指定的箱子里。
校对:丁楠雅
为保证发文质量、树立口碑,数据派现设立“错别字基金”,鼓励读者积极纠错。
若您在阅读文章过程中发现任何错误,请在文末留言,或到后台反馈,经小编确认后,数据派将向检举读者发8.8元红包。
同一位读者指出同一篇文章多处错误,奖金不变。不同读者指出同一处错误,奖励第一位读者。
感谢一直以来您的关注和支持,希望您能够监督数据派产出更加高质的内容。