Author: Localization Team


AWS 和加州理工学院通过新的研究协作携手加快人工智能和机器学习的发展

从自主机器人到最前沿的计算机视觉,加州理工学院和 Amazon 具有很多共同点,包括二者都认为打破人工智能 (AI) 和机器学习 (ML) 的边界不仅会颠覆各个行业,还会从根本上改变科学研究的本质。我们相信这些技术有可能改变诸如工业自动化、机器人、癌症研究、神经科学等领域,甚至帮助发现下一个引力子!

今天,我们宣布两家组织建立研究合作伙伴关系,以推动对人工智能、数据科学和机器学习的研究。

作为为期两年且可延长的合作伙伴关系的一部分,Amazon 将以资助研究生奖学金的形式提供财务支持,以 AWS 云积分的形式提供计算资源,以加速加州理工学院师生在这些领域中的工作。团队将借助 AWS 云 (包括最前沿的 Nvidia GPU 实例),使用 Apache MXNet 等开源项目训练深度神经网络,以及协作突破人工智能的基础性限制。合作关系包括加州理工学院计算和数学科学 (CMS) 系和电气工程 (EE) 系的研究人员,以及在加州理工学院从事其他 AI/ML 应用工作的研究人员,包括与新落成的自主系统技术中心 (CAST)、最近宣布成立的陈神经科学研究院以及世界著名的喷气推动硏究室 (JPL) 等开展协作的研究人员。加州理工学院是一个真正可以进行跨学科研究的地方,我们不对他们的人工智能研究类型施加任何限制 – 我们希望团队能够大胆设想,大胆创新!

这种合作关系也是加州理工学院和 AWS 之间已经开展的合作的一种自然延伸。AWS ML 研究团队的多名成员,包括 Anima Anandkumar 和 Pietro Perona 在内,都会在 Amazon 和加州理工学院之间分配他们的时间。除这两个人外,领导合作关系的主要研究人员包括:

Aaron Ames
机械与土木工程及控制动力系统 Bren 教授

Ames 教授的研究方向为机器人、非线性控制、混合系统、自治和网络物理系统,重点是机器人系统的基础理论和实验实现。他的实验室设计、构建和测试新型双足机器人和假肢,目标是实现像人类一样行走的双足机器人,并将这些功能转化为机器人辅助设备。


Animashree (Anima) Anandkumar
AWS 首席科学家兼计算和数学科学系 Bren 教授

Anandkumar 教授的研究兴趣在大规模机器学习、非凸优化和高维统计等领域。特别是,她是开发和分析机器学习张量算法的先锋。张量分解方法属于尴尬平行并可扩展到巨大的数据集。它们保证收敛到全局最优,并对许多概率模型 (如主题模型、社区模型和隐马尔可夫模型) 提供一致的估计。更通俗地讲,Anandkumar 教授一直在研究高效的技术来加快非凸优化,如有效避开鞍点。


Pietro Perona
Amazon 研究员兼 Allen E. Puckett 电气工程教授

Perona 教授的研究在理解我们如何看和如何建造会“看”的机器方面起到了关键作用。Perona 教授的主要研究领域是视觉识别,更具体地说就是视觉分类。他正在研究机器如何能够以最少的人类监督学会识别青蛙、汽车、面孔和树木,以及我们如何让大型图像集合,甚至是 Web 可以按图像内容进行搜索。通过与研究员 Anderson 和 Dickinson 合作,Perona 教授正在建立视觉系统和统计技术来衡量果蝇和小鼠的行为和活动。这使得遗传学家和神经行为学家可以探究基因、大脑和行为之间的关系。Perona 教授还对研究人类如何执行视觉任务 (如搜索和识别图像内容) 感兴趣。他最近的一个项目是研究如何利用网络上数以千计人的视觉能力来分类和搜索图像内容。


Joel A. Tropp
Steele Family 应用与计算数学系教授

Tropp 教授的工作涉及应用数学、电气工程、计算机科学和统计学。其研究涵盖数据分析的理论和计算方面、稀疏建模、随机线性代数和随机矩阵理论。


Adam Wierman
计算和数学科学系教授;计算和数学科学系执行干事;信息科学与技术系主任

Wierman 教授的研究集中在三个看似截然不同的领域:云计算、经济和能源。尽管很多样化,但是这些领域对于他的更广泛的研究目标来说都至关重要:轻松地将可再生能源纳入 IT,更通俗地讲就是纳入电网。他的工作在领域和技术方面也呈现出多样性。这些工作利用算法、网络、运筹学、经济学和控制等工具,并且从理论开始,一直到产业转移。


Yisong Yue
计算与数学科学系助理教授

Yue 教授的研究兴趣主要在于统计机器学习的理论和应用。他对开发结构化预测、时空推理、自适应学习系统以及在循环中与人类一道学习的新方法特别感兴趣。过去,他的研究已经应用于信息检索、内容推荐、文本分类、从丰富的用户界面学习、分析隐含的人类反馈、数据驱动的动画、运动分析、机器人策略学习以及自适应路由和分配问题。

我们很高兴能够将来自两个团队的才华横溢的人才汇聚在一起,并在合作中分享成果。在 Twitter 上关注我们:#Caltech#AmazonAI

作者简介

Joseph Spisak 负责领导 AWS 的合作伙伴生态系统,重点关注人工智能和机器学习。他在 Amazon、Intel 和 Motorola 等公司获得了 17 年以上的丰富技术经验,主要研究视频、机器学习和人工智能。闲暇时,他喜欢打冰球和阅读科幻小说。

Adam Wierman 是加州理工学院的计算和数学科学系教授。Wierman 教授的研究集中在三个看似截然不同的领域:云计算、经济和能源。

Whooshkaa + Amazon Polly:结合阅读与收听,拓宽发布渠道

本文是特邀文章,由 Whooshkaa 的创始人兼 CEO Robert Loewenthal 撰写。

Whooshkaa 总部位于澳大利亚,提供创新的点播式音频播客平台,帮助出版商和广告商赢得听众。我们一直在尝试新的产品和方法,并将二者结合起来,为我们的客户开创全新的解决方案。

Amazon Polly 文本转语音 (TTS) 功能的采用就是极好的例证。很多顶级出版商、体育机构,以及澳大利亚最大的电信公司已在使用 Amazon Polly 来扩充其既有的发行方式。

这些传统信息提供商发现,客户现在不只需要阅读信息,还希望能够收听信息。借助 Amazon Polly TTS,Whooshkaa 让信息提供商能够用 48 种语音和 24 种语言向听众发布信息。

今年早些时候,Amazon Polly 为澳大利亚的主要全国性报纸《The Australian》提供语音版本。订阅者在驾车、锻炼或其他不方便阅读的情况下可以收听 Amazon Polly 朗读的新闻报道、食谱或体育赛事比分。

通过 Amazon Polly,Whooshkaa 的优秀合作伙伴可以方便地选择任何新闻报道,在几秒之内将文本转换为播客内容。我们还提供一些工具,可以合并多个报道,并通过更改口音、音调、速度和音量对声音进行自定义。

Whooshkaa 有庞大的发布网络,也就是说,听众可以选择多种方式来收听内容。最直接的选择是听众常用的播客应用程序。不过,因为 Whooshkaa 与 Facebook 存在独特的合作关系,我们的播客可以通过 Facebook 的音频播放器播放。我们的 Web 播放器可进行自定义,在 Twitter 上也受支持,实际上它可以嵌入任何网站。

我们相信,当这项技术成熟时,出版商能够以任何语言在世界上任何地方提供其新闻报道。新闻报道可以根据听众的偏好和需求进行自定义。

我们还与澳大利亚最大的电信公司 Telstra 和澳大利亚全国橄榄球联赛合作,通过任何联网的智能播音设备发布用户最爱球队的现场比分。用户可以直接向其设备询问当前比分,设备能够立即播报结果。

我们的开发人员 Christian Carlsson 认为,Amazon Polly TTS 的即时性和对各种语言的广泛支持可以为各类出版商带来无限机会。

“通过将功能强大的 Whooshkaa 平台与人工智能集成,我们现在可以在 30 秒内从文字创建完全自动化的播客内容,而这仅仅是开始。”Carlsson 说。

AFL 集成的技术实现

澳大利亚橄榄球联赛 (AFL) 希望粉丝们可以通过与智能播音设备进行语音互动来关注其最爱的球队。为此,Whooshkaa 需要创建一个 RSS 源,每两分钟更新一次,以提供最新结果。下面是我们实现方法的简单概图。

为触发 AFL 的 API 爬网 (其中包含我们需要的数据),我们开发了一个简单的 AWS Lambda 函数来调用 API。该 Whooshkaa API 提取数据、分析数据,然后将数据转换为语音,通过新创建的 RSS 源发布到 Amazon S3。

首先,我们编写 serverless.yml 文件,它负责每两分钟初始化一次请求。这没有什么出奇之处。

Serverless.yml:
createAFLFeeds:
 handler: api.createAFLFeeds
 events:
   - schedule:
       rate: rate(2 minutes)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}

这就会触发以下代码:

WhooshkaaAPI.js
createAFLFeeds() {
    return new Promise((resolve, reject) => {
      this.fetchAFLTeams().then(result => {
        for (const team of result) {
          this.createAFLFeedByTeamID(team['id']);
        }
      }, error => {
        console.log(error);
        reject(error);
      });
      resolve({message: "success"});
    });
}

接下来, createAFLFeedByTeamID 方法向我们的终端节点发送 POST 请求,终端节点执行以下操作:

  1. 从 AFL API 获取数据。为使此方法尽可能易读,数据标准化功能已分离到单独的 AFL 程序包。待分析数据由几个不同的条件确定。如果某个球队正在比赛或者在之前 24 小时内进行过比赛,则获取其比赛数据,否则默认获取该球队的最新新闻。
  2. 通过在 Amazon S3 中存储所返回数据的哈希,确保这些数据是新的。$this->publisher 也是一个抽象类,它包含三个不同存储适配器:本地、Whooshkaa S3 存储桶和 AFL S3 存储桶。我们使用本地适配器处理数据,使用 Whooshkaa S3 存储桶存储相应哈希,将生成的 RSS 源发布到 AFL S3 存储桶。
  3. 通过 Amazon Polly 获取文本并将其转换为音频流。您可以在 makeAudio 方法中看到我们如何处理某些字词,使之按我们的预期发音。例如,体育场馆 MCG 之前被理解成了“McGee”,于是我们改为让 Amazon Polly 逐个字母地读出来。
  4. 创建 RSS 源,将它发布到 AFL 的 S3 存储桶。
