编辑:Midkey 物体识别是现在机器学习领域的热点之一。相当长的…,本作文被阅读:100次。
来源: [转]如何用树莓派和TensorFlow来造一个能“看”东西的机器人
物体识别是现在机器学习领域的热点之一。相当长的时间里,计算机已经能相当可靠地识别人脸或者猫。但在更大的图片中去识别一个指定的物体还是人工智能领域的“圣杯”。人类的大脑能非常好地识别物体。我们可以毫无困难地把从物体上反射出来的具有不同频率的光子转化为关于我们周边世界的极度丰富的信息集。而机器学习还依然在为了完成这个简单的任务而奋斗。不过近几年,机器学习已经取得了相当不错的进步。
深度学习算法和一个超大的公共训练数据集(称为ImageNet)共同促成了物体识别领域的一系列令人映像深刻的进步。TensorFlow是一个广为人知的深度学习框架,它让在多种架构上实现深度学习算法变得很容易。TensorFlow善于利用GPU的运算能力,从而使得它非常适合运行深度学习的算法。
造我自己的机器人
我想造一个能自己识别物体的机器人。多年的开发程序和测试的经验已经把我塑造成了害怕和实际物体打交道。现实世界里,测试一个有缺陷的物理设备可能会把房子烧了,或是烧毁引擎,并让你等很多天才能拿到替换的零件。
图1 能识别物体的机器人的架构。
而新的第三代树莓派板是完成这个项目的最佳选择。在亚马孙上它仅售36美元,还带有无线功能、一个四核的CPU、1G的内存。加上一个报价6美元的迷你SD卡就可以载入一个基于Debian的Raspberian操作系统。图1显示了所有这些部件是怎么组合在一起的。而图2则是这块板子的照片。
图2 运行在我车库里的树莓派板。
我很喜欢SainSmart制造的只用11美元的机器人底盘。这个底盘可以控制不同轮子采用不同的转速,运转的令人惊讶得好(见图3)。
图3 机器人底盘。
唯一让我在有更便宜的选择的时候还多花钱的东西就是这个Adafruit制造的电机扩展板(见图4)。这个直流电机的运行电压超过了树莓派板子可以提供的电压。所以单独的控制器就成为必须。而Adafruit电机扩展板极其方便好用。使用这个电机扩展板是会要做一点焊接,但这个设备是极度的容错。而且Adafruit还提供了一个很好的库和教程来让你通过i2C总线来控制电机。我一开始用的是一个便宜的电机控制器,但不小心把我的树莓派板给烧掉了,所以我决定买一个质量好一点的替代品。
图4 已经安装了摄像头和电机的树莓派板。
一个标价15美元的摄像头正好能装在树莓派板上,它能提供实时的视频来作为物体识别的输入。摄像头的选择就太多了。我选了一个带红外功能的摄像头,这样就可以让我的机器人有夜视功能了。
树莓派板需要大概2安培的电源,但3安培电流对于我要装的扬声器是一个更保险的选择。iPhone的充电宝是这一任务的理想选择。更低安培的充电宝一般不能产生足够的电流,从而会导致一些问题。不过这个Lumsing power bank的充电宝却很不错,而且只用18美元。
这几个HC-SR04型的声呐传感器可以让机器人免于撞车。11美元就能买到5个。
我还买了我能找到的最便宜的USB扬声器,然后用了一堆的胶带、热胶和泡沫板来把所有的东西粘到一起。作为废物利用,我还把一些电子设备的包装材料给剪了,并在上面画了一些东西来给这个机器人增加一点点人性。这里我要说的是,我实际上造了两个机器人(见图5),因为我实验了不同的底盘、摄像头、声呐、软件和其他的东西。结果加在一起发现足够造两个版本的机器人了。
图5 我的四驱动机器人(右边的)和他的两驱动机器人妹妹。
把机器人组装好了之后,就该让它变聪明了。网上有海量的教程教你如何使用树莓派。如果你曾用过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个可能物体的猜测。这个模型对于相当多的东西的识别都非常好,但是它也很明显地缺少一个确定的“先验条件”,即它不知道将会看到的东西是什么。它的训练数据里也明显漏掉了不少物品。比如,它能很好的识别我的笔记本,即使是从很特殊的角度看。但当让它看我的装一堆电线的篮子的时候,它就一直认为这是个烤面包机。当摄像头被遮挡,拍到的图像为黑屏或是比较模糊的时候,它就会认为是在看一些线虫。很明显线虫是它的训练数据里的东西。
图6 接着键盘和显示器的机器人.
最后我采用Flite开源软件包来作为机器人的输出部分,把文字变成语音。这样机器人就可以说出它看到的物体了(见图6)。
测试我的机器人
看,这里就是我自制的两个可以使用深度学习进行物体识别的机器人
Midkey说:对于性能再次提升而且价格不变的树莓派,不得不给个大写的服。用树莓派搭载上Tensorflow,再一次拉近了深度学习与我们之间的距离,变得触手可得。然而以上这个小项目,看似简单,还是涉及了许多各方面的问题。
- 需要学习树莓派的使用,在树莓派上搭建Linux系统,驱动树莓派的GPIO以及摄像头(树莓派拥有不少的库函数,实际使用起来并不太难,需要了解一些Linux的基本操作)
- 搭建服务器并不是必要,(如果喜欢,也可以自己搭着玩),可以直接通过一个蓝牙模块进行控制小车的移动(名曰:遥控小车So easy!)
- 语音合成方面,对于我们平时的小作品,大家可以尝试使用Ekho(余音)这款开源语音合成软件,能够说中文!只是合成声音较为无语而已。
- 关于电机驱动,我们可以直接使用较为常见的L298N电机驱动板。
- 最最关键的一点!!在树莓派上装TensorFlow,实为本项目最难,也是最重要的一环!而且在文章中也没有细说!至于怎么弄这个,可以跪见这个网址:https://github.com/samjabrahams/tensorflow-on-raspberry-pi
因为树莓派本身的性能所致,可以预见的是,安装TensorFlow将会耗费大量时间,而且有可能出现各种问题,在此就先不细说了。(后续再作尝试)
- 建议有一定Linux操作基础的同学进行尝试。