如何用100美元和TensorFlow来造一个能“看”东西的机器人
把深度学习、便宜的硬件和物体识别组合在一起的探奇
编者注:请阅读Aurélien Géron的"Hands-On Machine Learning with Scikit-Learn and TensorFlow来理解构建智能系统的概念和工具。

物体识别是现在机器学习领域的热点之一。相当长的时间里,计算机已经能相当可靠地识别人脸或者猫。但在更大的图片中去识别一个指定的物体还是人工智能领域的“圣杯”。人类的大脑能非常好地识别物体。我们可以毫无困难地把从物体上反射出来的具有不同频率的光子转化为关于我们周边世界的极度丰富的信息集。而机器学习还依然在为了完成这个简单的任务而奋斗。不过近几年,机器学习已经取得了相当不错的进步。

深度学习算法和一个超大的公共训练数据集(称为ImageNet)共同促成了物体识别领域的一系列令人映像深刻的进步。TensorFlow是一个广为人知的框架,它让在多种架构上实现深度学习算法变得很容易。TensorFlow善于利用GPU的运算能力,从而使得它非常适合运行深度学习的算法。

造我自己的机器人

我想造一个能自己识别物体的机器人。多年的开发程序和测试的经验已经把我塑造成了害怕和实际物体打交道。现实世界里,测试一个有缺陷的物理设备可能会把房子烧了,或是烧毁引擎,并让你等很多天才能拿到替换的零件。

Figure_1-1ad2b142be6ca8641212c7579ab4f95d

图1 能识别物体的机器人的架构。图片由Lukas Biewald授权使用

而新的第三代树莓派板是完成这个项目的最佳选择。在亚马孙上它仅售36美元,还带有无线功能、一个四核的CPU、1G的内存。加上一个报价6美元的迷你SD卡就可以载入一个基于DebianRaspberian操作系统。图1显示了所有这些部件是怎么组合在一起的。而图2则是这块板子的照片。

Figure_2-985cd20ea0c0bcd68a7d896f11312edf

图2 运行在我车库里的树莓派板。图片由Lukas Biewald授权使用

我很喜欢SainSmart制造的只用11美元的机器人底盘。这个底盘可以控制不同轮子采用不同的转速,运转的令人惊讶得好(见图3)。

Figure_3-aab0fcf7f65ef4ec2935813e254c68f8

图3 机器人底盘。图片由Lukas Biewald授权使用

唯一让我在有更便宜的选择的时候还多花钱的东西就是这个Adafruit制造的电机扩展板(见图4)。这个直流电机的运行电压超过了树莓派板子可以提供的电压。所以单独的控制器就成为必须。而Adafruit电机扩展板极其方便好用。使用这个电机扩展板是会要做一点焊接,但这个设备是极度的容错。而且Adafruit还提供了一个很好的库和教程来让你通过i2C总线来控制电机。我一开始用的是一个便宜的电机控制器,但不小心把我的树莓派板给烧掉了,所以我决定买一个质量好一点的替代品。

Figure_4-ed9055c22840d6a0fa9088bf4fa52ea7

图4 已经安装了摄像头和电机的树莓派板。图片由Lukas Biewald授权使用

一个标价15美元的摄像头正好能装在树莓派板上,它能提供实时的视频来作为物体识别的输入。摄像头的选择就太多了。我选了一个带红外功能的摄像头,这样就可以让我的机器人有夜视功能了。

树莓派板需要大概2安培的电源,但3安培电流对于我要装的扬声器是一个更保险的选择。iPhone的充电宝是这一任务的理想选择。更低安培的充电宝一般不能产生足够的电流,从而会导致一些问题。不过这个Lumsing power bank的充电宝却很不错,而且只用18美元。

这几个HC-SR04型的声呐传感器可以让机器人免于撞车。11美元就能买到5个。

我还买了我能找到的最便宜的USB扬声器,然后用了一堆的胶带、热胶和泡沫板来把所有的东西粘到一起。作为废物利用,我还把一些电子设备的包装材料给剪了,并在上面画了一些东西来给这个机器人增加一点点人性。这里我要说的是,我实际上造了两个机器人(见图5),因为我实验了不同的底盘、摄像头、声呐、软件和其他的东西。结果加在一起发现足够造两个版本的机器人了。