AFLController.php:
public function team(string $id)
{
    if (!$team = Team::findById($id)) {
        $this->response->errorNotFound('Invalid team ID.');
    }

    if ($team->isPlayingOrHasRecentlyPlayed()) {
        $story = $team->match;
    } else {
        $story = $team->news;
    }

    $this->publisher->setTeamId($id);
    $this->publisher->setStory($story->getStory());

    $hash = Hash::make($story, $this->publisher->getRemoteStorageAdapter());
    if ($hasBeenUpdated = $hash->hasBeenUpdated()) {
        $fileName = $this->publisher->getFileName();

        $audio = $this->makeAudio($story);
        $this->publisher->store($fileName, $audio->getContent());

        $feed = $this->makeFeed($team, $story);
        $this->publisher->store('feed.xml', $feed->getContent());

        $this->publisher->moveToCloud([$fileName, 'feed.xml']);
        $this->publisher->cleanUp();

        $hash->store();
    }

    return response([
        'rss' => $this->publisher->getRemoteUrl('feed.xml'),
        'updated' => $hasBeenUpdated,
    ]);
}

private function makeAudio($story)
{
   $polly = new Polly;
   $polly->setPhonemes(['live' => 'laɪve']);
   $polly->setProsody('AFL', ['rate' => 'fast']);
   $polly->setSayAs(['MCG' => 'spell-out']);

   $text = $story->getStory();
   // Trim the text to a maximum of 1500 characters.
   if (strlen($text) > 1499) {
       $text = $this->text->setText($text)->trimToWordBoundary(1499);
   }

   try {
       $audioStream = $polly->fetchAudioStream($text);
   }
   catch (\Exception $e) {
       $this->response->error($e->getMessage(), $e->getStatusCode());
   }

   return response()->make($audioStream)->header('Content-Type', 'audio/mpeg');
}

private function makeFeed(Team $team, $story)
{
   $feed = new Feed($this->publisher->getRemoteURL('feed.xml'));
   $feed->setTitle($team->getName() . "'s Official Live Feed");
   $feed->setDescription('An official live feed from the Australian Football League.');
   $feed->setLink('http://www.afl.com.au');
   $feed->setOwner('The Australian Football League', 'podcast@afl.com.au');
   $feed->setImage($team->getImage());
   $feed->appendElements([
       'itunes:subtitle' => "Follow {$team->getName()}'s Live Matches and Latest News",
       'itunes:explicit' => 'no',
       'language' => 'en-us',
       'lastBuildDate' => Carbon::now('UTC')->toRssString(),
       'ttl' => 2,
       'copyright' => 'The Australian Football League',
   ]);

   $feed->setCategories([
       'Sports & Recreation' => [
           'Professional',
       ]
   ]);

   $fileName = $this->publisher->getFileName();
   $metaData = $this->getMetaData($fileName);

   $item = $feed->addItem([
       'title' => $story->getTitle(),
       'link' => $story->getArticleURL(),
       'pubDate' => Carbon::now('UTC')->toRssString(),
       'itunes:duration' => $metaData['playtime_string'],
   ]);
   $item->appendDescription($story->getStory());
   $item->appendEnclosure($this->publisher->getRemoteUrl($fileName, true), $metaData['filesize'], $metaData['mime_type']);
   $item->append('itunes:image', null, ['href' => $team->getImage()]);
   $item->append('guid', $this->publisher->getGuid(), ['isPermaLink' => 'false']);

   return response()->make($feed->output())->header('Content-Type', 'text/xml');
}

《The Australian》“Daily News”的技术实现

The Australian 是 News Corp 旗下的报纸发行商。他们需要将每日 10 大头条新闻以音频形式提供给听众,并且要求头条新闻以播客形式每天更新五次。集成 Amazon Polly 让我们轻松实现了这些要求。下面是我们实现方法的简单概图。

此实现与 AFL 集成非常相似,但有一处不同。这次不生成 RSS 源,而是将播客发布到《The Australian》Whooshkaa 账户上的一栏指定节目。这样,内容几乎能够在 iTunes、Pocket Casts 或其他任何播客播放器中随即播放。

为了完成此实现,我们像之前在 AFL 实现中所做的那样,开发了一个 AWS Lambda 函数,这是因为我们需要在一天中几个特定时间触发“Daily News”终端节点。

Serverless.yml
createDailyNewsStory:
 handler: api.createDailyNewsStory
 events:
   - schedule:
       rate: cron(0 2,6,10,22 * * ? *)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}
   - schedule:
       rate: cron(30 14 * * ? *)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}
WhooshkaaAPI.js
createDailyNewsStory() {
 const options = {
   hostname: this.commonOptions.hostname,
   port: this.commonOptions.port,
   path: '/news-corp/daily-news',
   method: 'POST',
 };
 return new Promise((resolve, reject) => {
   this.sendRequest(options).then(result => {
     return resolve(result);
   }, error => {
     console.log(error);
     return reject('Could not create "Daily News" story.');
   });
 });
}

接下来, createDailyNewsStory 处理程序调用 createDailyNewsStory 函数,该函数通过我们的 API 触发 dailyNews 终端节点,如下所示。

NewsCorpController.php
public function dailyNews()
{
   $show = Show::find(DailyNewsStory::SHOW_ID);
   $storyBuilder = new StoryBuilder($show);

   $dateTime = Carbon::now('Australia/Sydney')->format('F j (g:00 a)');
   $title = $show->title . ' - ' . $dateTime;

   $story = new DailyNewsStory;
   $story->setLimit(10);
   $story->setTitle($title);
   $story->setDescription($title);

   $episode = $storyBuilder->fetch($story)->publish();

   return $this->response->item($episode, new EpisodesTransformer);
}

DailyNewsStory 扩展 StoryBase 类,该类对 NewsCorpApi 类进行依赖关系注入。来自 DailyNewsStory 的值传递到 NewsCorpApi 类,该类用于获取和标准化数据。

接下来,为获取的所有报道生成音频,以单集形式发布。这是通过 StoryBuilder 类实现的,如下所示。

StoryBuilder.php
public function publish()
{
   $title = $this->story->getTitle();
   $description = $this->story->getDescription();

   if (!$episode = $this->episodes->findByTitleAndDescription($title, $description)) {
       $audio = $this->makeAudio();
       $fileName = $this->storage->putContent($audio->content(), Polly::OUTPUT_FORMAT);

       $data = [
           'podcast_id' => $this->show->id,
           'title' => $title,
           'description' => $description,
           'media_file' => $fileName,
           'length' => $this->storage->getSize($fileName),
       ];

       $episode = $this->episodes->create($data);
   }

   return $episode;
}

public function makeAudio()
{
   $polly = new Polly;

   $audioStream = null;
   foreach ($this->story->getBody() as $body) {
       $audioStream .= $polly->makeAudioStream($body);
   }

   return $polly->makeAudioResponse($audioStream);
}

循环执行 $this->story->getBody() 因为它是包含前述所有 10 条报道的数组。这将通过 Amazon Polly 创建持续的音频流。然后音频流以 mp3 文件形式上传到 S3 存储桶,文件名和其余信息保存到数据库并在请求时返回。

我们很多客户生成大量的丰富内容。我们为他们提供由 Amazon Polly 支持的平台,将其内容转换为音频,然后进行发布、分析和商业化。一家新闻出版商计划通过 Whooshkaa 和 Amazon Polly 文本转语音功能提供其食谱库。

Whooshkaa 一直在寻求音频创新方法。我们寻找新的市场和技术为创作者提供最庞大的发布网络。我们发现,传统出版商和 Amazon Polly 能够成功结合。


作者简介

Robert Loewenthal 是 Whooshkaa 的创始人兼 CEO。Whooshkaa 总部位于澳大利亚悉尼市,是一家提供全方位音频点播服务的公司,可帮助创作者和品牌生成、托管、共享、跟踪内容并进行内容货币化。

AWS DeepLens 扩展:自建项目

AWS DeepLens 提供了极好的机会来学习新技术,例如深度学习和物联网 (IoT),以及构建可以解决实际问题的创新系统。该设备和服务附带有一组预定义的项目,使得从头开始运行非常简单。它设计作为开放平台,使得新手和有经验的开发人员都能构建 (和分享) 新的激动人心的项目。

在本博客文章中,您将逐步完成构建自己项目的过程,包括以下步骤:

  • 训练深度学习模型 (使用 Amazon SageMaker)
  • 优化经过训练的模型以在 AWS DeepLens 边缘设备上运行
  • 开发 AWS Lambda 函数以加载模型并用于在视频流上运行推理
  • 使用 AWS Greengrass 将 AWS Lambda 函数部署到 AWS DeepLens 设备
  • 将边缘 AWS Lambda 函数传递到云中,用于发送命令和接收推理输出
  • 营利

训练深度学习模型 (使用 Amazon SageMaker)

Amazon SageMaker 是面向繁重的数据科学的另一项新服务。它汲取了 Amazon 数据科学家在 Amazon.com 众多业务领域的多年经验,从建议引擎到 Alexa、Amazon Go、Amazon Robotics 乃至其他无穷的基于机器学习的系统。

虽然本篇博客帖子所涵盖的内容极为有趣,不过设计和构建良好机器学习模型的完整过程远不止这些。实际上,通过将深度学习模型部署到 DeepLens 设备,然后传输回来并从输出中获益,一旦通过这个流程实现生产,您就会发现自己会有越来越多的时间构建模型,来解决真实世界的新问题。

对于机器学习新手以及数据科学专家而言,当您在 Amazon SageMaker 中启动 Notebook 实例时,Jupyter Notebook 中提供的一组 Notebook 是一个很好的起点。例如,这里有一个 Notebook,展示了两个流程,一个是转换学习,另一个是使用 Amazon SageMaker 开发工具包构建、训练和部署经过调整的深度学习模型工作流,用于推理终端节点托管。

在本篇博客帖子中,您的重点是将模型项目保存到 Amazon S3 中以启用流程中的后续步骤。

以下示例模型使用 SageMaker 中的训练作业进行训练,包括输出目录以及在其训练中使用的超级参数:

超级参数可帮助您了解如何使用模型。例如,根据 image_shape (3,224,224),我们知道您可以处理彩色图像 (3=RGB 通道),并且需要将其大小调整为 224*224 像素。它还有助于在未来的训练作业中获得更准确的模型,例如,对训练数据 (epochs>2) 运行更多次数,更改 learning_rate 以及添加更多 num_training_samples。

优化经过训练的模型以在 AWS DeepLens 边缘设备上运行

