基于树莓派和Tensowflow的物体识别-brain
近来这篇文章很火:How to build a robot that “sees” with $100 and TensorFlow (作者是Lukas,CrowdFlower创始人) ,中文译本为《如何用100美金和Tensowflow来造一个能"看"东西的机器人》,公众号们纷纷转载。
文章读来饶有趣味,里边涉及的技术大多接触过,都不难,遂决定动手实现它。
要实现整个项目,我手头还缺小车底盘,我们先来实现这个项目的核心部分:用树莓派和Tensowflow的识别现实世界的物体。日后有空再加上小车。
随手把桌子上同事给的橘子拍下来,之后我们试着让树莓派认出它。
任务描述
How to build a robot that “sees” with $100 and TensorFlow 已经把要做的是事说清楚了。
物体识别是近来机器学习领域的热点之一。对于识别人脸或是区分猫狗这件事上,计算机已经胸有成竹,而在更大的图片集中识别一个指定的物体还是人工智能领域的“圣杯”,不过近年也有很大进展。
我们将造一个能自己识别物体的机器人(不需要云服务)。
工具介绍
树莓派
树莓派(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)
它认为最大的可能是柠檬,橘子和柠檬确实很相似。
如果你想自己来训练你的模型,可以参考googleblog上的这篇文章:Train your own image classifier with Inception in TensorFlow。
优化
目前物体识别的性能不高,需要等一会儿,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
。 如此一来就把图片转化为小尺寸(100x100),能有效提高运算速度
todo
1、中文语音输出
- 蓝牙音箱
- 英->中翻译
- 语音输出
2、加载到汽车模型上
- L298N驱动板
- scala中常用但其他语言不常见的符号含义 - 心灵空谷幽兰 - 博客园
- 每天一个Linux命令:telnet
- c++基础 explicit
- 每天一个Linux命令:tail
- Hive高级优化
- OpenStack中的RESTful API是如何实现的?
- servlet乱码问题总结
- Servlet学习之web服务器Tomcat 详解
- 结合源码彻底讲解Aggregate vs treeAggregate
- Nginx+uWSGI部署Django网站的详细步骤,脱坑必备,值得收藏!
- 友元类
- 大数据最佳实践 | HBase客户端
- 模板类的友元
- Qt学习笔记 TableWidget使用说明和增删改操作的实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用 GitLab CI 和 Docker 自动部署 Spring Boot 应用
- 玩转StyleGAN2模型:教你生成动漫人物
- R语言时间序列数据指数平滑法分析交互式动态可视化
- 再见Excel!最强国产开源在线表格Luckysheet走红GitHub
- R语言广义线性模型索赔频率预测:过度分散、风险暴露数和树状图可视化
- R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用
- sas神经网络:构建人工神经网络模型来识别垃圾邮件
- 图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
- 手写dubbo框架9-SPI实现
- R语言非参数模型厘定保险费率:局部回归、广义相加模型GAM、样条回归
- VsCode插件之Live Serve探秘.(上)
- R语言小数定律的保险业应用:泊松分布模拟索赔次数
- R语言中自编基尼系数的CART回归决策树的实现
- Docker hello world
- 前端环境配置