近来这篇文章很火:How to build a robot that “sees” with $100 and TensorFlow (作者是Lukas,CrowdFlower创始人) ,中文译本为《如何用100美金和Tensowflow来造一个能”看”东西的机器人》,公众号们纷纷转载
文章读来饶有趣味,里边涉及的技术大多接触过,都不难,遂决定动手实现它
要实现整个项目,我手头还缺小车底盘,我们先来实现这个项目的核心部分:用树莓派和Tensowflow的识别现实世界的物体。日后有空再加上小车
随手把桌子上同事给的橘子拍下来,之后我们试着让树莓派认出它
任务描述
物体识别是近来机器学习领域的热点之一。对于识别人脸或是区分猫狗这件事上,计算机已经胸有成竹,而在更大的图片集中识别一个指定的物体还是人工智能领域的“圣杯”,不过近年也有很大进展
我们将造一个能自己识别物体的机器人(不需要云服务)
工具介绍
树莓派
树莓派(Raspberry Pi)是一款基于Linux的单板机电脑,它只有巴掌大小,却有惊人的计算能力,你可以把它当做一台普通电脑。
树莓派的使命是制作一套启发孩子的电脑,降低孩子们试错的成本
树莓派最新的版本是树莓派3,较前一代树莓派2,树莓派3的处理器升级为了64位的博通BCM2837,并首次加入了Wi-Fi无线网络及蓝牙功能。加量不加价
TensorFlow
TensorFlow是一个由”Google大脑”团队的研究人员开发的机器学习库,Google遵循Apache License 2.0将其开源。该系统可以被用于语音识别、图片识别等多个领域
在这个项目中我们主要用到一个叫做inception的模型(基于ImageNet数据集)。它可以完成物体识别,我们直接使用预训练好的模型。训练模型可是个费时费力的工作
你把智能当黑盒使用的时候,并不需要有那么多偷懒的负罪感啦(哈哈 我还是有一点)
电气时代来临的时候,变革社会的除了那些发电的人,那些懂得使用电力去改造传统行业,创造新的行业的人,也许对社会的变革更为深刻。尽管他们可能连卡诺循环都不知道,甚至不知如何将水蒸汽中的动能转换为功,进而驱动电机发电
ImageNet数据集
这个数据集包含约120万张训练图像、5万张验证图像和10万张测试图像,分为1000个不同的类别,用于机器学习中训练图像识别系统
准备工作
我们先准备好树莓派,我用的是安装了raspbian-2016-05-31版本的树莓派3代(使用其他版本应该也没问题),关于树莓派的相关配置可以参考我之前的文章:树莓派折腾笔记之系统安装与配置
安装Tensowflow
How to build a robot that “sees” with $100 and TensorFlow 这篇文章里,作者采用的是TensorFlow提供的makefile命令,在树莓派中本地编译,这一步骤花费了作者几个小时。不过好处是一步到位。安装完后可以直接运行:tensorflow/contrib/pi_examples/label_image/gen/bin/label_image来识别物体
我不打算编译安装,除了过程费事,还需要在安装的几个小时里提心吊胆,深怕某个依赖问题导致前功尽弃,重新编译。 我在手动编译opencv的时候就曾备受折磨
我的安装过程
我们先安装已经适合树莓派的Tensowflow,这种工作,肯定有人做过,github一搜果不其然:tensorflow-on-raspberry-pi。我们开始安装:
wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/raw/master/bin/tensorflow-0.9.0-cp27-none-linux_armv7l.whl
sudo pip install tensorflow-0.9.0-cp27-none-linux_armv7l.whl #这一步会安装其他依赖,如果太慢,可以用-i参数,使用豆瓣源
安装过程很快,也就喝杯茶时间,过程十分流畅
Tensowflow安装完成,我们开始加载模型,安装过程参考这里:pi_examples
mkdir ~/tf
cd /usr/local/lib/python2.7/dist-packages/tensorflow/models/image/imagenet
python classify_image.py --model_dir ~/tf/imagenet #--model_dir 指定模型数据存放的目录
完成后我们来测试下是否正常
python /usr/local/lib/python2.7/dist-packages/tensorflow/models/image/imagenet/classify_image.py --model_dir ~/tf/imagenet
如果是如下输出则一切就绪:
giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89233)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00859)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00264)
custard apple (score = 0.00141)
earthstar (score = 0.00107)
测试
我们来试一下我的伞(拍于办公室):
python /usr/local/lib/python2.7/dist-packages/tensorflow/models/image/imagenet/classify_image.py --model_dir ~/tf/imagenet --image_file /tmp/test.jpg # 图片需是jpg格式
输出为
程序会给出5个可能的物体,得分最高的是雨伞,识别的很准确
我们接着给它看一张橘子的图片:
输出为
lemon (score = 0.72036)
orange (score = 0.16516)
spaghetti squash (score = 0.01571)
butternut squash (score = 0.00304)
ocarina, sweet potato (score = 0.00298)
它认为最大的可能是柠檬,橘子和柠檬确实很相似
优化
目前物体识别的性能不高,需要等一会儿,Lukas的机器人很有趣,它每次拍下照片,开始计算的时候会说I'm thinking。延时得很自然,机器也确实是在“思考”
关于如何提高运算速度,以下是几个可能
利用GPU来计算。树莓派支持GPU运算,不过tensorflow-on-raspberry-pi目前没有GPU版本的whl,linux/mac都有GPU版本的whl. 此问题详细谈论可以参考:Question on GPU
使树莓派超频可以加快运算速度
把tensorflow部署到小车控制器坐在的电脑上(本地电脑),实际计算在本地进行(这样可以把tensorflow用到任何client里,不过需要联网运行)
把tensorflow部署到云上,提供网络服务
另一个优化是,缩小图片尺寸,可以使用ImageMagick提供的convert指令:convert -resize 100x100 test.png dest.jpg。 如此一来就把图片转化为小尺寸(100×100),能有效提高运算速度
todo
中文语音输出
蓝牙音箱
英->中翻译
语音输出
加载到汽车模型上
L298N驱动板
参考