对 DeepLens 设备模型进行硬件优化的步骤是它在任何实际深度学习系统中的重要示例。在之前的步骤中,您拥有几乎无限的云资源用于模型训练,但是,当您希望使用模型进行推理时,面临着一系列的业务约束,主要与业务规模有关。在云中,您可以轻松获得基于 GPU 的大量实例,并可以在很多小时数的训练中运行多个实验。但是,当您要将模型部署到边缘设备时,您需要考虑芯片集 (CPU/GPU)、内存、网络带宽和稳定性等各种设备规格。您的 DeepLens 设备可能会足够强大,能够在高帧率的高分辨率视频流上运行多个模型,不过多数情况下您需要在较低规格的设备上运行。因此,Intel 开发了库,获取 MXNet 模型的构件,并根据 DeepLens 设备中的 Intel 芯片板进行优化。从前一步骤导入模型之后,当您通过 DeepLens 控制台部署模型时,此库自动执行。

完成训练模型后,在将模型导入到 DeepLens 时,您可以指向训练作业 ID。(请注意,Sagemaker 和 DeepLens 需要位于同一个 AWS 区域中才能导入。)

开发 AWS Lambda 函数以加载模型并用于在视频流上运行推理

运行在 IoT 设备 (在我们的案例中是 AWS DeepLens 摄像机) 上的 AWS Greengrass 核心能够运行部署到其中的 AWS Lambda Python 函数。在未来的帖子中,我们将探讨创建 Greengrass 组和核心以及准备和注册设备的步骤,您可以查看 Greengrass 文档中的入门指南。AWS DeepLens 可以自动完成其中的大部分步骤。我们可以侧重于开发 Lambda 函数以部署到所注册和配置的设备。

对于每个 Lambda 函数,请遵循以下步骤:

  • 加载模型
  • 捕获帧
  • 在帧上运行模型推理
  • 解析推理的结果
  • 将结果发布到 MQTT 主题

下面的一些示例是关于这些步骤中的每个步骤。

加载模型

AWS DeepLens 设备预安装了帮助程序库 awscam。利用这个库,您很容易就可以集中注意力于 Lambda 函数逻辑。它包装了大部分常用步骤,例如加载模型。如您在以下示例中所见,您需要提供模型 XML 文件的路径以及模型 (GPU/CPU) 的上下文,然后库会自动执行模型的加载和绑定:

import awscam
modelPath = "/opt/awscam/artifacts/mxnet_deploy_CaltechTransfer_224_FP16_FUSED.xml"
# 将模型加载到 GPU (对 CPU 使用 {"GPU": 0})
mcfg = {"GPU": 1}
model = awscam.Model(modelPath, mcfg)

请注意,此步骤应该在内部推导函数之外定义 (例如,下面的 greengrass_infer_image_run)。此步骤应仅运行一次,因为将模型从磁盘加载到内存再到 GPU 需要几秒钟。

捕获帧

可使用 OpenCV (cv2) 在深度学习模型之前 (调整大小) 和之后 (绘制框和标签) 来处理图像。由于各个模型在不同的输入规范上训练,因此第一步都需要将捕获的帧大小调整为合适的尺寸:

import cv2
input_width = 224
input_height = 224
ret, frame = awscam.getLastFrame()
# 调整帧大小以适应模型输入要求
frameResize = cv2.resize(frame, (input_width, input_height))

在帧上运行模型推理

帮助程序库 awscampredict 命令包装到简单 doInference 函数中,使得 Lambda 函数的这一部分非常简明:

# 在调整大小后的帧上运行模型推理
inferOutput = model.doInference(frameResize)

解析推理的结果

帮助程序库支持几个经典的计算机视觉问题:“classification”用于对象分类,即提供标签;“ssd”(“single-shot-multibox-detector”) 用于对象检测和本地化,为对象提供标签和边界框;以及“segmentation”,用于将图像细分为区域,并提供像素级别的输出 (例如,用于风格转换)。以下示例针对常见的“ssd”类型模型:

modelType = "ssd"
parsed_results = model.parseResult(modelType, inferOutput)['ssd']

将结果发布到 MQTT 主题

最后一部分是发送模型的输出。此逻辑取决于模型的类型以及您尝试解决的问题类型。其中一个简单输出是图像的标签,例如“狗/猫”或者“热狗/非热狗”,如以下示例所示。其他类型的输出还包括从人脸检测模型剪裁图像中的脸部并发送以进行面部识别,视频流中对象的边界框,或图像/视频的神经风格转换。从设备发送输出的最简单方法是通过 MQTT 使用 Greengrass 客户端,如以下代码所示。此通道可以支持文本消息,不过也支持经过文本编码之后的图像 (例如,带有边界框和标签)。

# 创建 greengrass 核心开发工具包客户端
client = greengrasssdk.client('iot-data')
iotTopic = 'iot-data'
for obj in parsed_results:
    if obj['prob'] > max_threshold:
        label = '{{"label":"{}", "prob":{:.2f}%'.format(outMap[obj['label']], obj['prob']*100 )
        client.publish(topic=iotTopic, payload = label)

使用 AWS Greengrass 将 AWS Lambda 函数部署到 DeepLens 设备

Greengrass 以两种主要模式运行 Lambda 函数:固定和按需。针对 AWS DeepLens 模型,推荐方法是使用固定选项作为 Lambda 函数的开始。这花的时间会很长,特别是在深度学习模型很大时 (数百 MB,甚至若干 GB)。您可以通过几种模式来控制触发推理的频率和时间:

  • 最高帧率 – 以无限循环方式运行函数,帧与帧之间没有“休眠”。根据模型推理、预处理和后处理的速度,您可以得到 10-30 FPS 的帧率。
  • 特定帧率 – 以无限循环方式运行函数,帧与帧之间具有预定义的“休眠”。一些任务 (例如人脸检测) 可以按照每秒 1-5 帧的速度运行,并提供检测某一区域中所有脸部时的必需功能。您可以使用 Timer 来控制函数推理的速率:
    from threading import Timer
    def greengrass_infer_image_run():
        # 读取图像
        # 预处理
        # 对图像运行模型推理
        # 解析结果
        # 输出结果
        
        # 异步调用此函数,在 1/2 秒后重新运行
        Timer(0.5, greengrass_infer_image_run).start()
  • 按需 – 每当您希望触发时运行函数,可以手动触发,也可以从其他事件触发。即使您在以固定方式运行函数,也可以使用事件处理程序来按需触发。以下示例演示了如何在每个事件上触发推理,不过您还可以使用事件处理程序,通过解析事件参数来进一步控制函数 (例如,切换模型或模型模式)。
    def greengrass_infer_image_run():
        # 读取图像
        # 预处理
        # 对图像运行模型推理
        # 解析结果
        # 输出结果
        
    def lambda_handler(event, context):
        client.publish(topic=iotTopic, payload="About to call image inference function")
        greengrass_infer_image_run()
    return

为您的 Lambda 函数获取 Greengrass 骨架有一种简单方法,这就是在 AWS Lambda 控制台中使用 Greengrass 蓝图之一,最好是 greengrassHelloWorld,因为在其程序包中已经包括了 Greengrass 客户端库。使用此蓝图创建 Lambda 函数并使用您的代码替换函数的 Python 代码,然后发布新创建的 Lambda 函数。现在您可以将它添加到项目,然后通过 AWS DeepLens 控制台将其部署到设备。

将本地 Lambda 函数传递到云中,用于发送命令和接收推理输出

如前文所述,Lambda 函数可以使用 IoT 主题通过 MQTT 协议写出其输出。内置项目使用的默认输出主题为:

iotTopic = '$aws/things/{}/infer'.format(os.environ['AWS_IOT_THING_NAME'])

您可以在 AWS DeepLens 控制台或 AWS IoT 控制台中找到此内容。在 Lambda 函数中,您可以选择使用相同的格式,也可以使用任何其他主题名称,例如前面示例中的 iotTopic = ‘iot-data’。

在前文中还可以看到,您能够使用 lambda_handler 以按需模式触发 Lambda 函数。为了实现这一点,您需要使用 IoT 控制台,在 IoT 云与 Lambda 函数之间设置订阅。例如,此处是对 Lambda 函数的入站和出站订阅 (ImageInferenceTest 版本 19):

在本例中,边缘 Lambda 函数侦听到主题“trigger-image-inference”,并在每次有事件发布到此主题时触发推理。使用第二个订阅可以查看边缘 Lambda 函数的输出消息,并在云端对其做出反应。例如,您可以使用 AWS IoT 规则引擎筛选特定消息 (例如“face detected”),然后将其发送到其他云端 Lambda 函数、Amazon Elasticsearch Service、Amazon Kinesis 等。请不要忘记部署 (在“Actions”下) 订阅以同样在 DeepLens 设备上启用订阅。

我们还建议您为设备的 Greengrass 组启用 Amazon CloudWatch Logs,以允许您查看 Lambda 函数的日志和 Greengrass 核心信息 (或调试) 日志。您可在 Greengrass 组控制台页的“Settings”部分下找到该设置。

结论

在本篇博客帖子中,您了解了如何扩展在 AWS DeepLens 中提供的开放项目环境。在以后的博客中,您将看到以这个流程为基础的更详细、更具体的示例,它们使用相同的结构和构建块。此处的图形展示了各种步骤,您可在扩展现有项目时 (采用更好的模型或不同 Lambda 函数) 或者从头开始创建全新项目时使用这些步骤。

如果您有任何疑问,请在评论中留言。


补充阅读

了解如何扩展 AWS DeepLens 以使用 AWS Lambda 发送 SMS 通知


作者简介

Guy Ernest 是 Amazon AI 的首席解决方案架构师。他有一个令人非常兴奋的机会来帮助塑造和践行策略,以构建思想共享并广泛使用适用于 AI、机器学习和深度学习使用案例的 Amazon 云计算平台。在空闲时间,他喜欢与妻子和家人呆在一起,收集一些令人尴尬的故事,然后在谈论 Amazon 和 AI 的未来时进行分享。

AWS Cloud9 – 云开发人员环境

就像任何工匠一样,您在开始编程时首先要了解的一点就是您的工具非常重要。Notepad.exe 可能无法很好地完成工作。一个强大的编辑器和测试管道可提高您的生产力。我仍然记得第一次学习使用 Vim,并且能够在系统和复杂的程序中进行压缩。您还记得在新计算机上设置所有编译器和依赖项有多难吗?您在匹配版本、摆弄配置,然后编写文档以便对项目的新开发人员进行入职培训上浪费了多少个周期?

