亚马逊AWS官方博客
借助 AWS Panorama 实现 Edge(边缘)的计算机视觉
如今,所有人都可以使用 AWS Panorama 设备。AWS Panorama 设备是一种计算机视觉 (CV) 设备,旨在部署在您的网络上,以分析由您的本地部署的摄像机提供的图像。
每周,我都会阅读有关计算机视觉的新的创新使用案例。一些客户使用 CV 来验证托盘卡车是否停放在指定区域,以确保仓库中工人的安全;一些客户分析客户在零售店中的步行流量,以优化空间和植入性营销;还有一些客户使用 CV 来识别猫和老鼠,这只是其中的几个例子。
AWS 客户一致认为,由于云对存储和计算资源的几乎无限访问,因此它是训练计算机视觉模型最方便的场所。在云中,数据科学家可以使用强大的工具,例如 Amazon SageMaker 以及各种计算资源和框架。
然而,当需要分析来自一个或多个视频源的图像时,你们中的许多人告诉我们,云不是您想要运行此类工作负载的地方。造成这种情况的原因有很多:有时捕获图像的设施没有足够的带宽将视频源发送到云端,有些使用案例需要非常低的延迟,或者有些只是想将图像保留在本地而不是将其发送到网络外部进行分析。
在 Re: Invent 2020 上,我们宣布了 AWS Panorama 设备和软件开发工具包来满足这些要求。
AWS Panorama 是一款机器学习设备和软件开发工具包 (SDK),可允许您将计算机视觉引入本地摄像机,以便在本地进行高精度和低延迟的预测。借助 AWS Panorama 设备,您可以自动执行传统上需要人工检查的任务,以提高对潜在问题的可见性。例如,即使在互联网连接有限或没有互联网连接的环境中,您也可以使用 AWS Panorama Appliance 评估制造质量、识别工作流程中的瓶颈并监控工作场所的安全。该软件开发套件允许摄像机制造商直接在其 IP 摄像机中引入同等功能。
与此博客上的往常一样,我想向您介绍为 AWS Panorama 设备开发和部署计算机视觉应用程序的过程。本博客的演示应用程序使用机器学习模型识别来自网络摄像机的视频帧中的对象。应用程序将模型负载到 AWS Panorama 设备上,从摄像机获取图像,然后通过模型运行这些图像。然后,应用程序将结果叠加在原始视频之上,然后将其输出到连接的显示器。该应用程序使用 AWS Panorama 提供的库与输入和输出 video streams 和模型进行交互,无需进行低级编程。
让我们首先定义一些概念。我从 AWS Panorama 文档页面借用了以下定义。
概念
AWS Panorama 设备是运行应用程序的硬件。您可以使用 AWS Panorama 控制台或 AWS 软件开发工具包注册设备、更新其软件以及向其部署应用程序。在设备上运行的软件可以发现并附上摄像机流,向应用程序发送视频帧,还可以选择在连接的显示器上显示视频输出。
该装置是边缘设备。它不是将映像发送到 AWS 云进行处理,而是在优化的硬件上本地运行应用程序。这使您能够实时分析视频并在连接有限的情况下处理结果。设备只需要互联网连接即可报告其状态、上载日志以及获取软件更新和部署。
应用程序包含多个称为节点的组件,这些组件表示摄像机、模型、代码或全局变量。节点只能是配置(输入和输出),也可以包含构件(模型和代码)。应用程序节点捆绑在节点包中,您可以上载到 S3 接入点,AWS Panorama 设备可以在其中进行访问。应用程序清单是一个配置文件,用于定义节点之间的连接。
计算机视觉模型是经过训练以处理图像的机器学习网络。计算机视觉模型可以执行各种任务,例如分类、检测、分段和跟踪。计算机视觉模型将图像作为输入,并输出有关图像中的一个或多个对象的信息。
AWS Panorama 支持使用 Apache MXNet、DarkNet 、GluonCV、Keras、ONNX、PyTorch、TensorFlow 和 TensorFlow Lite 构建的模型。您可以使用 Amazon SageMaker 构建模型,然后从 Amazon Simple Storage Service (Amazon S3) 存储桶导入模型。
现在我们已经掌握了这些概念,让我们开始动手吧。
打开您的 AWS Panorama 设备
在服务团队发给我的盒子里,我发现了电器本身(不奇怪!),一根电源线和两根以太网电缆。该盒子还包含一个 USB 闪存盘,用于初始配置设备。该设备专为在工业环境中工作而设计。它背面的电源连接器旁边有两个以太网端口。在前面,在滑动门后面的保护下,我发现了一个 SD 卡读卡器,一个 HDMI 连接器和两个 USB 端口。还有一个电源按钮和一个重置按钮,用于将设备重新初始化到出厂状态。
配置您的设备
我首先为我的网络配置(电缆 + DHCP,但它也支持静态 IP 配置),然后注册以安全地连接回我的 AWS 账户。为此,我导航到 AWS 管理控制台,输入了我的网络配置详细信息。它生成了一组配置文件和证书。我使用提供的 USB 闪存盘将它们复制到设备中。我的同事 Martin Beeby 分享了这个过程的屏幕截图。 团队根据他们在预览期间收到的反馈略微修改了屏幕,但我认为不值得再次按步骤进行。现场提示:请务必使用包装盒中提供的 USB 闪存盘,它已正确格式化并被设备自动识别(我自己的 USB 闪存盘无法正确识别)。
然后,我从 Panorama GitHub 存储库下载了一个示例应用程序,并使用此 GitHub 上也提供的 Panorama 测试实用程序进行了试用(测试实用程序是配置的 EC2 实例)充当模拟器)。Panorama 测试实用程序使用 Jupyter 笔记本电脑在将示例应用程序或代码部署到设备之前快速进行试验。它还列出了允许您以编程方式将应用程序部署到设备的命令。
Panorama 命令行
Panorama 命令行简化了创建项目、导入资产、打包以及将其部署到 AWS Panorama 设备的操作。您可以按照以下说明下载并安装 Panorama 命令行。
当收到其他人开发的应用程序(例如示例应用程序)时,我必须在所有应用程序文件和目录名称中替换 AWS 账户 ID。我只用一个命令来做到这一点:
panorama-cli import-application
申请结构
Panorama 应用程序结构如下所示:
├── assets
├── graphs
│ └── example_project
│ └── graph.json
└── packages
├── accountXYZ-model-1.0
│ ├── descriptor.json
│ └── package.json
└── accountXYZ-sample-app-1.0
├── Dockerfile
├── descriptor.json
├── package.json
└── src
└── app.py
graph.json
列出了此应用程序中的所有软件包和节点。节点是在 Panorama 中定义应用程序的方法。- 在每个软件包中
package.json
都有关于软件包及其使用的资产的详细信息。 - 模型包
模型
有一个descriptor.json
,其中包含编译模型所需的元数据。 - 容器包
sample-app
包含src
目录中的应用程序代码和用于构建容器的Dockerfile
。descriptor.json
包含启动容器时要使用哪个命令和文件的详细信息。 assets
目录是所有资产所在的位置,例如打包的代码和编译的模型。不应在此目录中进行任何更改。
请注意,包裹名称以您的账号作为前缀。
当我的应用程序准备就绪时,我会构建容器(我正在使用带有 Docker 引擎和Docker CLI 的 Linux 计算机,以避免在 macOS 或 Windows 中使用 Docker 桌面。)
$ panorama-cli build-container \
--container-asset-name {container_asset_name} \
--package-path packages/{account_id}-{package_name}-1.0
关于相机的注意事项
AWS Panorama 设备具有 “抽象摄像机” 的概念。抽象摄像机源是占位符,可以在应用程序部署期间映射到实际的摄像机设备。Panorama 测试实用程序允许您将抽象摄像机映射到视频文件,以便进行简单、可重复的测试。
添加 ML 模型
AWS Panorama 设备支持多个机器学习模型框架。模型可以在 Amazon SageMaker 或您选择的任何其他解决方案上进行训练。我从 S3 下载了我的机器学习(ML)并将其导入到我的项目中:
panorama-cli add-raw-model \
--model-asset-name {asset_name} \
--model-s3-uri s3://{S3_BUCKET}/{project_name}/{ML_MODEL_FNAME}.tar.gz \
--descriptor-path {descriptor_path} \
--packages-path {package_path}
在幕后,机器学习(ML)模型经过编译,以便将其优化为 AWS Panorama 设备的 Nvidia 加速 Linux Arm64 架构。
打包应用程序
现在我已经有了机器学习(ML)模型和应用程序代码打包在容器中,我已经准备好为 AWS Panorama Appliance 打包我的应用程序资产了:
panorama-cli package-application
此命令会将我的所有应用程序资产连同所有清单一起上载到 AWS 云账户。
部署应用程序
最后,我将应用程序部署到 AWS Panorama 设备。部署会将应用程序及其配置(如摄像机流选择)从 AWS 云复制到我的本地部署的 AWS Panorama 设备。我可以使用 Python 代码(以及可能已经知道的 Boto3 SDK)以编程方式部署我的应用程序:
client = boto3.client('panorama')
client.create_application_instance(
Name="AWS News Blog Sample Application",
Description="An object detection app",
ManifestPayload={
'PayloadData': manifest # <== this is the graph.json file content
},
RuntimeRoleArn=role, # <== 这是一个角色,它向我的应用程序授予使用 AWS 服务(例如 Cloudwatch)的权限
DefaultRuntimeContextDevice=device # <== this is my device name
)
或者,我可以使用 AWS 管理控制台:
在已部署的应用程序上,我选择部署应用程序。
我将 graphs/<project name>/graph.json
的内容复制并粘贴到控制台,然后选择下一步。
我给我的应用程序提供一个名称和一个可选的描述。我选择继续部署。
接下来的步骤是
- 声明一个 IAM 角色以授予我的应用程序使用 AWS Service 的权限。最小权限集允许在 CloudWatch 上调用
PumetricData
API。 - 选择我要部署到的 AWS Panorama 设备
- 将应用程序
descriptors.json
中定义的抽象摄像机映射到 AWS Panorama 设备已知的物理摄像机 - 填写任何特定于应用程序的输入,例如可接受的阈值、日志级别等。
一个示例 IAM 策略是
AWSTemplateFormatVersion: '2010-09-09'
描述:适用于 AWS Panorama 应用程序的资源。
资源:
runtimeRole:
类型:AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: Allow
Principal:
Service:
- panorama.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: cloudwatch-putmetrics
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: 'cloudwatch:PutMetricData'
Resource: '*'
Path: /service-role/
这六个屏幕截图捕捉了这个过程:
部署需要 15-30 分钟,具体取决于您的代码和机器学习(ML)模型的大小以及设备的可用带宽。最终,状态变为绿色为“正在运行”(Running)。
应用程序部署到您的 AWS Panorama 设备后,它将开始运行,持续分析视频并在几毫秒内在本地生成高度准确的预测。我将 HDMI 电缆连接到 AWS Panorama 设备以监控输出,我可以看到:
如果在部署期间或应用程序的生命周期内出现任何问题,我可以访问 Amazon CloudWatch 上的日志。创建了两个日志流,一个用于 AWS Panorama 设备本身,另一个用于应用程序。
定价和可用性
您可以在 AWS 控制台的 AWS Elemental 订单页面上购买 AWS Panorama 设备。您可以从美国、加拿大、英国和欧盟下订单。设备本身的一次性费用为 4,000 美元。
每台摄像机每月收费 8.33 美元。
AWS Panorama 将部署到 AWS Panorama 设备的所有资产(包括机器学习(ML)模型和业务逻辑)的版本控制副本存储在云中。对于此存储空间,您需要支付每月每 GB 0.10 美元的费用。
如果部署到 AWS Panorama 设备的业务逻辑使用其他 AWS 服务,则可能会产生额外费用。例如,如果您的业务逻辑将机器学习(ML)预测上载到 S3 进行离线分析,则 S3 将针对产生的任何存储费用单独向您收费。
AWS Panorama 设备可以安装在任何地方。设备连接回以下 AWS 区域之一的 AWS 云中的 AWS Panorama 服务:美国东部(弗吉尼亚北部)、美国西部(俄勒冈)、加拿大(中部)或欧洲(爱尔兰)。