正文
对于许多人,尤其是理工生来说,乐高积木可以算是童年最美好的记忆之一了。那五颜六色的基础版块,层出不穷的创意,对于一个孩子来说,可谓极限是由想象力决定的!
其实,还有很多人已经把玩乐高的习惯带进了成年生活,尤其是在国外。
我们今天要说的主人公,科技咨询大牛Jacques Mattheij正是一位这样的“大玩家”。刚入坑后不久,由于在Ebay上盲目参与了数个散装乐高积木的竞拍,他有一天早上醒来突然发现,竟然购买了总共2吨的散装乐高。
图丨2吨乐高是什么概念呢?DT君没有称过,大约就是堆积成山吧
面对着2 吨未分类、混装的积木,Mattheij肯定不能把它们就那样放那儿。但是人工分类却是完全不可能的(一个乐高积木平均重量是5克,2吨就是40万个积木)。所以,作为技术大牛的Mattheij选择使用科技的力量。
首先,他需要搭建一个分拣装置。这部分虽然有些难度,但其实技术含量不高:一个皮带会把积木从盒子里带到传送带上;传送带上一个个的将积木带到一台与电脑连接的摄像头前进行识别;被识别后,一个气枪将会把积木吹到对应的箱子里。
图丨乐高积木传送装置
图丨乐高积木的吹气分类装置
在Mattheij的系统中,最难的步骤当然要属“识别”。他首先需要攻克的甚至都不是算法,而是如何准确的把积木给拍摄下来。比如有些积木会因为过长过大而不能被一次性拍下来;有些积木的颜色与背景太相似等等。他在花费了好几周时间调试图像的自动缝合剪裁程序后,终于可以把所有种类的积木完整拍摄出来。
图丨这张积木的图片是由两张照片缝合而成
至于最难的识别算法,Mattheij进行了多种尝试。他首先采取了OpenCV的机器视觉库。通过轮廓匹配以及检测,他的识别系统可以分辨基础积木之间的区别,但是却达不到更加细致的识别了。
所以,他下一步尝试的是贝叶斯分类(Bayesian classification):他选择了一些可以区分积木的特征,并把它们编写成了检测软件。他所列出的18个特征包括了高度,是否有洞,以及有几个可见的柱子等。不过,虽然这个识别软件有着极高的精准度,它却有个致命的缺陷:速度。这款识别系统跟不上传送装置的速度!
在努力了6个月,进行了多次失败的尝试之后,Mattheij终于祭出了大杀器:神经网络。他使用了TensorFlow作为算法库,并且为了提高性能,选择使用他的Nvidia GTX 1080 TI 显卡(GPU)作为计算资源。
对TensorFlow稍微有些了解的读者应该知道,它学起来简直反人类。但是,它强大的功能使它极其受欢迎,因此,网上有不少帮助初学者使用TensorFlow的资源。Mattheij正是使用了其中之一的Keras:一个Python的语言库,来作为TensorFlow的Wrapper,降低其使用难度。
在创建完神经网络之后,Mattheij所面临的新问题就是如何找到一个足够大的数据集来训练它分辨超过1000种乐高积木。据他计算,自己手动对积木一一进行拍照标签,慢慢的建成自己的数据集将会耗费超过6个月的时间,而这还是最乐观的计算。
但是他为什么要自己手动搭建训练数据集呢?他的神经网络可以自己对积木图片打上标签。而他只需要把错误的标签改正,让机器学会就好。
随着神经网络的学习,它出错的次数也越来越少。Mattheij的原始训练集是500张人工标签的积木照片。在使用这些照片训练神经网络后,它在首日分辨了2000个积木,其中大约一半是错误的,被手动纠正。而这2500个积木又成为了新的训练集。在第二天,其分辨了4000个积木,准确率高达90%,所以Mattheij只需要手动再改正400个积木的标签。就这样,在2周之后,他的数据集已涨到2万张标记的图像。
图丨神经网络分辨器
由于有些类型的积木比较罕见,所以它们在数据集中只占极小的比例。对此,Mattheij需要手动增加这类积木的数量,比如把所有这类积木找出来,进行分类。他表示,一旦这个系统可以可靠的分辨所有类型的乐高,他将开始挖掘他那重达2吨的“乐高矿”。
-End-