今天,我们推出了 AWS Cloud9,它是一种用于在您的 Web 浏览器中编写、运行和调试代码的集成开发环境 (IDE)。Cloud9 自带了适用于许多常用编程语言 (Javascript、Python、PHP 等) 的基本工具,因此,您不必安装各种编译器和工具链。Cloud9 还提供了使用无服务器应用程序的无缝体验,使您能够快速地在本地和远程测试或调试之间切换。AWS Cloud9 以常用开放源 Ace Editor 和 c9.io IDE (我们去年已收购) 为基础,旨在使通过极其强大的结对编程功能进行的协作式云开发变得轻松。提供的功能比我在这篇文章中提及的功能多得多,为了快速细分,我将 IDE 划分为 3 个部分:编辑器、AWS 集成和协作。

编辑


Ace Editor 是 Cloud9 的核心,可让您快速、轻松和出色地编写代码。它遵循做一件事情就做好的 UNIX 哲学:编写代码。

它具有您期待的所有典型的 IDE 功能:实时语法检查、自动缩进、自动完成、代码折叠、拆分窗格、版本控制集成、多个光标和选择,并且它还有一些我想重点说明的独特功能。首先,它的速度很快,即使对于大型 (100000 行以上) 文件也是如此。键入时无滞后或其他问题。它内置了 20 多个主题 (过度曝光!),并且您也可以从 Sublime Text 或 TextMate 中引入您喜欢的所有主题。它内置了对项目的 40 多种语言模式和可自定义的运行配置的支持。但最重要的是,它具有 Vim 模式 (或 emacs,前提是您指定通过这种方式工作)。它还具有键绑定编辑器,可让您按需更改编辑器。

该编辑器支持强大的键盘导航和命令 (类似于 Sublime Text 或 vim 插件 (如 ctrlp))。在 Mac 上,借助 ⌘+P ,您可以使用模糊搜索在环境中打开任何文件。借助 ⌘+. ,您可以打开命令窗格,此窗格允许您通过键入名称来调用任何编辑器命令。它还有助于在窗格中显示命令的键绑定,例如,要打开到终端,您可按 ⌥+T。噢,我是否提过有一个终端?它附带了为访问资源而预配置的 AWS CLI。

该环境还附带了适用于许多常用语言的预安装调试工具 – 但并未限定您使用已安装的工具。可轻松添加新程序和定义新的运行配置。

不过,此编辑器只是一个公认的 IDE 中的重要组件。我想为您演示其他一些引人注目的功能。

AWS 集成

AWS Cloud9 IDE 是我用过的第一个真正的“原生云”IDE。该服务是免费提供的,您只需为基础计算和存储资源付费。在创建环境时,系统将提示您选择:实例类型和自动休眠时间,或对所选计算机的 SSH 访问权。

如果您是在 AWS 中运行,则自动休眠功能将在您停止使用 IDE 后立即停止您的实例。对于运行一个更持久的开发人员桌面来说,这样做可节省大量成本。您还可在 VPC 中启动它,以使它能够安全访问您的开发资源。如果您要在 AWS 之外或现有实例上运行 Cloud9,可提供对它将用于在外部计算机上创建环境的服务的 SSH 访问权限。您的环境已预置对您的 AWS 账户的自动和安全访问权限,因此,您不必担心复制凭证。我再说一遍:您可在任何地方运行 Cloud9。

使用 AWS Cloud9 进行无服务器开发

我在 Twitch 上花了很多时间来开发无服务器应用程序。我已部署几百种 lambda 函数和 API。Cloud9 使得对所有这些函数的使用都令人愉快。下面我为您演示其工作原理。


如果您看编辑器的右上角,将看到一个 AWS“Resources”选项卡。打开此选项卡后,您会看到您区域中的所有 lambda 函数 (可通过调整 AWS 首选项窗格中的区域首选项来查看其他区域中的函数)。

您只需双击这些远程函数,即可将它们导入您的本地工作区。这使您能够完全本地编辑、测试和调试您的无服务器应用程序。您还可轻松创建新的应用程序和函数。如果您单击窗格右上角的 Lambda 图标,系统将提示您创建新的 lambda 函数,并且 Cloud9 还将自动为您创建无服务器应用程序模型模板。IDE 附带了对预安装的常用 SAM 本地工具的支持。这是我将在我的大多数本地测试和无服务器开发中使用的工具。由于您具有终端,因此安装其他工具和使用其他无服务器框架都很简单。

从 AWS CodeStar 启动环境

有了 AWS CodeStar,您可轻松预置端到端持续交付工具链以便在 AWS 上进行开发。Codestar 提供了使用 AWS CodeCommit、CodeBuild、CodePipeline 和 CodeDeploy 服务套件构建、测试、部署和管理应用程序的一致体验。现在,只需几次单击,便能预置 Cloud9 环境以开发您的应用程序。将使用已签出 CodeStar 应用程序的代码和已配置的 Git 凭证预配置您的环境。

您可轻松与同事共享此环境,这让我发现了另一组非常有用的功能。

协作

将 AWS Cloud9 与其他编辑器区分开来的许多因素之一是丰富的协作工具。您可通过几次单击来邀请 IAM 用户加入您的环境。

您可查看他们处理的文件、其光标所在的位置甚至共享终端。聊天功能也很有用。

需知信息

  • 对于此服务,超出基础计算和存储的部分不会产生任何额外费用。
  • c9.io 将继续为现有用户运行。您可继续使用 c9.io 的所有功能并添加新团队成员 (如果您具有团队账户)。不久以后,我们将提供工具以便将您的 c9.io 工作区轻松迁移到 AWS Cloud9。
  • AWS Cloud9 已在美国西部 (俄勒冈)、美国东部 (俄亥俄)、美国东部 (弗吉尼亚北部)、欧洲 (爱尔兰) 和亚太地区 (新加坡) 区域提供。

我迫不及待想看到您使用 AWS Cloud9 创作的作品!

Randall

宣布 Alexa for Business 即将发布:将 Amazon Alexa 的支持语音的设备用于工作场所

要说什么东西融入到了我的日常生活中,只有少数几个比得上 Alexa。我使用 Echo 设备和已启用的 Alexa 技能来打开家里的灯、观看我的 Echo Show 中的视频以了解谁在按门铃、每周跟踪我长长的待办事项清单、播放音乐等。我甚至让我的家庭成员也在其 Echo 设备上对他们似乎绝对离不开的各种类型的活动启用 Alexa 技能。我的母亲是年纪比我们大得多的一代人 (请别告诉她我这么说),她使用 Echo 设备以及我为她构建的自定义 Alexa 技能来存储烘焙食谱。她还喜欢探索拥有最新的健康和美食信息的技能。难怪每次我去上班总觉得少了点什么。例如,我希望能够要求 Alexa 在我到达办公室时读出我的新闻简讯。

对于想要让 Alexa 作为工作时的智能助手的人来说,我有一条激动人心的消息。我很高兴地宣布 Alexa for Business 即将发布,它是一项全新的服务,使企业和组织能够将 Alexa 大规模引入工作场所。Alexa for Business 不仅将 Alexa 引入您的日常工作以提升您的工作效率,还为提供了供组织大规模设置和管理 Alexa 设备、启用私人技能以及登记用户的工具和资源。

利用 Alexa for Business 让工作场所更智能

Alexa for Business 可将您了解和喜爱的 Alexa 引入工作场所以在个人和共享 Echo 设备上帮助各种类型的工作人员变得更有效率和更有条理。在工作场所中,共享设备可以放置在公共区域以供任何人使用,并且工作人员可以使用其个人设备在办公点和家里进行连接。

最终用户可以使用共享设备或个人设备。以下是用户可从每种设备执行的操作。

共享设备

  1. 在会议室加入会议:您只需说一声“Alexa,开始会议”。Alexa 就会开启视频会议设备,拨号到您的会议电话,然后进行会议。
  2. 在办公室提供帮助:访问自定义技能以帮助搞清办公室各个方向通往何处、查找开放的会议室、报告建筑设备问题或订购新的办公用品。

个人设备

  1. 启用呼叫和消息收发:Alexa 可帮助拨打电话、按免提和代表您发送消息。
  2. 自动拨号到会议电话:Alexa 可在家里、在办公点或在外出时通过语音使用会议电话号码加入任何会议。
  3. 智能助手:Alexa 可以快速查看日历、帮助安排会议、管理待办事项清单和设置提醒。
  4. 查找信息:Alexa 可帮助您在热门业务应用程序中查找信息,如 Salesforce、Concur 或 Splunk。

以下是可供管理员使用的一些控件:

  1. 预置和管理共享 Alexa 设备:您可以使用 Alexa for Business 控制台设置和管理工作场所周围的共享设备。对于每台设备,您可以设置一个位置 (如会议室名称),然后为该设备分配公共和私人技能。
  2. 配置会议室设置:通过简单的一句“Alexa,开始会议”来开始您的会议。利用 Alexa for Business,您可以配置会议室设置,从而能使用 Alexa 开始会议并控制会议室设备,或者从会议室内的 Amazon Echo 设备直接拨号接入。
  3. 管理用户:您可以邀请您组织内的用户使用您的 Alexa for Business 账户注册其个人 Alexa 账户。当您的用户注册后,您就可以为他们启用您的自定义私人技能以在办公点或家里通过其个人 Alexa 账户使用任一设备。
  4. 管理技能:您可以将组织已创建的公共技能和自定义私人技能分配到您的共享设备,并将私人技能提供给您的已注册用户。您可以创建技能组,然后将其分配到特定共享设备。
  5. 构建私人技能与使用 Alexa for Business API:深入了解 Alexa Skills Kit 并构建您自己的技能。您随后可以将这些技能提供给共享设备以及已在您的 Alexa for Business 账户中注册的用户,它们都不必在公共 Alexa 技能商店中发布。Alexa for Business 提供了其他 API,可用于向您的技能添加上下文和自动执行管理任务。

让我们大致了解一下 Alexa for Business。首先,我将登录到 AWS 控制台并转到 Alexa for Business 服务。

当我登录该服务后,系统将向我显示 Alexa for Business 控制面板。如您所见,我有权管理会议室、共享设备、用户和技能,还能够控制开会、日历和用户邀请。

我首先要设置我的 Alexa 设备。Alexa for Business 提供了一个设备设置工具,用于设置多台设备,将这些设备连接到您的 Wi-Fi 网络,然后将它们注册到 Alexa for Business 账户。此过程与个人 Alexa 设备的设置过程大不相同。利用 Alexa for Business,您可以一次预置 25 台设备。

在预置我的设备后,我可以为要放置这些设备的位置 (例如我的会议室) 创建位置配置文件。我们在 Alexa for Business 控制台中将这些位置称为“Rooms”。我可以转到“Room profiles”文件菜单,然后创建会议室配置文件。会议室配置文件包含您会议室内的 Alexa 设备的常用设置,例如设备的唤醒词、地址、时区、度量单位以及我是否要启用出站呼叫。

