写点什么

AWS DeepLens 扩展:自建项目

  • 2019-11-04
  • 本文字数:4718 字

    阅读完需:约 15 分钟

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) 的上下文,然后库会自动执行模型的加载和绑定:


Python


import awscammodelPath = "/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) 在深度学习模型之前 (调整大小) 和之后 (绘制框和标签) 来处理图像。由于各个模型在不同的输入规范上训练,因此第一步都需要将捕获的帧大小调整为合适的尺寸:


Python


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

在帧上运行模型推理

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


Python


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

解析推理的结果

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


Python


modelType = "ssd"parsed_results = model.parseResult(modelType, inferOutput)['ssd']
复制代码

将结果发布到 MQTT 主题

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


Python


# 创建 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 来控制函数推理的速率:

  • Python


   from threading import Timer   def greengrass_infer_image_run():       # 读取图像       # 预处理       # 对图像运行模型推理       # 解析结果       # 输出结果
# 异步调用此函数,在 1/2 秒后重新运行 Timer(0.5, greengrass_infer_image_run).start()
复制代码


  • 按需 – 每当您希望触发时运行函数,可以手动触发,也可以从其他事件触发。即使您在以固定方式运行函数,也可以使用事件处理程序来按需触发。以下示例演示了如何在每个事件上触发推理,不过您还可以使用事件处理程序,通过解析事件参数来进一步控制函数 (例如,切换模型或模型模式)。

  • Python


   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 协议写出其输出。内置项目使用的默认输出主题为:


Python


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 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/aws-deeplens-extensions-build-your-own-project/


2019-11-04 08:00817

评论

发布
暂无评论
发现更多内容

凭借一份“面试真经pdf”,我四面字节跳动,拿下1-2级offer

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

2021 年主要网络安全威胁,及时发现提早规避风险

九河云安全

经过两年努力,我终于进入腾讯(PCG事业群4面总结)

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

FastApi-05-请求体-2

Python研究所

FastApi 8月日更

快照保护是什么意思?快照的原理是什么?

行云管家

镜像 数据保护 快照 数据安全

一文搞懂指标采集利器 Telegraf

尔达Erda

学习 微服务 开发者 云原生 插件开发

终于有人把“SpringCloudAlibaba学习笔记”整理出来了

Java 程序员 架构 微服务 计算机

清爽视频编辑器 Tech Support

凌天一击

新一代设计编排交付套件分享

鲸品堂

交付工具

经验分享:我是如何拿下微软、滴滴、百度等 20家大厂的 Offer?

Java 程序员 架构 面试 IT

二十不惑的年纪,我简直走了狗屎运(4面拿字节跳动offer)

Java~~~

Java 面试 微服务 多线程 架构师

如何评价Netty封装的io_uring?

BUG侦探

Netty 网络 io_uring

【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)

码界西柚

SpringCloud OpenFegin Fegin 8月日更

毕业六年本科,去年疫情期间备战二个月,阿里巴巴四面成功!定级 P7

Java 程序员 架构 面试 IT

virtlet是什么?virtlet如何管理虚拟机?

谐云

循序渐进带你全方位剖析原型链

加百利

大前端 原型链 自学 8月日更

全面到哭!BAT内部Java求职面试宝典,应届生必须人手一份

Java~~~

Java 面试 微服务 多线程 架构师

低代码开发平台的出现会是开发者的威胁吗

雯雯写代码

开发者 低代码 低代码开发平台

又一里程碑!阿里首推Java技术成长笔记,业内评级“钻石级”

Java~~~

Java redis spring 面试 架构师

阿里巴巴大神发布的Java零基础笔记,实战教程多到手软,跪了

Java~~~

Java 面试 微服务 多线程 架构师

当新零售遇上 Serverless

Serverless Devs

阿里云 Serverless 云原生

读完SpringBoot,Cloud,Nginx与Docker技术,我拿到了阿里offer

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

百分点科技参加MIT数智未来创新峰会 入选产业数字化生态图谱

百分点科技技术团队

什么是DPDK?DPDK的原理及学习学习路线总结

Linux服务器开发

Linux服务器开发 DPDK Linux后台开发 网络性能 网络原理

Spring Boot 实战派,让开发像喝水一样简单!

Java 程序员 架构 面试 IT

社招三面阿里“落榜”,幸获内推名额,4面揽下美团offer

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

987页的Java面试宝典,看完才发现,应届生求职也没那么难

Java~~~

Java 面试 微服务 多线程 架构师

消息推送技术干货:美团实时消息推送服务的技术演进之路

JackJiang

消息推送 即时通讯 IM push

28天读完349页,这份阿里面试通关手册,助我闯进字节跳动

Java~~~

Java 面试 算法 多线程 架构师

运维安全第一步,采购堡垒机做好权限控制!

行云管家

堡垒机 安全运维 企业资产 事前授权

渣本全力以赴33天,四面阿里妈妈(淘宝联盟),拿下实习岗offer

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

AWS DeepLens 扩展:自建项目_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章