Figure_5-5b104cf7a53a9c1ee95110b78fb14256

图5 我的四驱动机器人(右边的)和他的两驱动机器人妹妹。图片由Lukas Biewald授权使用

把机器人组装好了之后,就该让它变聪明了。网上有海量的教程教你如何使用树莓派。如果你曾用过Linux,树莓派的一切对你而言就都很熟悉了。

如果你想把摄像头的视频记录下来,RPi Cam Web接口能很好地胜任。它非常容易配置。默认是把来自摄像头的最新的画面存放在RAM磁盘的/dev/shm/mjpeg/cam.jpg里。

如果你想把摄像头的数据发布到网页里(这对调试是非常有帮助的),你可以用Nginx,一个极度快的开源网页服务器。我把Nginx配成对摄像头画面的网页请求直接指向上面文件的地址,而其他的请求都发送到网页服务器。

http {

server {

location / {

proxy_pass http://unix:/home/pi/drive.sock;

}

location /cam.jpg {

root /dev/shm/mjpeg;

}

}

}

我随后开发了一个简单的Python 网站服务器,可以接收键盘的指令来转动机器人的轮子。控制键盘本来是一个的遥控汽车的。

另外要说的是,利用声呐和驾驶系统来控制机器人的行驶路线从而让它能避开物体是一件非常有趣的事。

给我的机器人开发程序

终于,是时候安装TensorFlow了。安装TensorFlow有很多种方法,但TensorFlow提供了makefile命令,从而能针对你特定的操作系统进行编译。这一步骤花费了我几个小时,并需要一些依赖包,但总体来说还算顺利。

TensorFlow自带了一个预建好的模型,叫inception。它可以完成物体识别。这是如何使用运行它的教程

对一张来自摄像头的画面运行tensorflow/contrib/pi_examples/label_image/gen/bin/label_image命令,TensorFlow会返回5个可能物体的猜测。这个模型对于相当多的东西的识别都非常好,但是它也很明显地缺少一个确定的“先验条件”,即它不知道将会看到的东西是什么。它的训练数据里也明显漏掉了不少物品。比如,它能很好的识别我的笔记本,即使是从很特殊的角度看。但当让它看我的装一堆电线的篮子的时候,它就一直认为这是个烤面包机。当摄像头被遮挡,拍到的图像为黑屏或是比较模糊的时候,它就会认为是在看一些线虫。很明显线虫是它的训练数据里的东西。

Figure_6-7737df5765814e0f42aa676c3dfffaf6

图6 接着键盘和显示器的机器人。图片由Lukas Biewald授权使用

最后我采用Flite开源软件包来作为机器人的输出部分,把文字变成语音。这样机器人就可以说出它看到的物体了(见图6)。

测试我的机器人

看,这里就是我自制的两个可以使用深度学习进行物体识别的机器人。

最后的一些想法

2003到2005期间,我在斯坦福机器人实验室工作。那时候的机器人一般会要花费几十万美元,而且物体识别的能力也比不上我现在的这个机器人。我很希望能把这个软件装入我的无人机里,这样就再也不用我自己找钥匙了。

这里我也希望感谢在这个项目里帮助过我的人。我的邻居克里斯·冯·达克、施鲁蒂·甘地带给了我的机器人的友好的人性。我的朋友艾德·麦克洛大大提升了硬件部分的设计,并教会我使用热胶和泡沫板。工作在谷歌的皮蒂·沃顿帮助我在树莓派上很好地编译了TensorFlow,并提供了非常棒的客户支持。

Lukas Biewald

Lukas Biewald是CrowdFlower的创始人兼CEO。CrowdFlower始于2009年,是一个数据增强的平台,可以帮助企业获得随需的人力来收集、产生训练数据,以及参与人-机器学习循环的工作。 在从斯坦福大学拿到数学学士和计算机科学硕士学位后,Lukas领导了雅虎日本的搜索相关团队。随后他去了Powerset,作为一个资深数据科学家进行工作。2008年Powerset被微软收购。Lukas还被《公司》杂志评选为30位30岁以下的著名人士。 Lukas还是一位专家级的围棋选手。

Eye of Providence. (source: Bureau of Engraving and Printing on Wikimedia Commons).