我最近在 startuphuscle.xyz 上听到了Mycroft.ai的首席执行官 Joshua Montgomery讨论他的公司为将开源替代语音助手推向市场所做的努力。无论您拥有一张图像还是数十亿张图像,距离使用人工智能识别您的视觉内容仅几步之遥。
预测类型取决于您运行输入的模型。AI 已卸载到云中的 clarifai 服务器。基本上,您向 clarifai 发送一张图片,然后 clarifai 将在该图片中找到的一组标签/单词/概念发回给您。
Clarifai 提供的 api 是几种不同的语言,其中一种是 python。这使其非常适合与 Mycroft 技能一起使用,因为它们也是用 python 编写的。有一个非常慷慨的开发人员选项,无需任何费用即可使用,让您可以访问 clarifai 的标准模型以及创建和训练自己的模型的能力。
如果你想开始破解计算机视觉/机器学习项目,你真的应该考虑 clarifai。
使用 Mycroft Mark I
Mycroft Mark I 是一个“嵌入式”Linux 应用程序,在无头模式下运行在 Raspberry Pi 上。无头意味着您必须将显示器和键盘连接到 Mark I,或者最好使用ssh从计算机登录您的 Mark I。在 Mycroft 社区论坛中提供了有关执行此操作的全面信息,更一般地,在Derek Molloy 的 Exploring Raspberry Pi: Interface to the Real World with Embedded Linux 1st Edition 中。对于任何有兴趣超越使用 pi 的基础知识的制造商来说,这都是一本令人难以置信的书。
我不会在这里详细介绍,但这里有一些ssh提示:
- 在您的桌面/笔记本电脑上打开许多终端窗口
- 您可以将桌面上的文本剪切并粘贴到 nano 编辑器中
- 在您的 Mycroft 上下载并安装feh以查看图像
您可以在 feh 了解有关 feh 的更多信息- 一个快速轻便的图像查看器。为了使用 feh 通过 ssh 查看图像,请使用 -X 开关来打开 x windows 终端:
ssh -X
如果 x 终端窗口“超时”并且一段时间后不允许您查看,只需将其杀死并如上所述创建另一个 x 终端窗口。
将 PiCamera 添加到 Mycroft Mark I
Raspberry Pi 3 位于 Mycroft Mark 1 的核心,但 PiCamera 连接器没有暴露,因此您必须做一些手术来连接 PiCamera。我从 adafruit 购买了 2 米长的 PiCamera 带状电缆来连接相机。就长度而言,这可能有点矫枉过正,但太短会更糟。
下面的一组图片将对您有所帮助,但是正如您所见,PiCamera 功能区已经到位。这些照片是我事后拍的!但我认为你将能够跟随。
1. 第一步是取下脚垫。每个脚垫都隐藏着一颗螺丝。使用内六角扳手松开并取下它们。
2. 打开后,您将看到树莓派。不幸的是,必须从底层板上的柱子上取下 Pi,以露出 PiCamera 带状电缆连接器。
3. Raspberry Pi 已从柱子上取下,带状电缆连接器暴露在外。
4. 现在将带状电缆穿过机箱顶部的线性通风口。
5. 设置的最后一部分是为相机配备一个漂亮的外壳。在thingiverse上有很多你可以选择的。我已经尝试了好几次,到目前为止,我最喜欢的是migrassi 的PiCamera 2 Axis Rotating Holder,在下面可以看到它坐在 Mycroft 的顶部。我使用 GizmoDorks HIPS 3mm 在我的 lulzbot mini 上打印了它。支架和相机插槽需要一些打磨才能正确安装。将相机插入插槽时要小心。当我打印它时,它很合身!
手术成功,病人活了下来!将相机连接并放置在其外壳中后,请确保将您的 pi 配置为使用相机:
sudo raspi-config
然后,您将获得以下菜单并按下选项 5 接口选项。
然后从那里选择并按照提示进行操作。建议在此之后重新启动。
安装 Clarifai
请在开始安装 clarifai 之前通读一遍!否则在重新启动时,你会以僵尸 Mycroft 告终,深情地盯着你,但永远是黄色的眼睛,但默默无闻!
安装 clarifai python api 很简单:
pip install clarifai
但是,这样做会取消在 Mark 1 上运行的 Pillow 版本,并安装名为 Pillow 的库的 2.9.0 版本。因此,如果您在安装 clarifai 后出于任何原因重新启动 Mark I,Mycroft 将无法工作,但您仍然可以ssh进入它。快速查看/var/log/mycroft-skills.log可以看出:
Traceback (most recent call last): File "/usr/local/bin/mycroft-skills", line 9, in <module> from pkg_resources import load_entry_point File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 3147, in <module> @_call_aside File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 3131, in _call_aside f(*args, **kwargs) File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 3160, in _initialize_master_working_set working_set = WorkingSet._build_master() File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 668, in _build_master return cls._build_from_requirements(__requires__) File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 681, in _build_from_requirements dists = ws.resolve(reqs, Environment()) File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 870, in resolve raise DistributionNotFound(req, requirers) pkg_resources.DistributionNotFound: The 'pillow==4.1.1' distribution was not found and is required by mycroft-core
所以我们需要 4.1.1 版本的 Pillow,而不是 clarifai 安装的 2.9.0!但不要只是 sudo pip install Pillow 因为这将安装 Pillow 5.0.0 而 Mycrfot 将无法使用它。而是卸载 Pillow 并强制安装 4.1.1 版本:
sudo pip install Pillow==4.1.1
但我们还没有到那里!重新启动后,我仍然得到了黄疸和沉默的治疗!再次查看/var/log/mycroft-skills.log显示:
Traceback (most recent call last): File "/usr/local/bin/mycroft-skills", line 9, in <module> from pkg_resources import load_entry_point ... pkg_resources.DistributionNotFound: The 'future==0.16.0' distribution was not found and is required by mycroft-core
所以我只是发出了以下命令,
sudo pip install future=0.16.0
闭上眼睛重新启动!他还活着!最后一步是确保您授予对 Mycroft 的访问权限以使用 PiCamera:
sudo usermod -a -G video mycroft
我不记得在我之前的 clarifai 和 mycroft 项目中必须经历所有这些,所以一定有一些变化。经验教训:始终阅读安装消息,并在出现问题时始终查看 /var/log/mycroft-skills.log。现在乐趣可以开始了!
使用 Clariai
clarifai python api 易于使用。我建议在尝试将其集成到技能中之前编写一些测试脚本并尝试一下。这将使您有机会熟悉它并解析它发回的 json 包。
此外,您可以调试大部分视觉功能,而不必在调试语音组件时担心这一点。完成此操作后,将 clarifai 方面融入您的技能非常容易,想想“剪切和粘贴”。
clarifai文档是必读的,我有几个项目也会对您有所帮助:
在这篇文章中,我将专注于创建和训练自定义模型。继续为您注册免费的 clarifai 开发者帐户,获取您的 api 密钥并创建一个应用程序!
创建、训练和使用自定义模型
Clarifai 有许多现成可用的训练模型,例如颜色、名人、旅行等等。然而,他们没有“石头剪刀布”模型。这就是定制模型发挥作用的地方。clarifai 文档中详细描述了创建自定义模型。我将在这里展示我如何应用该过程来创建我的“石头剪刀布”模型。
定制模型流程:
- 添加带有相关概念的图像
- 创建模型
- 训练模型
- 使用模型
我用作创建和训练模型的实用程序的所有脚本的完整代码都在我的 github 页面上。
我在石头、纸或剪刀的每个位置制作了手的图像。这些是用 iPhone 拍摄的照片,我用我自己、我的妻子和儿子作为“手”模型。然后我制作了一个简单粗暴的脚本,用我的概念而不是概念将这些图像“上传”到 clarifai。我分别加载每个图像:
clarifai_app.inputs.create_image_from_filename(filename="rock1.jpg", concepts=['rock'], not_concepts=['paper','scissors'])
添加所有具有相关概念的图像后,您必须创建模型。这非常简单,只需要一行代码。
model = clarifai_app.models.create('rockpaperscissors', concepts=['rock','paper','scissors'])
模型 id 只是您给它的名称,在本例中为“rockpaperscissors”。您的图像已加载,您的模型已制作完成。现在,您的模型将需要一些培训才能正常工作:
from clarifai.rest import ClarifaiApp app = ClarifaiApp(api_key='YOU API KEY HERE') model = app.models.get('rockpaperscissors') model.train()
Clarifai 不仅返回概念,还将返回一个关联值,该值表示 clarifai 对它所报告的概念在图像中的信心程度。
当我在对初始图像进行训练后首次测试模型时,模型将所有东西都识别为具有高置信度值的岩石。所以你需要做一些后续培训。我训练了用 iPhone 拍摄的图像,石头、纸和剪刀各 10 个。现在我正在查看来自我办公桌上 PiCamera 的图像。
所以为了进一步训练模型,我做了一个简单的命令行菜单驱动脚本。我在 ssh 的 Mark I 命令行上运行它。我也可以将这个过程整合到 Mycroft 技能中。也许我会,但为了让模型尽快训练并运行,我去了 cli old school!
以下是显示使用 testModel.py 脚本运行的输出跟踪。概念右侧的值表示已在图片中观察到概念的置信度。
------------------------------ RPS - TEST MODEL MENU ------------------------------ 0. Exit 1. Take Test picture ------------------------------ Enter your choice [0-1] : 1 Taking a picture... scissors : 0.98923486 paper : 0.005966468 rock : 6.13205e-05 Enter your choice [0-1] : 1 Taking a picture... scissors : 0.9895846 paper : 0.0037088227 rock : 0.0001315531 Enter your choice [0-1] : 1 Taking a picture... paper : 0.95485735 scissors : 0.22752154 rock : 0.00014038719 Enter your choice [0-1] : 1 Taking a picture... paper : 0.89271563 scissors : 0.1276629 rock : 0.00030472572
使用这个脚本,我测试了 20 轮 RPS 的随机序列。在本次训练中,模型已经使用我的手在 63 张图像(Rock 18、Paper 24、Scissors 21)上进行了训练。我的模型 80% 正确。Clarifai 有一个模型浏览器,可让您查看图像、概念、标签、值等。这是自定义模型的关键工具。
Clarifai 模型浏览器视图通过查看这些图像以及使用 testModel.py 脚本返回给我的值。我可以看到,我没有在岩石图像上训练它足够“手掌”,并且模型与岩石和纸张最“混淆”。所以我使用我的 trainModel.py 脚本用 5 个以上的岩石和图像以及 4 个以上的纸质图像来训练模型。在此之后,使用相同的序列,clarfiai 定制模型得分 90%!现在我担心这个模型正在学习我的手,所以我让我儿子浏览了同样的 20 张图像。. .得分75%!怀疑得到证实。
使用这些知识,在未来,我将把模型训练给更多的人,来自不同的人。此外,我并没有真正正确使用返回的分数。返回的一些分数彼此非常接近。我们可以利用这一事实让 Mycroft 要求再进行一轮,而不是回答错误或对冲并要求确认。我们还可以使用一种训练机制,让 mycroft 定期要求确认,尤其是在置信度值接近时。
借助慷慨的免费开发人员选项以及对图像和操作的较大允许限制,我们可以轻松地改进这个模型。事实上,仅用 10 张图片就可以看到模型从 80% 提高到 90%,这向我展示了我们可以多快将其打造为可靠且通用的模型。
技能
一旦我确信我的自定义 clarifai 模型运行良好,我就准备将其纳入一项技能中。有关创建 Mycroft 技能的一般信息,请参阅。我将重点介绍我在这里找到的一些重要方面。
Mycroft 技能位于 /opt/mycroft/skills 文件夹中。此文件夹中的每个文件夹都代表一项技能。
该技能的目录结构比较简单。主要操作发生在__init__.py文件中。在这里,我们创建技能并创建一个列表,以包含稍后在游戏和游戏逻辑中使用的单词。
class RockPaperScissorsSkill(MycroftSkill): def __init__(self): super(RockPaperScissorsSkill, self).__init__(name="RockPaperScissorsSkill") self.gameChoices = ['rock','paper','scissors']
Mycroft 可以通过使用适应意图解析器或 Padatious 来确定您想要运行的技能。Adapt 将.vocab文件中的关键字与话语中检测到的词(您在唤醒词“Hey Mycroft”之后所说的)匹配。Padatious 使用神经网络模式匹配方法将话语与.vocab文件中的句子进行比较。
我喜欢 Padatious 方法,因为它允许您对自然语言非常接近地建模话语。每种方法都有其优点和缺点,但对于自然发音短语的快速技能发展,我更喜欢 Padatious。它还没有真正支持会话上下文,这是一个减号,但我认为这将在未来发生变化。
在初始化函数中,我们创建了 clarifai 应用程序并使用它来访问我们之前创建的rockpaperscissors模型。创建您的 clarifai 帐户和应用程序后,“api_key”对您来说是唯一的。我将它放在技能目录的 settings.json 文件中以增加灵活性。
def initialize(self): self.load_data_files(dirname(__file__)) self.clarifai_app = ClarifaiApp(api_key=self.settings["api_key"]) self.rpsModel = self.clarifai_app.models.get('rockpaperscissors') self.register_intent_file('rps.intent',self.handle_rps)
一项技能可以根据所说的内容(识别的话语)执行许多任务。这些话语中的每一个都与一个处理程序配对。在这种情况下,只有一个处理程序def handle_rps()。您可以在这里看到 Mycroft 没有作弊,他只是随机选择石头、纸或剪刀,并且这个“选择”保存在一个列表中。Mycroft 的选择保存在索引 0 中。然后他提示玩家选择。这可以通过对话文件来完成,然后您可以为开始提示添加一些变化,因为对话文件中的行将被随机选择。我只是在这里保持简单,并使用了self.speak()函数。
def handle_rps(self,message): rpsRound = [] rpsRound.append(self.mycroftChoice()) self.speak("O K lets play") self.speak("rock paper scissors go") rpsRound.append(self.playerChoice()) self.speak("i chose " + rpsRound[0]) self.speak("you chose " + rpsRound[1]) self.gameLogic(rpsRound)
然后,Mycroft 将通过评估来自 clarifai 自定义模型的响应来确定玩家选择了什么。
def playerChoice(self): self.take_picture() resp = self.rpsModel.predict_by_filename(self.settings["img_location"] + 'rps.jpg') return self.parseResponse(resp)
。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !