如何用100美元是怎么做出来的和TensorFlow来造一个能“看”东西的机器人

后使用快捷导航没有帐号?
如何用100美元和TensorFlow来造一个能“看”东西的机器人
查看: 25190|
评论: 0|原作者: Lukas Biewald|来自: 大脑模拟
摘要: 物体识别是现在机器学习领域的热点之一。相当长的时间里,计算机已经能相当可靠地识别人脸或者猫。但在更大的图片中去识别一个指定的物体还是人工智能领域的“圣杯”。人类的大脑能非常好地识别物体。我们可以毫无困 ...
物体识别是现在领域的热点之一。相当长的时间里,计算机已经能相当可靠地识别人脸或者猫。但在更大的图片中去识别一个指定的物体还是领域的“圣杯”。人类的大脑能非常好地识别物体。我们可以毫无困难地把从物体上反射出来的具有不同频率的光子转化为关于我们周边世界的极度丰富的信息集。而机器学习还依然在为了完成这个简单的任务而奋斗。不过近几年,机器学习已经取得了相当不错的进步。和一个超大的公共训练数据集(称为ImageNet)共同促成了物体识别领域的一系列令人映像深刻的进步。TensorFlow是一个广为人知的框架,它让在多种架构上实现深度学习算法变得很容易。TensorFlow善于利用GPU的运算能力,从而使得它非常适合运行深度学习的算法。造我自己的机器人我想造一个能自己识别物体的机器人。多年的开发程序和测试的经验已经把我塑造成了害怕和实际物体打交道。现实世界里,测试一个有缺陷的物理设备可能会把房子烧了,或是烧毁引擎,并让你等很多天才能拿到替换的零件。图1 能识别物体的机器人的架构。图片由Lukas Biewald授权使用而新的第三代树莓派板是完成这个项目的较佳选择。在亚马孙上它仅售36美元,还带有无线功能、一个四核的CPU、1G的内存。加上一个报价6美元的迷你SD卡就可以载入一个基于Debian的Raspberian操作系统。图1显示了所有这些部件是怎么组合在一起的。而图2则是这块板子的照片。图2 运行在我车库里的树莓派板。图片由Lukas Biewald授权使用我很喜欢SainSmart制造的只用11美元的机器人底盘。这个底盘可以控制不同轮子采用不同的转速,运转的令人惊讶得好(见图3)。图3 机器人底盘。图片由Lukas Biewald授权使用让我在有更便宜的选择的时候还多花钱的东西就是这个Adafruit制造的电机扩展板(见图4)。这个直流电机的运行电压超过了树莓派板子可以提供的电压。所以单独的控制器就成为必须。而Adafruit电机扩展板极其方便好用。使用这个电机扩展板是会要做一点焊接,但这个设备是极度的容错。而且Adafruit还提供了一个很好的库和教程来让你通过i2C总线来控制电机。我一开始用的是一个便宜的电机控制器,但不小心把我的树莓派板给烧掉了,所以我决定买一个质量好一点的替代品。图4 已经安装了摄像头和电机的树莓派板。图片由Lukas Biewald授权使用一个标价15美元的摄像头正好能装在树莓派板上,它能提供实时的视频来作为物体识别的输入。摄像头的选择就太多了。我选了一个带红外功能的摄像头,这样就可以让我的机器人有夜视功能了。树莓派板需要大概2安培的电源,但3安培电流对于我要装的扬声器是一个更保险的选择。iPhone的充电宝是这一任务的理想选择。更低安培的充电宝一般不能产生足够的电流,从而会导致一些问题。不过这个Lumsing power bank的充电宝却很不错,而且只用18美元。这几个HC-SR04型的声呐传感器可以让机器人免于撞车。11美元就能买到5个。我还买了我能找到的最便宜的USB扬声器,然后用了一堆的胶带、热胶和泡沫板来把所有的东西粘到一起。作为废物利用,我还把一些电子设备的包装材料给剪了,并在上面画了一些东西来给这个机器人增加一点点人性。这里我要说的是,我实际上造了两个机器人(见图5),因为我实验了不同的底盘、摄像头、声呐、软件和其他的东西。结果加在一起发现足够造两个版本的机器人了。图5 我的四驱动机器人(右边的)和他的两驱动机器人妹妹。图片由Lukas Biewald授权使用把机器人组装好了之后,就该让它变聪明了。网上有海量的教程教你如何使用树莓派。如果你曾用过,树莓派的一切对你而言就都很熟悉了。如果你想把摄像头的视频记录下来,RPi Cam Web接口能很好地胜任。它非常容易配置。默认是把来自摄像头的的画面存放在RAM磁盘的/dev/shm/mjpeg/cam.jpg里。如果你想把摄像头的数据发布到网页里(这对调试是非常有帮助的),你可以用Nginx,一个极度快的开源网页服务器。我把Nginx配成对摄像头画面的网页请求直接指向上面文件的地址,而其他的请求都发送到网页服务器。http {server {location / {proxy_pass http://unix:/home/pi/drive.}location /cam.jpg {root /dev/shm/}}}我随后开发了一个简单的Python 网站服务器,可以接收键盘的指令来转动机器人的轮子。控制键盘本来是一个的遥控汽车的。另外要说的是,利用声呐和驾驶系统来控制机器人的行驶路线从而让它能避开物体是一件非常有趣的事。给我的机器人开发程序终于,是时候安装TensorFlow了。安装TensorFlow有很多种方法,但TensorFlow提供了makefile命令,从而能针对你特定的操作系统进行编译。这一步骤花费了我几个小时,并需要一些依赖包,但总体来说还算顺利。TensorFlow自带了一个预建好的模型,叫inception。它可以完成物体识别。这是如何使用运行它的教程。对一张来自摄像头的画面运行tensorflow/contrib/pi_examples/label_image/gen/bin/label_image命令,TensorFlow会返回5个可能物体的猜测。这个模型对于相当多的东西的识别都非常好,但是它也很明显地缺少一个确定的“先验条件”,即它不知道将会看到的东西是什么。它的训练数据里也明显漏掉了不少物品。比如,它能很好的识别我的笔记本,即使是从很特殊的角度看。但当让它看我的装一堆电线的篮子的时候,它就一直认为这是个烤面包机。当摄像头被遮挡,拍到的图像为黑屏或是比较模糊的时候,它就会认为是在看一些线虫。很明显线虫是它的训练数据里的东西。最后我采用Flite开源软件包来作为机器人的输出部分,把文字变成语音。这样机器人就可以说出它看到的物体了(见图6)。测试我的机器人看,这里就是我自制的两个可以使用深度学习进行物体识别的机器人。最后的一些想法期间,我在斯坦福机器人实验室工作。那时候的机器人一般会要花费几十万美元,而且物体识别的能力也比不上我现在的这个机器人。我很希望能把这个软件装入我的无人机里,这样就再也不用我自己找钥匙了。这里我也希望感谢在这个项目里帮助过我的人。我的邻居克里斯·冯·达克、施鲁蒂·甘地带给了我的机器人的友好的人性。我的朋友艾德·麦克洛大大提升了硬件部分的设计,并教会我使用热胶和泡沫板。工作在谷歌的皮蒂·沃顿帮助我在树莓派上很好地编译了TensorFlow,并提供了非常棒的客户支持。Lukas BiewaldLukas Biewald是CrowdFlower的创始人兼CEO。CrowdFlower始于2009年,是一个数据增强的平台,可以帮助企业获得随需的人力来收集、产生训练数据,以及参与人-机器学习循环的工作。 在从斯坦福大学拿到数学学士和计算机科学硕士学位后,Lukas领导了雅虎日本的搜索相关团队。随后他去了Powerset,作为一个资深数据科学家进行工作。2008年Powerset被微软收购。Lukas还被《公司》杂志评选为30位30岁以下的著名人士。 Lukas还是一位专家级的围棋选手。欢迎加入本站公开兴趣群商业智能与数据分析群兴趣范围包括各种让数据产生价值的办法,实际应用案例分享与讨论,分析工具,ETL工具,数据仓库,数据挖掘工具,报表系统等全方位知识QQ群:
上一篇:下一篇:
dataguru.cn All Right Reserved.谷歌开源的TensorFlow有什么用,可以用来设计机器人吗? - 知乎7被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答b.gcr.io/tensorflow/tensorflow-fullUnable to find image '' locallydocker: Error response from daemon: unable to ping registry endpoint v2 ping attempt failed with error: Get : dial tcp 64.233.188.82:443: i/o timeoutv1 ping attempt failed with error: Get : dial tcp 64.233.188.82:443: i/o timeout.See 'E:\Program Files\Docker Toolbox\docker.exe run --help'.think@dell MINGW64 ~$ docker run -it Unable to find image '' locallydocker: Error response from daemon: unable to ping registry endpoint v2 ping attempt failed with error: Get : dial tcp 64.233.188.82:443: i/o timeoutv1 ping attempt failed with error: Get : dial tcp 64.233.188.82:443: i/o timeout.See 'E:\Program Files\Docker Toolbox\docker.exe run --help'.think@dell MINGW64 ~$ docker run -it Unable to find image '' locallydocker: Error response from daemon: unable to ping registry endpoint v2 ping attempt failed with error: Get : dial tcp 64.233.189.82:443: i/o timeoutv1 ping attempt failed with error: Get : dial tcp 64.233.189.82:443: i/o timeout.See 'E:\Program Files\Docker Toolbox\docker.exe run --help'.think@dell MINGW64 ~$ docker run -d -p
-v /notebook:/notebook xblaster/tensorflow-jupytercbe87996b37ddb1d5dd40cae846f4a1e3f8e2f8c8eaabf569af33e0a663a262001 条评论分享收藏感谢收起b.gcr.io/tensorflow/tensorflow-fullUnable to find image '' locallyC:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: Get : dial tcp 64.233.189.82:443: i/o timeout.See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.01 条评论分享收藏感谢收起写回答掌握对话沟通,语境为王。
我们将使用Tensorflow构建一个聊天机器人框架,向大家示范如何实现上下文的语境处理。
有没有想过为什么大多数聊天机器人缺乏会话语境?
我们将创建一个聊天机器人框架,为一个小岛上的轻便摩托车租赁店建立一个对话模型。这家小店的聊天机器人需要处理营业时间,预订选项等简单问答。我们也希望它能处理客户根据上下文提出的问题,例如关于同一天租金的查询。体验能做好的话,可以让客户的假期留下美好回忆!
这将通过三个步骤实现:
将对话意图的定义转换为Tensorflow模型
接下来,构建一个聊天机器人框架来处理响应
将基础的上下文语料,整合进响应处理过程
我们将使用tflearn,一个基于tensorflow的Python包。
一般用iPython notbook作为辅助工具
把会话意图的定义,转化为 TensorFlow 模型
第一步,完整的notebook脚本可以在 GitHub找到:
http://t.cn/RooXK34
聊天机器人框架框架需要一个能定义会话意图的架构。有一个简洁的实现方式,是使用JSON文件:
http://t.cn/RooXpPo
每个会话意图包含:
一个标签(唯一的命名)
模式组(用于神经网络文本分类器的句子模式)
稍后我们将添加一些基本的上下文元素。首先是导入的包:
如果是新手,看看“7行代码搞定深度学习”,相关链接:
http://t.cn/RXGpWZC
如果还不清楚 TensorFlow 都能干啥,就看看这个:
http://t.cn/RooXnIl
加载 JSON 会话意图文件后,现在可以开始设计我们的文件、词语和分类器的类。文件地址:
http://t.cn/RooXpPo
我们创建了文件(句子)列表,每个句子是一个由词干组成的列表,每个文件关联一个意图(一个类对象)。
词干"tak"将匹配“take”,“taking”,“takers”等。我们可以清理词语列表,删除无用的词目。但现在这样处理就够了。
麻烦的是,这个数据结构不能用到Tensorflow,需要进一步转换:从由词语组成的文本转换成由数值型变量组成的张量。
注意我们的数据是被打乱了的。Tensorflow将取出其中一些数据,并将其用作测试数据,以衡量新拟合模型的精度。
如果我们看一个单一的x和y列表元素,我们会得到词袋数组,一个用于意图模式,另一个用于意图类。
现在可以准备建模了。
同样的张量结构,也用在了
toy’ 例子里的2层神经网络上,观察理解这个模型拟合训练数据的过程,会一直有用。
要完成这一部分的工作,我们将保存( pickle )模型和文档,以便下一个notbook脚本可以调用。
搭建聊天机器人框架
第二步的完整notebook脚本看这里:
http://t.cn/RooXsc2
我们将构建一个简单的状态机来处理响应,使用我们(从上一步)的意图模型作为分类器。这就是聊天机器人的工作原理。
语境聊天机器人框架,是带状态机的分类器。
导入相同的库之后,我们 unpickle 模型和文件,并重新加载意图文件。注意,聊天框架与我们构建的模型是分开的。除非意图模式改变,否则不需要重建模型。由于有数百种意图和数千种模式,模型可能需要几分钟的时间才能建立。
接下来,我们将加载保存的Tensorflow(tflearn框架)模型。需要注意的是,首先需要定义Tensorflow模型需要的数据结构,就像上一节所述。
在处理意图之前,我们要想办法把用户输入生成词袋。这个技巧与我们以前使用过的训练文本相同。
现在可以建立响应处理器了。
每个传递给response方法的句子都被分类。分类器使用model.predict()并且非常快。模型返回的概率向量与我们的意图按顺序一一对应,生成潜在响应列表。
如果一个或多个分类结果高于阈值,就可以判断一个标签是否与意图匹配,然后处理。我们将分类列表作为一个堆栈,并删除栈顶来寻找合适的匹配意图,直到找到一个或者栈为空。
我们来看一个分类示例,返回值中最有可能的标签及其概率。
注意,“你的店今天营业吗?”不是这个意图的模式之一:“模式”: [“今天营业吗?”, “今天什么时候开业?”, “今天的营业时间?”] ;而不管对应项“营业”和“今天” 多么适合模型(它们在选择的意图中是突出的)。
我们现在可以从用户输入中生成聊天机器人的响应。
以及上下文无关的其他响应..
让我们利用一些基本的上下文,实现我们聊天机器人的拖欠租赁谈话模型。
我们想要处理一个关于租赁摩托车的问题,并咨询租金是否今天到期。是非问题是一个简单的语境响应。如果用户回答“今天” ,上下文是租赁的时间范围,那么最好调取租赁公司编号1-800的问答响应。不占用时间。
为了实现这一点,我们将把“状态”的概念加入我们的框架。这包括用来维护状态的一个数据结构,和在处理意图时用来操作这个数据结构的特定代码。
因为我们的状态机的状态需要容易维护,恢复和复制等等,所以很重要的是要把它全部保存在像字典这样的数据结构中。
这是基本语境的处理过程:
我们的上下文状态是一个字典数据结构,它将包含每个用户的状态。我们将为每个用户使用一些唯一的标识(例如,元胞数)。这使得我们的框架和状态机可以同时维护多个用户的状态。
在意图处理流程中添加了上下文处理流程,如下所示:
如果一个意图想设值相应的上下文,则可以这样做:
如果其他意图想要与上下文相关联,则可以这样做:
以这种方式,如果用户刚刚输入“today”而与蓝色没有关联(无上下文信息),则我们的“today”意图将不被处理。如果他们输入“today” 作为对我们的Y/N问题(意图标签:“rental”)的回应,则意图被处理。
上下文状态更新了。
我们定义了“greeting”意图来简化上下文,就像通常的短对话一样。添加一个“show_details”参数来帮助我们理解其中的含义。
再试试输入“today”,这里有一些值得注意的...
首先,我们对无上下文相关的“today”的回应是不同的。我们的分类产生了2个合适的意图,而“opentoday”被选中,因为“今天”的意图虽然较高的概率,而被限制在不再适用的上下文中。语境很有用!
有一些事情需要考虑了,那就是下面的语境化...
带状态的状态模型
没错,你的聊天机器人将不再像无状态的服务端那么轻松愉快了。
除非要重置状态,重新加载模型和文档 - 每次调用您的聊天机器人框架时,那你都需要引入"状态"概念。
这个不难。可以在其进程中运行一个有状态的聊天框架,并使用RPC(远程过程调用)或RMI(远程方法调用)来调用,我推荐Pyro。
用户界面(客户端)通常是无状态的,例如。HTTP或SMS。
聊天机器人的客户端将调用Pyro函数,有状态服务来处理。看,惊不惊喜,意不意外!
这是一个构建Twilio SMS聊天机器人客户端的逐步指南,这里是FB Messenger的一个实现。
别把状态存到本地变量
所有状态信息都必须放在像字典一样的数据结构中,容易地持久化,重载或以原子复制。
每个用户的会话将生成上下文,这将为带有该用户状态的上下文。用户ID可以用他们的元胞数,Facebook用户ID或着其他唯一标识符。
有些情况需要(按值)复制用户的会话状态,然后作为意图过程来恢复。如果状态机在框架内带有状态相关的变量,那么在实际中难以有效的。
所以现在你有一个聊天机器人框架,一个有状态服务的方案,以及可以添加上下文的demo。以后大多数聊天机器人框架都将无缝地衔接上下文。
想想意图影响和反应不同上下文(语境)设定的创意方式。用户的上下文字典可以包含各种各样的会话上下文。
来一起愉快地玩耍起来!
文章转载自网络,作者观点不代表本网站立场,如需处理请联系客服
AI研习社其它文章
人工智能是目前最受关注、最为火热的研究领域之一,随着企业在 AI 研究及相关应用落地的重视,相应的岗位需求也水涨船高。然而,这一行业仍然面临百万量级的人才缺口。因其较好的发展前景和出名的「高薪」,许多毕业生和IT从业者在择业时也开始将 AI 行业纳入考虑范围。
雷锋网 AI 科技评论按:本文作者 Priyanka Kochhar 从事数据科学十多年,现在在运营一家深度学习咨询公司,她曾帮助多家创业公司完成人工智能解决方案的计划和部署,如果有兴趣与她合作,请联系 priya.。最近,TensorFlow 的「物体检测 API」有了一个
AI 研习社按:为你的分类器选择正确的评价指标十分关键。如果选不好,你可能会陷入这样的困境:你认为自己的模型性能良好,但实际上并非如此。近日,towardsdatascience 上的一篇文章就深入介绍了分类器的评价指标,以及应该在什么场景下使用,AI 研习社将内容编译整理如
谷歌在自然语言理解研究的全新尝试。AI 研习社消息:今日,谷歌分享了 Semantic Experiences,在博客中展示了两大关于自然语言理解的互动工具。Talk to Books 是一个可以从书中的句子层面搜索书籍的全新检索模式;另一个互动内容则是 Semantris,一个由机器学习驱动的单
为了方便求职者和招聘方,消灭信息不对称,AI 研习社决心承担起中介大任,每周为你推荐企业岗位!*找工作的同学在发邮件时务必在邮件主题中注明【AI研习社】,会增加你的简历通过率!*有需求的公司欢迎将 JD 发至邮箱【】或者【konglingshuang@l
本文为「嘀~正则表达式快速上手指南」下篇,阅读上篇请点击:嘀~正则表达式快速上手指南(上篇)以循环方式获取每个名称和地址接下来我们在电子邮件的 contents 列表中工作。上面的代码中用 for 循环去遍历 contents 这样我们就可以一个一个处理每封邮件。我们创建一个字
人工智能行业面临百万量级的人才缺口,正值春招求职季,AI 慕课学院与雷锋网旗下学术频道 AI 研习社联合腾讯课堂共同开启一场关于AI 求职的经验分享盛宴——「AI 求职季·AI 工程师 offer 直通车系列直播」栏目。4月10日-19日,AI明星企业大咖坐镇分享,场场精彩!本周我
本文原载于 TensorFlow 官方微信,AI 研习社获其授权转载。今天,我们与 Caicloud (才云) 联合发起和创建的 TensorFlow 中文社区论坛测试版(https://www.tensorflowers.cn) 正式上线与大家见面了!作为一个以开源代码推动互联网和人工智能发展的技术,TensorFlow 机器学习
这是「迁移学习简明手册」的 LaTex 源码。欢迎有兴趣的学者一起来贡献维护。Github:https://github.com/jindongwang/transferlearning-tutorial下载V1.0 版本:地址 1:http://jd92.wang/assets/files/transfer_learning_tutorial_wjd.pdf地址 2:https://github.com/ji
本文为雷锋字幕组编译的技术博客,原标题Regular Expressions for Data Scientists,来源dataquest。翻译 | 汪其香 Noddleleslee 陈亚彬 赵朋飞 杨婉迪
整理| 凡江作为数据科学家,快速处理海量数据是他们的必备技能。有时候,这包括大量的文本语料库。例如
AI 研习社按:人工智能技术发展迅猛的背后不仅得益于庞大的数据量,更需要强大的硬件支持。面对层出不穷的 AI 应用,已经很难采用一种通用的硬件进行高效的数据计算和处理,这也促使了各种类型的 AI 芯片蓬勃发展。近期,在 AI 研习社线上公开课上,Thinker (AI 芯片) 团
2018 MIT 6.S094 官方授权翻译的中文字幕版,终于来了 !近日,麻省理工学院(MIT)开源了2018年最新版「MIT 6.S094:深度学习和自动驾驶」。雷锋字幕组获MIT官方授权翻译,4月13日正式开始放送课程中文字幕版,同步更新在AI研习社、AI慕课学院。课程链接:http://www.m
人工智能是目前最受关注、最为火热的研究领域之一,随着企业在 AI 研究及相关应用落地的重视,相应的岗位需求也水涨船高。然而,这一行业仍然面临百万量级的人才缺口。因其较好的发展前景和出名的「高薪」,许多毕业生和IT从业者在择业时也开始将 AI 行业纳入考虑范围。
本篇文章将为大家总结 Tensorflow 纯干货学习资源,非常适合新手学习,建议大家收藏。想要学习更多的 Tensorflow 知识,关注「磐创 AI」微信公众号。一、Tensorflow 教程资源:1)适合初学者的 Tensorflow 教程和代码示例:(https://github.com/aymericdamien/TensorFlow
阿拉丁神灯的故事想必大家都听过,对着神灯许下心愿,你的愿望就会实现。而今天,在阿里 AliOS 有一支神灯团队,他们希望能像阿拉丁神灯一样,让用户通过其服务获得满足。团队成员王智楠对 AI 研习社说道,「我们希望让客户拥有一种想要什么服务就能得到什么服务的感觉,
人工智能是目前最受关注、最为火热的研究领域之一,随着企业在 AI 研究及相关应用落地的重视,相应的岗位需求也水涨船高。然而,这一行业仍然面临百万量级的人才缺口。因其较好的发展前景和出名的「高薪」,许多毕业生和IT从业者在择业时也开始将 AI 行业纳入考虑范围。
PyTorch-NLP,简称torchnlp,是一个神经网络层、文本处理模块和数据集库,旨在加速自然语言处理的研究。有兴趣加入该社区的开发者可以在 Gitter(https://gitter.im/PyTorch-NLP/Lobby) 和 Google Group(https://groups.google.com/forum/#!forum/pytorch-nlp) 上跟作
本库是 NLP 中使用的包含了文本数据的免费/公共域数据集,这些数据集已经按字母顺序排好。这里的大多数数据只是原始的非结构化文本数据,如果你需要寻找注释的语料库或 Treebanks,请参阅底部的源代码。Apache Software Foundation Public Mail Archives:截至 2011 年
人工智能是目前最受关注、最为火热的研究领域之一,随着企业在 AI 研究及相关应用落地的重视,相应的岗位需求也水涨船高。然而,这一行业仍然面临百万量级的人才缺口。因其较好的发展前景和出名的「高薪」,许多毕业生和IT从业者在择业时也开始将 AI 行业纳入考虑范围。
本文为雷锋字幕组编译的技术博客,原标题Releasing “Supervisely Person” dataset for teaching machines to segment humans,作者为Supervise.ly。翻译 | 郭乃峤 汪宁 张虎
整理 | 凡江 吴璇我们非常自豪地在这里宣布,Supervisely人像数据集(https://supervise.ly0}{else}no-cache{/if}" />
用TensorFlow制作一个图像识别工具的构建步骤解析
编者按:本文作者Sara Robinson在Medium上发布了一个有趣的项目,她自制了一款APP,能自动识别歌手Taylor Swift。这与我们之前介绍的寻找威利项目很像。该教程非常详细,有兴趣的同学可以学习一下,动手做一个自己的图像识别工具哦~本文已获作者授权,以下是对原文的编译。
注:由于写作本文时TensorFlow没有Swift库,我用Swift构建了针对我的模型的预测请求的APP。
以下就是我们创建的APP:
TensorFlow物体检测API能让你识别出一张图片中特定物体的位置,这可以应用到许多有趣的程序上。不过我平常拍人比较多,所以就想把这一技术应用到人脸识别上。结果发现模型表现得非常好!也就是上图我创建的Taylor Swift检测器。
本文将列出模型的构建步骤,从收集Taylor Swift的照片到模型的训练:
对图像进行预处理,改变大小、贴标签、将它们分成训练和测试两部分,并修改成Pascal VOC格式;
将图片转化成TFRecords文件以符合物体检测API;
利用MobileNet在谷歌Cloud ML Engine上训练模型;
导出训练好的模型并将其部署到ML Engine上进行服务;
构建一个iOS前端,根据训练好的模型做出预测请求(使用Swift)。
下面是各部分如何结合在一起的架构图:
在开始之前,首先要解释一下我们即将用到的技术和术语:TensorFlow物体检测API是一个构建在TensorFlow上的框架,用于识别图像中特定的对象。例如,你可以用很多猫的照片训练它,一旦训练完毕,你可以输入一张猫的图像,它就会输出一个方框列表,认为图像中有一只猫。虽然它的名字中含有API,但是你可以将它更多地想象成用于迁移学习的一套便利的工具。
但是,训练模型识别图像中的对象是个费时费力的活。物体检测最酷的地方就是它支持五个预训练模型的迁移学习(transfer learning),那么什么是迁移学习呢?比如,当儿童学习第一门语言时,他们会接触大量的例子,如果有错就会立刻被纠正过来。例如当孩子们学习识别猫时,他们的父母会指着图片上的猫,并说出&猫&这个词,这种重复增强了他们的脑回路。当它们学习如何识别一只狗时,无需从头开始,这一过程与猫的识别类似,只是学习对象不同。这就是迁移学习的工作原理。
但我没有时间寻找并标记数千个Taylor Swift的图像,但是我可以通过修改最后几个图层、在数百万张图像上训练的模型中提取特征,应用于TSwift的检测。
第一步:预处理图像
首先要感谢Dat Tran写的关于浣熊检测器的博客,地址:https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9
首先,我从谷歌图片上下载了200张Taylor Swift的照片,这里安利一个Chrome插件:Fatkun Batch Download Image,可以下载所有图片搜索结果。在打标签之前,我把图片分为两类:训练和测试。另外,我写了一个调整图片大小的脚本(https://github.com/sararob/tswift-detection/blob/master/resize.py),确保每张图的宽度不超过600px。
由于检测器会告诉我们图中的对象位置,所以你不能直接把图像和标签作为训练数据。你需要用边框将对象圈出来,以及将表框打上标签(在我们的数据集中,只需要一个标签tswift)。
打边框工具依然使用LabelImg,这是一个基于Python的程序,你只需输入带标签的图像,它就会输出一个xml文件,将每张照片都打上边框同时还有相关标签(不到一上午我就处理好200张图片了)。下面是它如何工作的(标签输入为tswift):
然后LabelImg生成一个xml文件:
tswift.jpg
/Desktop/tswift.jpg
Unspecified
现在我有了一张带有边框和标签的图片了,但是我还要把它转换成TensorFlow可接受的方式&&一个数据的二进制表示TFRecord。关于这一方法可以在GitHub上查看。要运行我的脚本,你需要先下载一个tensorflow/models,从tensorflow/models/research本地直接运行脚本,带上以下参数(运行两次:一次用于训练数据,一次用于测试数据)
python convert_labels_to_tfrecords.py \
--output_path=train.record \
--images_dir=path/to/your/training/images/ \
--labels_dir=path/to/training/label/xml/
第二步:训练检测器
我可以在笔记本电脑上训练这个模型,但是时间会很长,而且占用大量的资源。并且一旦我需要用电脑做别的事,训练就会中断。所以,我选择了云!我们可以利用云来运行多个跨核心的训练,几个小时内就能完成整个工作,并且用Cloud ML engine的速度比GPU还要快。
设置Cloud ML Engine
我准备将所有TFRecord格式的数据上传到云并开始训练。首先,我在谷歌云端控制台中创建了一个项目,并启用了Cloud ML Engine:
然后,我将创建一个云存储bucket来打包模型的所有资源。确保在指定区域进行存储(不要选择多个区域):
我将在这个bucket中/data子目录来放置训练和测试TFRecord的文件:
目标对象检测API还需要一个将标签映射到整数ID的pbtxt文件。由于我们只有一个标签,这个是非常短的:
name: &#39;tswift&#39;
添加MobileNet检查点进行迁移学习
因为我并非从零开始训练这个模型,所以当我运行训练时,我需要指向我将要建立的预训练模型。我选择使用MobileNet模型&&它是针对移动设备优化的一系列小模型。虽然我不会直接在移动设备上训练模型,但MobileNet将会快速训练,并允许更快的预测请求。我下载了这个MobileNet检查点用于训练,检查点是一个二进制文件,包含训练过程中特定点的TensorFlow模型的状态。下载并解压缩后,你可以看到它包含的三个文件:
以上所有都要用来训练模型,所以我将它们放在云存储bucket中的同一个data/目录中。
在开始训练之前,还需要添加一个文件。对象检测脚本需要一种方法查找模型的检查点、标签映射和训练数据。我们将用配置文件处理这一点。TF对象检测为五个预训练模型采集了样本配置文件。我们在这里为MobileNet使用一个,并且在云存储bucket的相应路径中更新了所有PATH_TO_BE_CONFIGURED占位符。除了将我的模型连接到云存储中的数据外,此文件还为我的模型配置了几个超参数,如卷积大小、激活函数和步骤。
以下是开始训练之前云存储bucket中我的/data中的所有文件:
我还会在bucket中创建train/和eval/子目录&&这是TensorFlow在训练和评估时书写模型检查点文件的地方。
现在已经准备好训练了,通过执行gcloud命令开始。请注意,你需要在本地复制tensorflow/models/research并从该目录运行此训练脚本:
# Run this script from tensorflow/models/research:
gcloud ml-engine jobs submit training ${YOUR_TRAINING_JOB_NAME} \
--job-dir=${YOUR_GCS_BUCKET}/train \
--packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz \
--module-name object_detection.train \
--region us-central1 \
--config object_detection/samples/cloud/cloud.yml \
--runtime-version=1.4
--train_dir=${YOUR_GCS_BUCKET}/train \
--pipeline_config_path=${YOUR_GCS_BUCKET}/data/ssd_mobilenet_v1_coco.config
训练的同时,我也开始了评估工作。我会使用之前从未见过的数据来评估模型的准确性:
# Run this script from tensorflow/models/research:
gcloud ml-engine jobs submit training ${YOUR_EVAL_JOB_NAME} \
--job-dir=${YOUR_GCS_BUCKET}/train \
--packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz \
--module-name object_detection.eval \
--region us-central1 \
--scale-tier BASIC_GPU \
--runtime-version=1.4
--checkpoint_dir=${YOUR_GCS_BUCKET}/train \
--eval_dir=${YOUR_GCS_BUCKET}/eval \
--pipeline_config_path=${YOUR_GCS_BUCKET}/data/ssd_mobilenet_v1_coco.config
你可以通过在云端控制台导航到ML Engine的&作业&部分来验证您的任务是否正确运行,并检查日志以查找特定作业:
第三步:部署预测模型
为了将模型部署到ML Engine,我需要将模型检查点转换为ProtoBuf。在我的train/bucket中,可以看到从几处保留的检查点文件:
文件的第一行告诉我最新的检查点路径&&我应从该检查点本地下载3个文件。每个检查点应该有一个.index,.meta,和.data文件。将它们保存在本地目录中后,我可以使用对象检测的export_inference_graph脚本将它们转换为ProtoBuf。要运行以下脚本,你需要定义MobileNet配置文件的本地路径、训练时下载的模型检查点编号以及要导出的图形目录名称:
# Run this script from tensorflow/models/research:
python object_detection/export_inference_graph.py \
--input_type encoded_image_string_tensor \
--pipeline_config_path ${LOCAL_PATH_TO_MOBILENET_CONFIG} \
--trained_checkpoint_prefix model.ckpt-${CHECKPOINT_NUMBER} \
--output_directory ${PATH_TO_YOUR_OUTPUT}.pb
这个脚本运行后,你将会在.pb输出目录中看到一个saved_model/目录。将saved_model.pb文件上传到你的云存储/data目录中(不要担心生成其他文件)。
现在你已经准备好将模型部署到ML Engine上了。首先,用gcloud创建你的模型:
gcloud ml-engine models create tswift_detector
然后,通过将模型指向刚刚上传到云存储的已保存的ProtoBuf来创建第一个模型版本:
gcloud ml-engine versions create v1 --model=tswift_detector --origin=gs://${YOUR_GCS_BUCKET}/data &--runtime-version=1.4
模型部署好后,我将用ML Engine的线上预测API生成新的预测图像。
第四步:使用Firebase函数和Swift构建预测客户端
我在Swift中编写了一个iOS客户端来对我的模型进行预测请求。Swift客户端将图像上传到云存储,云存储触发Firebase函数,在Node.js中发起预测请求,并将生成的预测图像和数据保存到云存储和Firebase中。
首先,在我的Swift客户端中,我添加了一个按钮,供用户访问设备的图片库。用户选择照片后,会触发将图像上传到云端存储的操作:
let firestore = Firestore.firestore()
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let imageURL = info[UIImagePickerControllerImageURL] as? URL
let imageName = imageURL?.lastPathComponent
let storageRef = storage.reference().child("images").child(imageName!)
storageRef.putFile(from: imageURL!, metadata: nil) { metadata, error in
if let error = error {
print(error)
print("Photo uploaded successfully!")
// TODO: create a listener for the image&#39;s prediction data in Firestore
dismiss(animated: true, completion: nil)
接下来,我编写了在上传到云存储时触发的Firebase函数(https://github.com/sararob/tswift-detection/blob/master/firebase/functions/index.js)。下面的代码也包含了我向ML Engine预测API发出请求的函数部分:
function cmlePredict(b64img, callback) {
return new Promise((resolve, reject) => {
google.auth.getApplicationDefault(function (err, authClient, projectId) {
if (err) {
reject(err);
if (authClient.createScopedRequired && authClient.createScopedRequired()) {
authClient = authClient.createScoped([
&#39;https://www.googleapis.com/auth/cloud-platform&#39;
var ml = google.ml({
version: &#39;v1&#39;
const params = {
auth: authClient,
name: &#39;projects/sara-cloud-ml/models/tswift_detector&#39;,
resource: {
instances: [
"inputs": {
"b64": b64img
ml.projects.predict(params, (err, result) => {
if (err) {
reject(err);
resolve(result);
在ML Engine的反应中,我们得到:
detection_boxes:可以用来标出Taylor Swift周围的边框;
detection_scores:为每个检测框架返回一个置信度值,其中只包括分数高于70%的检测;
detection_classes:告诉我们与检测相关的ID。在这种情况下,因为只有一个标签所以该值总为1。
在函数中,如果检测到Taylor,则用detection_boxes在图像中绘制一个边框以及生成置信度分数。然后将新的带有边框的图像保存到云中,将图像的文件路径写入Cloud Firestore,一边在iOS应用程序中读取路径并下载新图像:
const admin = require(&#39;firebase-admin&#39;);
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();
let outlinedImgPath = `outlined_img/${filePath.slice(7)}`;
let imageRef = db.collection(&#39;predicted_images&#39;).doc(filePath);
imageRef.set({
image_path: outlinedImgPath,
confidence: confidence
bucket.upload(&#39;/tmp/path/to/new/image&#39;, {destination: outlinedImgPath});
最后,在iOS应用程序中,我们可以监测图像Firestore路径的更新。如果检测到目标,我会下载这张图片并在应用程序中显示这张图以及可信度分数。这个函数将替换上一个代码片段中的注释:
self.firestore.collection("predicted_images").document(imageName!)
.addSnapshotListener { documentSnapshot, error in
if let error = error {
print("error occurred\(error)")
if (documentSnapshot?.exists)! {
let imageData = (documentSnapshot?.data())
self.visualizePrediction(imgData: imageData)
print("waiting for prediction data...")
好了!现在我们有一款Taylor Swift检测器了!注意,由于模型只用了140张图像进行训练,所以准确度不够高,可能会把其他人误认为是Taylor。但是,如果有时间的话,我会收集更多贴有标签的图片,并更新模型,发布到应用商店里。
文章来源专栏
加载更多评论
后参与评论}

我要回帖

更多关于 哪里能造美元 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信