下一步是为我设置的设备启用技能。我可以启用 Alexa 技能商店中的任何技能,或者使用私人技能功能来启用我自行构建的技能并将其提供给我的 Alexa for Business 账户。要为我的共享设备启用技能,我可以转到“Skills”菜单选项并启用技能。在启用技能后,我可以将它们添加到技能组并向我的会议室分配技能组。

对于 Alexa for Business,我非常喜欢的一点是我可以使用 Alexa 拨号到会议电话。要启用此功能,我将转到“Conferencing”菜单选项并选择“Add provider”。在 Amazon,我们使用的是 Amazon Chime,但您也可以从不同提供商的列表中进行选择,或者甚至可以添加您自己的提供商 (如果您需要)。

在设置此选项后,我可以说“Alexa,加入我的会议”;然后 Alexa 会要求我提供我的 Amazon Chime 会议 ID,之后,我的 Echo 设备将自动拨号到我的 Amazon Chime 会议。Alexa for Business 还提供了一个快速开始任何会议的智能方法。我们都遇到过以下情况:我们走进会议室但找不到会议 ID 或会议电话号码。利用 Alexa for Business,您可以链接到我的企业日历,让 Alexa 为我展示会议信息,然后自动拨号接入 – 我甚至不需要我的会议 ID。以下是执行此操作的方式:

Alexa 还可以控制会议室内的视频会议设备。为此,我只需为拥有的设备选择技能,选择设备提供商,然后为我的会议室启用设备即可。现在,当我要求 Alexa 加入我的会议时,Alexa 将从会议室中的设备拨号接入,然后开启视频会议系统,无需我执行任何其他操作。

接下来,让我们将话题转到已注册用户。

我首先将为我的组织设置用户邀请,以便我可以邀请用户使用我的 Alexa for Business 账户。要允许用户在组织内使用 Alexa for Business,您可以通过从管理控制台发送用户邀请电子邮件来将其个人 Alexa 账户注册到该服务。如果让我选择,我可以将用户注册电子邮件自定义为包含其他内容。例如,如果我的组织有可在用户接受邀请并完成注册过程后启用的 Alexa 技能,那么我可以添加有关该技能的信息。我的用户必须加入才能使用 Alexa for Business 的功能,例如自动拨号到会议电话、链接其 Microsoft Exchange 日历或使用私人技能。

既然我已自定义我的用户邀请,我将为我的组织邀请用户使用 Alexa for Business,方法为转到控制面板上的“Users”菜单,然后输入用户的电子邮件地址。这将发送一封电子邮件,其中包含可用于加入我的组织的链接。用户将使用其个人 Alexa 设备注册到的 Amazon 账户来加入。让我们邀请 Jeff Barr 加入我的 Alexa for Business 组织。

在 Jeff 使用我的 Alexa for Business 账户进行注册后,他可以了解我为已注册用户启用的私人技能,还可以从他的任一个人设备 (包括他的家庭办公室中的 Echo 设备) 访问工作技能并加入会议电话。

总结

我们在我们的 Alexa for Business 控制台和服务功能简要概述中仅学习了一些皮毛。您可以通过访问 Alexa for Business 网站、阅读 AWS 文档中的管理和 API 指南或通过在 Alexa for Business 控制台内观看入门视频来了解有关 Alexa for Business 的更多信息。

您可以通过访问 Alexa for Business 网站、观看 Alexa for Business 概述视频、阅读 AWS 文档中的管理和 API 指南或通过观看 Alexa for Business 控制台内的入门视频来了解有关 Alexa for Business 的更多信息。

Alexa,说再见并在博客文章上签字。”

Tara 

在笔记本电脑上自定义并显示 AWS DeepLens 项目输出

AWS DeepLens 是一个带有摄像头的支持深度学习的开发人员工具包。它使您能够通过实操计算机视觉教程和预建模型来开发机器学习技能并进行扩展。预构建模型的示例包括:用于识别和检测房间里的不同对象 (如电视显示器、人和瓶子) 的对象检测以及用于识别不同类型的动作 (如刷牙、涂口红、打鼓、拉小提琴和打篮球) 的动作识别。

AWS DeepLens 可让您从设备的摄像头显示流以及在 IoT 控制台和本地设备上显示模型的输出。有关了解有关如何执行此操作的更多信息,您可以参阅文档。在本博客文章中,我们将讨论如何通过 HTML 页面上的 AWS DeepLens 自定义和显示项目输出。

我们将使用:

  • Amazon Cognito,旨在使 HTML 页面能够通过 IoT WebSockets 访问 AWS DeepLens MQTT 消息
  • AWS IoT,旨在处理数据订阅和发布
  • Amazon S3,旨在存储用于显示输出的 HTML 文件

您可以使用 AWS CLI 或 AWS 管理控制台来自定义 AWS DeepLens 项目输出。使用 CLI 和控制台的步骤如下所示。

先决条件

要执行以下步骤以自定义 AWS DeepLens 输出,您需要

  • 拥有一台 AWS DeepLens 设备
  • 注册该设备
  • 创建一个项目并将它部署到该设备

有关更多信息,您可以参阅文档。如果您没有 AWS DeepLens 设备,则可以注册以加入到我们的等待名单。

开始使用 AWS CLI 的步骤

要开始使用 AWS CLI,请执行以下步骤。

步骤 1:创建 Cognito 身份池

每当您注册 AWS DeepLens 设备时,该服务都会创建一个唯一的 MQTT 主题。本主题将在 AWS IoT 控制台上展示您的已部署模型的输出。例如,如果您已部署到 AWS DeepLens 的项目检测到您的周边环境中的对象,则可以使用 MQTT 主题向 IoT 控制台发送检测到的对象名称。在本博客文章中,我们希望能够在自定义 HTML 页面上显示 MQTT 消息。对此,我们将使用 Amazon Cognito。

利用 Amazon Cognito,您可以轻松地使用临时凭证以一种安全的方式访问 AWS 资源,从而不必将 AWS 凭证放在源代码或网页中。

为此,我们首先需要创建一个身份池。我们稍后会将此 IdentityPoolId 提供给 HTML 页面,使其能够使用临时凭证订阅 MQTT 主题。

在 AWS CLI 上,粘贴以下命令。在执行该步骤之前,请确保您是在所需的 AWS 区域中创建身份。

> aws cognito-identity create-identity-pool \ 
  --identity-pool-name DeepLens_Console  \
  --allow-unauthenticated-identities --region us-east-1

响应将采用以下格式:

{
    "IdentityPoolId": "us-east-1:XXXXXXX-1cd1-4c3a-9a39-dac267545277",
    "AllowUnauthenticatedIdentities": true,
    "IdentityPoolName": "DeepLensConsole"
}

记下 IdentityPoolId (以黄色突出显示)。您稍后会将它用作 HTML 页面的参数。

注意:此身份池将允许未经身份验证的用户获取一些访问您的 AWS 资源的权限 (我们将在后续步骤中定义)。这样做是为了简化与 HTML 页面的交互。如果您要增强该页面的安全性,则可以完全取消对未经身份验证的用户的支持,或者将页面访问限制为有限的功能。您还可以向该页面添加注册功能,以使用各种登录提供商对用户进行身份验证。

步骤 2:创建 IAM 角色以允许 AWS IoT MQTT 订阅

AWS DeepLens 设备使用 MQTT 主题和消息通过 IoT 订阅与云进行通信。这些渠道进行了优化以便在 IoT 环境中实现安全可靠的通信。要能够接收这些消息并在 HTML 页面上显示它们,我们需要定义以下 IAM 角色和权限。

首先,为 IAM 角色创建一个策略文档。为此,请将以下内容保存到名为 DeepLensConsoleUnauthName.json 的文件,该文件位于您运行 CLI 命令的同一目录下。请记住将 IdentityPoolId 替换为在上一步中检索到的内容。

在本步骤中,我们将为未经身份验证的用户访问 AWS 资源定义信任策略。现在,该角色没有权限,但我们允许 Amazon Cognito 代入它。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "us-east-1:XXXXX-1cd1-4c3a-9a39-dac267545277"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "unauthenticated"
        }
      }
    }
  ]
}

接下来,创建一个 IAM 角色,然后将您刚刚创建的策略附加到该角色。请注意,您需要使用在上一步中创建的同一路径和文件名。记住角色名称,因为您在后续步骤中需要它。

> aws iam create-role --role-name DeepLensConsoleUnauthName \  
  --assume-role-policy-document file://DeepLensConsoleUnauthName.json

接下来,将 AWSIoTDataAccess 策略附加您刚刚创建的角色。这会将一个允许此角色读取和写入消息的托管策略附加到您的 IoT 终端节点的所有主题。您可以创建一个更严格的策略来限制允许的主题和命令,或者也可以向该角色添加更多权限。例如,您可以使用以下策略 ARN 允许 Amazon Polly 读出标签:arn:aws:iam::aws:policy/AmazonPollyReadOnlyAccess

> attach-role-policy \
  --role-name DeepLensConsoleUnauthName \
  --policy-arn arn:aws:iam::aws:policy/AWSIoTDataAccess

步骤 3:连接身份池和 IAM 角色

现在,您需要将 Cognito 身份池连接到 IAM 角色。请使用以下命令实现此关联。

> aws cognito-identity set-identity-pool-roles \ 
--identity-pool-id "us-east-1:XXXXX-1cd1-4c3a-9a39-dac267545277" \ 
--roles unauthenticated=DeepLensConsoleUnauthName

步骤 4:查找您的账户的 IoT 终端节点

使用 AWS CLI 执行以下步骤:

键入命令。

aws iot describe-endpoint

它将返回您的 IoT 终端节点

{
       "endpointAddress": "XXXXXXXXXXXXX.iot.us-east-1.amazonaws.com"
}

步骤 5:打开 HTML 页面以查看您的项目输出

您现在可以通过传递之前定义的参数在 Amazon S3 中打开静态 HTML 页面:

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=IoTEndpoint&id-pool=IdentityPoolId

例如,以下是包含本指南中使用的值的链接:

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=XXXXXXXXX.iot.us-east-1.amazonaws.com&id-pool=us-east-1:XXXXXXXX-XXXX-4a79-8dd4-568590df9298

根据您的项目所显示的结果,您可以在此 HTML 页面上查看 MQTT 消息、图像和带有边界框的视频流。

开始使用 AWS 管理控制台的步骤

要开始使用 AWS 管理控制台,请执行以下步骤。

步骤 1:创建 Cognito 身份池

每当您注册 AWS DeepLens 设备时,该服务都会创建一个唯一的 MQTT 主题。本主题将在 AWS IoT 控制台上展示您的已部署模型的输出。例如,如果您已部署到 AWS DeepLens 的项目检测到您的周边环境中的对象,则可以使用 MQTT 主题向 IoT 控制台发送检测到的对象名称。在本博客文章中,我们希望能够在自定义 HTML 页面上显示 MQTT 消息。对此,我们将使用 Amazon Cognito。

利用 Amazon Cognito,您可以轻松地使用临时凭证以一种安全的方式访问 AWS 资源,从而不必将 AWS 凭证放在源代码或网页中。

为此,我们首先需要创建一个身份池。我们稍后会将此 IdentityPoolId 提供给 HTML 页面,使其能够使用临时凭证订阅 MQTT 主题。

Amazon Cognito 控制台中,选择“Manage Federated Identities”和“Create new identity pool”。为其指定名称 (例如,“DeepLens_Console”) 并选中选项“Enable access to unauthenticated identities”。

注意:此身份池将允许未经身份验证的用户获取一些访问您的 AWS 资源的权限 (我们将在后续步骤中定义)。这样做是为了简化与 HTML 页面的交互。如果您要增强该页面的安全性,则可以完全取消对未经身份验证的用户的支持,或者将页面访问限制为有限的功能。您还可以向该页面添加注册功能,以使用各种登录提供商对用户进行身份验证。

允许 Amazon Cognito 代表您代入角色。

在下一个屏幕上,您将看到有关如何在移动和 Web 界面中使用 IdentityPoolId 的说明和代码示例。现在,请选择“Edit identity pool”按钮,并记下未经身份验证的身份的 IdentityPoolId 和 role name

步骤 2:编辑 IAM 角色以允许 AWS IoT MQTT 订阅

AWS DeepLens 设备使用 MQTT 主题和消息通过 IoT 订阅与云进行通信。这些渠道进行了优化以便在 IoT 环境中实现安全可靠的通信。要能够接收这些消息并在本地 HTMP 页面上显示它们,我们需要定义具有访问 IoT 资源的适当权限的特定 IAM 角色。

转到 IAM 控制台并搜索未经身份验证的角色的名称。选择带有 Unauth_Role 后缀的角色 (列表上的第二个)。

现在,为角色单击“Attach policy”,搜索 IoT 托管策略,然后选择“AWSIoTDataAccess”。

选择“Attach policy”。

这会将一个允许此角色读取和写入消息的托管策略附加到您的 IoT 终端节点的所有主题。您可以创建一个更严格的策略来限制允许的主题和命令,或者向该角色添加更多权限 (例如,您可以使用以下策略 ARN 允许 Amazon Polly 读出标签):arn:aws:iam::aws:policy/AmazonPollyReadOnlyAccess )。

步骤 3:查找您的账户的 IoT 终端节点

使用 AWS IoT 控制台选择 Settings 选项:

步骤 4:打开 HTML 页面以查看您的项目输出

您现在可以通过传递之前定义的参数在 Amazon S3 中打开静态 HTML 页面。

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=IoTEndpoint&id-pool=IdentityPoolId

例如,以下是包含本博客文章中使用的值的链接:

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=XXXXXXXXX.iot.us-east-1.amazonaws.com&id-pool=us-east-1:XXXXXXXX-XXXX-4a79-8dd4-568590df9298

根据您的项目所显示的结果,您可以在此 HTML 页面上查看 MQTT 消息、图像和带有边界框的视频流。

从设备发送要在项目输出页面上显示的图像

边缘 AWS Lambda 函数的简单功能是将文本消息发布到 IoT 主题。您将能够在项目输出页面上 (或在 AWS IoT 控制台中的“test”选项卡上) 看到这些消息。

第一个扩展用于在模型推理之前或之后显示图像 (带边界框)。在本示例中,您将图像上传到 Amazon S3 并将图像 URL 发送到 IoT 主题。

将图像上传到 S3

首先,将 Python 函数添加到边缘 Lambda 函数以将图像上传到 Amazon S3:

# Function to write to S3
# The function is creating an S3 client every time to use temporary credentials
# from the GG session over TES 
def write_image_to_s3(img):
    session = Session()
    s3 = session.create_client('s3')
    file_name = 'DeepLens/image-'+time.strftime("%Y%m%d-%H%M%S")+'.jpg'
    # You can contorl the size and quality of the image
    encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),90]
    _, jpg_data = cv2.imencode('.jpg', img, encode_param)
    response = s3.put_object(ACL='public-read', Body=jpg_data.tostring(),Bucket='<BUCKET_NAME>',Key=file_name)

    image_url = 'https://s3.amazonaws.com/<BUCKET_NAME>/'+file_name
    return image_url

接下来,您将从推理 Python 函数调用该函数:

    ...
    # Upload to S3 to allow viewing the image in the browser
    image_url = write_image_to_s3(frame_with_bb)

并将它添加到输出消息:

    client.publish(topic=iotTopic, payload='{{"img":"{}"}}'.format(image_url))

添加到图像的另一个命令是在模型输出图像 (“ssd”类型) 时显示边界框:

# Adding top n bounding boxes results
def apply_bounding_box(img, topn_results):
        '''
        cv2.rectangle(img, (x1, y1), (x2, y2), RGB(255,0,0), 2)
        x1,y1 ------
        |          |
        --------x2,y2
        '''
        for obj in topn_results:
            class_id = obj['label']
            class_prob = obj['prob']
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            cv2.rectangle(img, (int(obj['xmin']), int(obj['ymin'])), (int(obj['xmax']), int(obj['ymax'])), (255,0,0), 2)
        return img

然后,使用以下代码获取前 n (例如 5) 个结果并将其应用于图像:

     ...
     results = model.parseResult('ssd',results)
     tops = results['ssd'][0:5]
     frame_with_bb = apply_bounding_box(frame_resize,tops)

结论

对此类输出页面还可以添加很多其他命令,将来的博客文章中将介绍其中一些。一部分示例是通过 MQTT 消息流式传输视频并在输出页面上重新生成流,或者嵌入 Amazon CloudWatch 图形或控制面板,等等。

AWS DeepLens 是一个开放式平台,用于生成教育和生产项目等内容。我们期望您构建新的深度学习模型、新的 Lambda 边缘函数、带有云逻辑的新功能以及用于控制和查看项目输出的新的人机接口,由此来扩展内置项目。
在本博客文章中,您看到了一个简单的基于 HTML 的页面,该页面能够安全地连接到您的设备以及在设备中运行的项目,并能够显示项目推理的输出。我希望它能为您提供一个良好的框架和基础,让您针对更高级的使用案例构建更先进的接口。我很想倾听您的想法,并希望与围绕 AWS DeepLens 的社区分享这些想法。


补充阅读

了解如何扩展 AWS DeepLens 以利用 AWS Lambda 发送 SMS 通知


作者简介

Guy Ernest 是 Amazon AI 的首席解决方案架构师。 他有一个令人非常兴奋的机会来帮助塑造和践行策略,以构建思想共享并广泛使用适用于 AI、机器学习和深度学习使用案例的 Amazon 云计算平台。在空闲时间,他喜欢与妻子和家人呆在一起,收集一些令人尴尬的故事,然后在谈论 Amazon 和 AI 的未来时进行分享。

Sunil Mallya 是 AWS Deep Learning 团队的高级解决方案架构师。 他致力于帮助我们的客户构建机器学习和深度学习解决方案以推进其业务。在业余时间,他喜欢烹饪、航海和打造 RC 自动驾驶汽车。

扩展 AWS DeepLens 以使用 AWS Lambda 发送 SMS 通知

AWS DeepLens 是一个带有摄像头的支持深度学习的开发人员工具包。它使您能够通过实操计算机视觉教程和预建模型来开发机器学习技能并进行扩展。

本博客文章将说明如何借助 AWS IoT 规则引擎和 Lambda 函数来利用云功能扩展 DeepLens 的本地功能。我们在这里介绍的简单功能是:在您通过 DeepLens 设备看到热狗后向您的电话号码发送 SMS 通知。我们期望有更多的高级用户扩展此功能以包含其他 AWS 云服务,例如 Amazon Elasticsearch Service (利用时间轴和帧为检测到的所有对象和面部构建控制面板和搜索界面)、Amazon Kinesis Analytics (构建有关在您的店面前走过的人数的异常检测模型)、Amazon Rekognition (使用名人识别和面部搜索 API 来识别您周围的 VIP) 和很多其服务。

这里有一张示意图展示了系统中数据的流动 – 从摄像头前部的物体一直到您口袋中的移动设备。

创建 Lambda 函数

首先,您将创建一个 AWS Lambda 函数,该函数将在云中运行并为具有足够高 (>0.5) 的概率获得热狗的人筛选来自您的 DeepLens 设备的消息。在此过程中,您还将在 AWS IoT 规则引擎中创建一条规则,用于从您使用 AWS Greengrass 部署到设备的 Lambda 函数获取消息。

  • AWS Lambda 控制台上,转到“Create Function”。
  • 筛选包含“iot-button-email”的蓝图并选择它作为您的蓝图模板。
  • 为您的 Lambda 函数指定一个名称。例如,Hotdog_Notifier”。
  • 在“Role”字段中保留“Create a new Role from template(s)”值。
  • 为新角色指定名称。例如,“Hotdog_Notifier_Role”。
  • 在“Policy Templates”中添加策略“SNS Publish policy”。
  • 在“aws-iot”部分中,切换为使用“Custom IoT Rule”。
    • 选择“Create a new rule”。
  • 为该规则指定名称 (例如,“search_hotdogs”) 和描述。
  • 在规则查询语句中放置以下 SELECT 查询:Select Hotdog from ‘/$aws/deeplens/KJHFD-DKJO87-LJLKD/inference’。此查询可捕获来自 DeepLens 设备的采用以下 JSON 格式的消息: { "Hotdog" : 0.5438 }
  • 在后面的复选框中启用“Trigger”。
  • 我们将在下一步中修改 Lambda 函数的代码。
  • 将环境参数从“email”更改为“phone_number”,并将您的电话号码作为“Value”放置。请注意,电话号码格式应包含国家/地区代码 (例如,美国号码 +15555555555)。您可以在 AWS SNS 常见问题中阅读有关针对 SMS 的国际支持的更多内容:https://aws.amazon.com/sns/faqs/#sms-related-questions
  • 选择“Create Function”按钮。
  • 切换为您刚刚创建的 Lambda 函数的“Configuration”。您可以查找左侧的配置选项卡 (“configuration”、“triggers”和“monitoring”)。
  • 在 Lambda 函数代码中,我们可以删除常规 SNS 订阅所需的所有帮助程序函数,例如 findExistingSubscription、createSubscription 和 createTopic。删除“use strict”之前的所有代码。我们还将修改代码以直接发送 SMS:
    'use strict';
    
    /**
     * This is a sample Lambda function that sends an SMS Notification When your
     * Deep Lens device detects a Hot Dog
     * 
     * Follow these steps to complete the configuration of your function:
     *
     * Update the phone number environment variable with your phone number.
     */
    
    const AWS = require('aws-sdk');
    
    const phone_number = process.env.phone_number;
    const SNS = new AWS.SNS({ apiVersion: '2010-03-31' });
    
    exports.handler = (event, context, callback) => {
        console.log('Received event:', event);
    
        // publish message
        const params = {
            Message: `Your DeepLens device just identified a Hot Dog. Congratulations!`,
            PhoneNumber: phone_number
        };
        if (event.Hotdog > 0.5)
            SNS.publish(params, callback);
    };
  • 选择“Save”。您也可以在此屏幕中测试 Lambda 函数,但我们现在将通过 IoT 规则引擎测试它,以模拟来自 DeepLens 设备的消息流。

测试配置

  • IoT 控制台中,选择“Test”选项。
  • 在以下消息上方选择“Publish to a Topic”和“Publish to the topic you defined in your Rule”: { "Hotdog": 0.68725 }
  • 您应该会收到 SMS 通知,其中包含消息“Your DeepLens device just…”,该消息是您在 Lambda 函数中定义的。
  • 现在是时候向您的 DeepLens 设备展示一些对象和一根热狗了。祝您好运!
  • 如果您在向设备展示一根热狗后没有收到信息,请回到顶部的图表,然后验证您是否按照颜色匹配了相关值以及是否提供了正确的电话号码和国家/地区代码。

结论

Amazon DeepLens 是一个开放式教育和创新平台,我们希望开发人员能提出很多不同的想法来使用它解决现实生活中的问题:从分析在商店周围走动的人员到为您的汽车自动打开车库门,或者在您的餐厅里的桌子很脏或客人请求服务时提醒您。这只是您可以使用 AWS DeepLens 构建 (借助与本博客文章中的简单扩展类似的扩展) 的系统的一个小型示例。


补充阅读

了解如何通过 HTML 页面上的 AWS DeepLens 自定义和显示项目输出


作者简介

Guy Ernest 是 Amazon AI 的首席解决方案架构师。 他有一个令人非常兴奋的机会来帮助塑造和践行策略,以构建思想共享并广泛使用适用于 AI、机器学习和深度学习使用案例的 Amazon 云计算平台。在空闲时间,他喜欢与妻子和家人呆在一起,收集一些令人尴尬的故事,然后在谈论 Amazon 和 AI 的未来时进行分享。

AWS PrivateLink 更新 – 适用于您自己的应用程序和服务的 VPC 终端节点

本月早些时候,我的同事 Colm MacCárthaigh 向大家介绍了 AWS PrivateLink,并展示了如何使用它通过 VPC 终端节点访问 Amazon Kinesis StreamsAWS Service CatalogEC2 Systems ManagerEC2 API 以及 ELB API 等 AWS 服务。终端节点 (由一个或多个弹性网络接口表示,这种接口简称 ENI) 驻留在您的 VPC 内,其 IP 地址来自 VPC 的子网,无需 Internet 或 NAT 网关。这个模型非常清晰,易于理解,而且还具有安全和可扩展的特点!

用于私有连接的终端节点
目前,我们正在构建 PrivateLink 初始发布模型,并对其进行扩展,让您能够设置并使用 VPC 终端节点来访问您自己的以及其他方提供的服务。在我们发布适用于 AWS 服务的 PrivateLink 之前,就收到了许多要求提供此功能的请求,所以我预计它将会广受欢迎。例如,一名客户告诉我们,他们计划创建数百个 VPC,每一个都用于托管并提供单一微服务 (请阅读 AWS 上的微服务了解更多信息)。

公司现在可以创建服务并销售给其他 AWS 客户,以便通过私有连接进行访问。还可以创建接受 TCP 流量的服务,将其托管在网络负载均衡器后方,然后直接提供或通过 AWS Marketplace 提供此服务。如有新的订阅请求,各公司会收到通知,并可以按需选择接受或拒绝。我认为,这一功能将在 2018 年为服务提供商创造一个富有活力的强大生态系统。

服务提供商和服务使用者位于不同的 VPC 中,使用不同的 AWS 账户,仅通过终端节点进行通信,所有流量都位于 Amazon 私有网络内部。服务使用者不必担心 IP 地址重叠,VPC 对等的安排或使用 VPC 网关等问题。您还可以使用 AWS Direct Connect 将现有的数据中心与一个 VPC 连接,让云中的应用程序与本地运行的服务实现互相访问。

提供服务及使用服务
这个新功能将使您的能力大大增强。您可以使用 VPC APIVPC CLIAWS 管理控制台进行所有设置。我将使用控制台向您展示如何提供和使用服务。我会使用同一 AWS 账户执行这两项任务,但这仅限于演示目的。

先来看看如何提供服务。服务必须在网络负载均衡器后方运行,必须可通过 TCP 进行访问。可以在 EC2 实例、ECS 容器或本地 (配置为 IP 目标) 托管此服务,而且它应该能够扩展,以满足预期的需求。我们建议使用的 NLB,其目标应在所在区域的每个可用区中,以实现低延迟和容错能力。请看以下我的示例:

我打开 VPC 控制台,导航到 Endpoint Services,然后单击 Create Endpoint Service

我选择我的 NLB (在本例中只有一个,但我可以选择两个或多个,它们将以轮询方式与各使用者相对应)。单击 Acceptance required,我即针对每个请求获得对终端节点的访问控制权:

我单击 Create service,我的服务将立即就绪:

如果我要在 AWS Marketplace 中提供此服务,现在即可开始创建列表。因为在这篇博文中我既是提供者也是使用者,所以我将跳过这一步。但我会复制 Service name 以在下一步中使用。

我返回 VPC 控制面板,导航到 Endpoints,然后单击 Create endpoint。然后我选择 Find service by name,粘贴服务名称,再单击 Verify 转到下一步。接下来我选择所需的可用区,并在每个可用区中选择一个子网,选取安全组,然后单击 Create endpoint

因为我在创建终端节点服务时勾选了“Acceptance required”,因此连接处于“pending acceptance”状态:

返回终端节点服务端 (通常位于另一 AWS 账户中),我可以看到待处理的请求并接受它:

终端节点将在大约一分钟之内变为可用状态。如果我创建服务并销售其访问权限,接受请求会是新客户购买及加入的大型工作流 (可能是自动流程) 中的一部分。

作为使用者,我可通过以下 DNS 名称访问新终端节点:

由 AWS 提供的服务及 AWS Marketplace 中的服务均可通过水平分割 DNS 进行访问。通过此名称访问服务会将区域和可用区纳入考虑范围,从而解析至“最佳”终端节点。

使用 Marketplace
如我之前提到的,这一全新 PrivateLink 功能为 AWS Marketplace 中的新卖家和现有卖家创造了一个商机。以下 SaaS 已作为终端节点提供,我认为未来将有更多 (请阅读入门材料通过 AWS Marketplace 销售):

CA TechnologiesCA App Experience Analytics Essentials

Aqua SecurityAqua Container Image Security Scanner

DynatraceCloud-Native Monitoring powered by AI

Cisco StealthwatchPublic Cloud Monitoring – MeteredPublic Cloud Monitoring – Contracts

SigOptML 优化及微调

当前可用
全新的 PrivateLink 功能现已推出,您可以立即开始使用!

Jeff

Amazon AppSync 简介 – 使用实时和离线功能构建数据驱动型应用

在当今时代,我们几乎都会利用移动设备和应用来让我们的生活更加轻松惬意。随着我们对手机的依赖程度不断增加,移动应用市场已呈爆炸式增长,数百万个应用竞相吸引我们的注意力。对于移动开发人员,这意味着我们必须确保我们构建的应用能够提供应用用户所需的质量和实时体验。因此,开发包括多用户数据同步、离线网络支持和数据发现等功能的移动应用已变得至关重要。我最近通过阅读 InfoQDZone 等出版物和移动开发博客 AlleviateTech 上的几篇文章,了解了移动开发趋势,我认为提供上述功能的关键要素之一是云驱动型移动应用。这似乎完全正确,因为它涉及到移动数据同步和数据存储。

既然如此,我认为现在是我宣布新服务 AWS AppSync 的最佳时机,该服务用于构建由云中的数据密集型服务驱动的创新移动应用。AWS AppSync 是一项完全托管的无服务器式 GraphQL 服务,可提供实时数据查询、同步、通信和离线编程功能。对于那些不熟悉开放式 GraphQL 规范的人,让我简要分享一些相关信息。GraphQL 是一种响应式数据查询语言和服务器端运行时,用于查询可检索实时数据和执行动态查询的数据源。您可以使用 GraphQL 构建响应式 API,以便在构建客户端应用程序时使用。GraphQL 在应用程序层工作,并提供用于定义架构的类型系统。这些架构可用作规范,以定义应如何对数据执行操作,以及在检索时应如何设置数据结构。此外,GraphQL 还有一个声明性编码模型,它受许多客户端库和框架 (包括 React、React Native、iOS 和 Android) 的支持。

现在,GraphQL 开放标准查询语言的强大功能正在通过 AWS AppSync向您提供丰富的托管服务。借助 AppSync ,开发人员可以轻松简化跨多个数据源的数据检索和处理操作,从而使其能够快速建立原型,构建和创建强大的协作式多用户应用程序。AppSync 在设备处于连接状态时保持数据更新,但使开发人员能够通过在本地缓存数据并在连接可用时同步本地数据,来构建脱机工作的解决方案。

我们来讨论 AWS AppSync 的一些关键概念以及该服务的工作原理。

AppSync 概念

  • AWS AppSync 客户端:定义操作、封装请求的授权详细信息以及管理离线逻辑的服务客户端。
  • 数据源:数据存储系统或用于存储数据的触发器
  • 身份:随 GraphQL 代理的请求一起提供的一组包含权限和标识上下文的凭证
  • GraphQL 代理:用于处理和映射请求、处理冲突解决方法以及管理精细访问控制的 GraphQL 引擎组件
  • 操作:AppSync 中支持的三种 GraphQL 操作之一
    • 查询:对数据的只读获取调用
    • 更改:获取之后写入数据,
    • 订阅:为响应事件而接收数据的持续连接。
  • 操作:已连接订阅者收到的 GraphQL 订阅通知。
  • Resolver:使用请求和响应映射模板来转换和执行数据源负载的函数

如何使用

创建一个架构来定义所需 GraphQL API 的类型和功能,并将其绑定到 Resolver 函数。可以创建架构来镜像现有数据源,或者 AWS AppSync 可以基于架构定义自动创建表。开发人员还可以使用 GraphQL 功能进行数据发现,而无需了解后端数据源。建立架构定义之后,可以使用操作请求 (如查询操作) 来配置 AWS AppSync 客户端。客户端向 GraphQL 代理提交操作请求以及标识上下文和凭证。GraphQL 代理将此请求传递给 Resolver,该函数会根据预先配置的 AWS 数据服务 (如 Amazon DynamaoDB 表、AWS Lambda 函数,或使用 Amazon Elasticsearch 的搜索功能) 映射和执行请求负载。Resolver 在单个网络调用中执行对其中一个或全部服务的调用,从而最大限度地减少 CPU 周期和带宽需求,并将响应返回到客户端。此外,客户端应用程序还可以在代码中按需更改数据要求,而 AppSync GraphQL API 将相应地动态映射数据请求,从而允许设计原型和加快开发速度。

为快速了解该服务,我将转到 Amazon AppSync 控制台。然后单击 Create API 按钮开始使用。

当出现 Create new API 屏幕时,我会将新 API 命名为 TarasTestApp,由于我只是想了解该新服务,因此我将选择 Sample schema 选项。您可能会从屏幕上的信息性公告对话框中注意到,在使用示例架构时,AWS AppSync 将自动为我创建 DynamoDB 表和 IAM 角色。它还将代表我部署 TarasTestApp API。查看控制台提供的示例架构之后,单击 Create 按钮来创建我的测试 API。

创建 TaraTestApp API 并代表我预置关联的 AWS 资源之后,我可以更新架构、数据源或将我的数据源连接到解析程序。我还可以通过从 GitHub 克隆示例存储库并下载随附的 GraphQL 架构,将我的 GraphQL API 集成到 iOS、Android、Web 或 React Native 应用程序中。这些应用程序示例非常有用,可以帮助您入门,并且它们经过预先配置,可在离线情况下运行。

如果在控制台上选择 Schema 菜单选项,就可以更新并查看 TarasTestApp GraphQL API 架构。


此外,如果我在控制台中选择“Data Sources”菜单选项,就可以看到现有数据源。在此屏幕中,我可以根据需要更新、删除或添加数据源。

接下来,选择 Query 菜单选项,然后便会转到用于编写和测试查询的控制台工具。由于我选择了示例架构,并且 AWS AppSync 服务为我完成了大部分繁重的工作,因此我会尝试对我的新 GraphQL API 进行查询。

我将使用一项更改为我的架构中的事件类型添加数据。由于这是一项更改并且它首先写入数据,然后读取数据,因此我希望该查询返回 name 和 where 的值。

如果我转到为架构中的事件类型创建的 DynamoDB 表,将会看到查询中的值已成功写入该表。现在,基于来自数据源的 GraphQL API 架构编写和检索数据是一项非常简单的任务,您也这样认为吧。


 总结

AWS AppSync 现已可用,目前支持 iOS、Android 和 JavaScript 应用开发。立即开始使用,并通过访问 AWS AppSync 控制台利用此托管 GraphQL 服务,或者通过在 AWS AppSync 产品页面上查看有关该服务的更多详细信息,或在有关该服务的 AWS 文档中阅读教程,了解更多信息。

Tara

Amazon Neptune – 完全托管的图形数据库服务

在我们用来支持现代生活的所有数据结构和算法中,图形不断改变着世界。各企业不断产生和获取关系复杂的丰富数据。然而,开发人员仍然不得不在传统数据库中对这些复杂关系进行建模。这导致查询极为复杂,并且成本高昂,随着关系的增加,性能也会不断下降。我们希望能简化这些越来越复杂的新式数据集、关系和模式的处理。

欢迎 Amazon Neptune

今天,我们要发布 Amazon Neptune 有限预览版,这是一个快速可靠的图形数据库服务,可供客户轻松洞悉高度连接的数据集之间的关系。Amazon Neptune 的核心是专门构建的高性能图形数据库引擎,它进行了优化,可存储数十亿关系并将图形查询延迟减至毫秒级。Amazon Neptune 作为完全托管的数据库提供,让客户能够腾出手来集中精力开发其应用程序,而不用忙于执行枯燥的重复性操作,如维护、修补、备份和恢复。该服务支持快速故障转移、时间点恢复以及多可用区部署,从而实现高可用性。它支持多达 15 个只读副本,您可以将查询吞吐量扩展到每秒数十万个查询。Amazon Neptune 在 Amazon Virtual Private Cloud 内运行,因此您可以加密静态数据,可完全控制传输中数据和静态数据的完整性。

这项服务有很多有趣的功能,不过可能很多人还不熟悉图形数据库,因此我们首先介绍一下概念。

图形数据库

图形数据库用于存储顶点 (节点) 和边缘 (关系或连接),这两种元素都可以键值对的形式存储其属性。对于连接的上下文关系驱动数据,图形数据库很有用。一些典型的应用包括社交媒体网络、推荐引擎、驾车路线、物流、诊断、欺诈检测以及基因测序。

Amazon Neptune 支持两种开放式图形描述和查询标准:

  • 使用 Gremlin 查询的 Apache TinkerPop3 样式属性图。Gremlin 是一种图形遍历语言,在这种语言中,查询是由沿着边缘到节点的离散步骤组成的遍历。通过用于 TinkerPop 的现有工具和客户端,可以快速开始使用 Neptune。
  • 使用 SPARQL 查询的资源描述框架 (RDF)。SPARQL 是一种声明式语言,它基于 W3C 的 Semantic Web 标准。它遵从“主->谓->宾”模型。具体地说,Neptune 支持以下标准:RDF 1.1、SPARQL Query 1.1、SPARQL Update 1.1 和 SPARQL Protocol 1.1。

如果现有应用程序可使用 SPARQL 或 TinkerPop,则只需更新这些应用程序所连接的终端节点,就可以开始使用 Neptune。

我们介绍一下如何启动 Amazon Neptune。

启动 Amazon Neptune

首先导航到 Neptune 控制台,然后单击“Launch Neptune”打开启动向导。

在第一个屏幕上,只需命名实例和选择实例类型。接下来配置高级选项。如果您以前启动过基于实例的 AWS 数据库服务,如 Amazon Relational Database Service (RDS)Amazon ElastiCache,现在的很多步骤您可能会觉得很熟悉。

Amazon Neptune 在 VPC 内安全运行,可以创建它自己的安全组,您可以添加 EC2 实例以便访问。

现在,我们可以配置其他一些选项,如参数组、端口和群集名称。

在下一个屏幕上,我们可以启用基于 KMS 的静态加密、故障转移优先级和备份保留时间。

与 RDS 类似,数据库维护可由该服务处理。

实例配置完毕后,您可以在群集的“Details”页面上找到连接终端节点。在我这个例子中是 triton.cae1ofmxxhy7.us-east-1.rds.amazonaws.com

使用 Amazon Neptune

如上所述,Amazon Neptune 可以使用两个不同的查询引擎。

要连接到 Gremlin 终端节点,可通过 /gremlin 使用终端节点执行某些操作,如:


curl -X POST -d '{"gremlin":"g.V()"}' https://your-neptune-endpoint:8182/gremlin

同样,可以通过 /sparql 连接到 SPARQL 终端节点


curl -G https://your-neptune-endpoint:8182/sparql --data-urlencode 'query=select ?s ?p ?o where {?s ?p ?o}'

我们需要先填充数据库,然后才能查询数据。假设我们对 AWS re:Invent 建模,使用批量加载 API 插入一些数据。
对于属性图,Neptune 支持使用存储在 Amazon Simple Storage Service (S3) 中的 CSV 来加载节点、节点属性、边缘和边缘属性。

典型的顶点 CSV 看起来是这样的:

~label,name,email,title,~id
Attendee,George Harrison,george@thebeatles.com,Lead Guitarist,1
Attendee,John Lennon,john@thebeatles.com,Guitarist,2
Attendee,Paul McCartney,paul@thebeatles.com,Lead Vocalist,3

边缘 CSV 看起来是这样的:

~label,~from,~to ,~id
attends,2,ARC307,attends22
attends,3,SRV422,attends27

现在将一个结构类似的 CSV 加载到 Neptune 中,运行如下代码:

curl -H 'Content-Type: application/json' \
https://neptune-endpoint:8182/loader -d '
{
    "source": "s3://super-secret-reinvent-data/vertex.csv",
    "format": "csv",
    "region": "us-east-1",
    "accessKey": "AKIATHESEARENOTREAL",
    "secretKey": "ThEseARE+AlsoNotRea1K3YSl0l1234coVFefE12"  
}'

将返回:

{
    "status" : "200 OK",
    "payload" : {
        "loadId" : "2cafaa88-5cce-43c9-89cd-c1e68f4d0f53"
    }
}

我使用该返回结果,查询加载状态: curl https://neptune-endpoint:8182/loader/2cafaa88-5cce-43c9-89cd-c1e68f4d0f53

{
    "status" : "200 OK",
    "payload" : {
        "feedCount" : [{"LOAD_COMPLETED" : 1}],
        "overallStatus" : {
            "fullUri" : "s3://super-secret-reinvent-data/stuff.csv",
            "runNumber" : 1,
            "retryNumber" : 0,
            "status" : "LOAD_COMPLETED",
            "totalTimeSpent" : 1,
            "totalRecords" : 987,
            "totalDuplicates" : 0,
            "parsingErrors" : 0,
            "datatypeMismatchErrors" : 0,
            "insertErrors" : 0
        }
    }
}

对于此数据序列化格式,我对各边缘重复执行此加载过程。

对于 RDF,Neptune 支持四种序列化:Turtle、N-Triples、N-Quads 和 RDF/XML。我可以通过同一个加载 API 加载以上所有对象。

现在,我的数据库中已经有数据了,可以运行查询。我们用 Gremlin 以图形遍历形式编写查询。我是 Paul McCartney 的忠实粉丝,我需要查找他将举行的所有演唱会:
g.V().has("name","Paul McCartney").out("attends").id()

这样就定义了一个图形遍历,它查找属性“name”的值为“Paul McCartney”的所有节点 (只有一个!)。接下来,它从该节点沿所有类型为“attends”的边缘查找,获取结果节点的 ID。


==>ENT332
==>SRV422
==>DVC201
==>GPSBUS216
==>ENT323

Paul 看起来很忙。

希望这个例子能让您简要了解图形数据库的功能。图形数据库为很多客户带来了各种全新可能,而 Amazon Neptune 让大规模存储和查询数据变得更简单。我很高兴看到我们的客户构建出精彩的新产品。

Randall

附:非常感谢 Brad Bebee 和 Divij Vaidya 为我写作这篇文章提供帮助!