基于 Amazon KVS 与 Amazon Rekognition Streaming Video Events 实时智能视频检测的创新实践

前言

本实验将以最小化原型,体现由 Raspberry Pi  Zero 2 W 加摄像头作为安防设备端,并使用 Amazon KVS 和 Amazon Rekognition Streaming Video Events 如何很好地解决了上述挑战,实现实时智能视觉识别。

在本次动手实验中,您将学习物联网 (IoT) 设备采集视频并传输到 Amazon 相关服务中,并结合其他一系列 Amazon 服务根据用户预设配置分析视频中的数据,并将结果响应到您的邮件中。对于此实验,您将使用 Amazon Kinesis Video Streams 和 Amazon Rekognition 等服务来完成该流程。

关于本教程
时间 120-180 分钟                                      
费用 1-3$
相关行业 安防行业、物流行业、家居行业、制造业、娱乐直播、游戏等行业
相关产品 Amazon Kinesis Video Streams、Amazon S3、Amazon Rekognition、Amazon SNS、AWS Cloud9、Amazon IAM
受众

云计算、AI、IoT 等相关技术领域开发者

级别 中级
上次更新日期 2022 年 7 月

教程说明

进入开发环境 

点击右侧按钮“登陆控制台”进入开发环境,如果您还没有账户,请先注册账户。

海外区域业务或个人使用,请注册“海外区域账户”;

中国区域业务(需企业营业执照认证),请注册“中国区域账户”。

一、实验场景介绍

在居家安防监控领域,基于实时视频的移动检测,发现监控环境中人、宠物、包裹等的出现,并且能实时地将检测结果通知给身处任何地方的用户是其重要的应用场景之一。但在这一场景的技术实现中面临如下的挑战:一是基于摄像头的视频检测通知,存在大量由于风、雨、移动的车等并非用户关注的事件误报,严重影响用户的使用体验。二是实现这一方案涉及的技术领域与复杂度很高,如设备端事件检测和触发、视频编解码处理、视频存储、机器视觉等,需要团队具备较强的技术和专业能力。本实验将以最小化原型,体现由 Raspberry Pi 加摄像头作为安防设备端,并使用 Amazon KVS 和 Amazon Rekognition Streaming Video Events 来解决上述挑战,实现实时智能视觉识别。

二、相关产品介绍

    • CPU:博通 BCM2710A1(BCM2837)(4×1GHz Cortex-A53)
    • GPU:博通 VideoCore IV
    • 内存:512MB LPDDR2
    • 存储:MicroSD(裸机不送卡)
    • 网络:2.4GHz 802.11b/g/n Wi-Fi、蓝牙 4.2
    • 接口:Mini-HDMI,Micro-USB 2.0 OTG、相机串行接口(CSI)、40 针 GPIO 接头
    • 尺寸:65×30 毫米(约 2.56×1.18 英寸)

    RPi Camera V2

    • 接入树莓派 Zero 系列
      将摄像头排线的金属面朝下,接入摄像头接口
  • AWS 提供物联网 (IoT) 服务和解决方案来连接和管理数十亿台设备。连接、存储和分析工业、家居消费、商业和汽车业工作负载的 IoT 数据。

    • 使用最为完备的 IoT 服务套组加速创新,借助 AWS IoT 不断扩展、快速行动,并节省成本。从安全设备连接到管理、存储和分析,AWS IoT 能够为您提供广泛而深入的服务,满足您构建完整解决方案之所需。
    • 从云端到边缘,确保您 IoT 应用程序的安全,AWS IoT 服务能够解决您应用程序中每一层遇到的问题,并确保设备安全性。借助预防性机制保护您的设备数据,例如加密和访问权控制,以持续审计和监控您的 AWS IoT Device Defender 配置。
    • 借助高级 AI 和机器学习(ML)整合构建智能 IoT 解决方案,借助高达 25 倍的性能提升以及低于 1/10 的运行时足迹,在云中创建模块并将其部署到设备中。 AWS 结合人工智能 (AI)、机器学习(ML)和 IoT,力求打造更为智能的设备。
    • 便捷可靠地进行扩展,以安全、可靠和弹性的云基础设施构建创新且独特的解决方案,能够将规模扩展至数十亿台设备以及数万亿条消息。AWS IoT 能够轻松与其他 AWS 服务集成。
  • Amazon Kinesis Video Streams(KVS) 是一项完全托管的亚马逊云科技服务,您可以使用 Kinesis Video Streams 捕获来自数百万种源 (包括智能手机、安全摄像头、网络摄像头、车载摄像头、无人机及其他源) 的海量实时视频数据传输到 Amazon云,或者构建应用程序以进行实时视频处理或进行面向批处理的视频。Amazon KVS 的优势包括:

    • 可以为海量设备提供实时视频传输服务。
    • 通过与 Amazon Rekognition 等托管服务集成可以非常方便的构建智能视觉应用。
    • 使用 KVS HTTP 实时流 (HLS) 可以轻松地将 KVS 中的实时和录制媒体流式传输到您的浏览器或移动应用程序。
    • KVS 让您能够使用 IAM 控制对流的访问,并且提供对静态与动态数据的安全保护。完全托管无需管理基础设施。
    • KVS 使用 S3 作为底层数据存储,借助 KVS能够根据设备和服务生成的时间戳,快速搜索和检索视频片段。
      Amazon KVS 可以分为 Producer、Stream、Consumer 三个组成部分,分别提供了 Producer SDK、KVS Stream API 和 Consumer SDK 方便开发者与 KVS 做功能集成。
  • Amazon Rekognition 提供预先训练和可定制的计算机视觉 (CV) 功能,可从您的图像和视频中提取信息和获得洞察力。提供高精度的人脸分析检测、人脸比较和人脸搜索、标签文本检测等功能。Amazon Rekognition 基于同样由 Amazon 计算机视觉科学家开发的成熟且高度可扩展的深度学习技术,每天能够分析数十亿图像和视频。它不需要机器学习专业知识即可使用。Amazon Rekognition 包含一个简单易用的 API,该 API 可快速分析存储在 Amazon S3 中的任何图像或视频文件。

三、Amazon Rekognition Streaming Video Events 方案介绍

Amazon Rekognition Streaming Video Events 是新推出的一项功能,它基于设备检测到监控环境的特定事件,将设备的视频流推送到云上 KVS,借助 Amazon Rekognition Video 按照您期望检测的标签来分析视频中的数据,并将检测结果保存到 S3、发送检测结果到 SNS。目前提供了对实时视频的人形、包裹、宠物标签检测的功能。

  • Rekognition Streaming Video Events 方案整体架构分为:设备端、AWS 云端、用户应用端。

    • 设备端
      通常为带有自动视频检测能力的摄像头设备、通过集成 KVS SDK 作为 KVS 的Producer 向云端的 KVS Stream 推送视频流,并按需触发 Amazon 云端有Rekognition 提供的视频检测的 API。
    • AWS云端
      KVS Stream: 提供设备视频持久化存储、视频检索、视频在线查看、视频下载等能力,并向 Rekognition 提供用于视频检测的数据。
      Rekognition: 提供自动执行视频和图像分析的能力,包括基于视频或图像的内容审核、人脸检测、人脸比较、标签检测等完全托管的能力,并且可以方便的与 KVS、S3、SNS 等服务集成。
      Amazon S3: 提供视频检测结果的存储。
      Amazon SNS: 完全托管的发布/订阅消息收发、SMS、电子邮件和移动推送通知在本方案中提供通知发送的能力。
      该方案的整体架构图如下:
  • 如下图所示 Rekognition Streaming Video Events 的执行流程分为预置阶段和事件处理阶段。

    • 预置阶段
      step1: 创建 S3 存储桶和 SNS topic,分别用于视频检测结果的存储和扇出。
      step2: 设备注册创建时,创建与之对应的 KVS Stream、rekognition stream processor 并将 stream processor 与 step1 中 S3 存储桶和 SNS topic绑定。
    • 事件处理阶段
      step1: IPC 设备检测到事件。
      step2: IPC 设备调用 KVS Producer SDK 的 PutMedia API 将视频流式传输到 KVS stream,同时调用 API 触发 rekognition stream processor 对视频数据进行分析。
      step3: Rekognition stream processor 根据启动参数包括处理视频的启动与停止条件、处理视频的时间等信息对视频进行分析。
      step4: Rekognition stream processor 将视频分析结果自动保存到 S3 并触发 SNS topic。
      step5: 用户通过应用程序检索视频信息或者接收通知继续完成其他的业务流程。

四、实验步骤

目前 Rekognition Streaming Video Events 这个功能支持的 AWS 的区域是:US East (Ohio), US East (N. Virginia), US West (Oregon), Asia Pacific (Mumbai), and Europe (Ireland)后续会陆续在其他的 Region 提供该功能,本次实验我们选择在 Ireland。

    • 本次实验需要用到的 AWS 资源都在 Ireland 中创建,您需要提前准备好一个 AWS account。
    • 在 AWS IAM 中创建一个 Admin User,赋予 arn:aws:iam::aws:policy/AdministratorAccess 策略。创建 Admin User 步骤如下:

    1、在 IAM 里点击用户,在点击添加用户

    2、输入用户名和密码,点击下一步

    3、选择直接附加现有策略,勾选策略 AdministratorAccess,点击下一步

    4、后续一直点下一步直到 Admin User 创建成功

    至此,Admin User 创建完成

    • 切换 Admin User 登录,后续的资源创建都需要使用这个用户来进行

    1、记录好账号 ID,并退出登录

    2、选择 IAM 账号登录,填写账号 ID 后,点击下一步,使用 Admin User 登录。登录成功后注意切换区域为爱尔兰

  • 4.2.1 配置 2.4G Wifi

    使用无线路由器或者手机热点配置一个 WPA2 PSK 的 wifi,频段选择 2.4GHz,记好无线的 SSID 和密码,在下一步烧入的时候会用到。

    4.2.2 安装和烧录树莓派

    用读卡器将 SD 卡连接到电脑,电脑下载树莓派 Raspberry Pi Imager 后再进行对 SD 卡烧录。到树莓派官网上下载最新的 Raspberry Pi Imager,下载的地址点这里

    电脑安装并运行 PI Imager、运行成功后选择 OS

    选择 64 位的带 PI Desktop 的 OS

    右下角点击配置进行主机名,SSH,以及 WIFI 的配置,以在启动后通过 SSH 远程方式连接。

    4.2.3 ssh 连接树莓派

    树莓派按要求接好摄像头、SD 卡,电源线后,通电自动开机。大概 1 分钟左右会自动连上配置好的 wifi,使用电脑连接同一无线(确保在同一局域网),电脑可以通过 SSH 远程方式连接到树莓派。电脑通过终端工具输入下面代码并回车:

    ssh 用户名@主机名       # ssh pi@test001

    第一次连接会提示确认连接,输入:yes 然后输入 SSH 密码即可连接成功

    4.2.4 配置树莓派

    SSH 连接成功后,首先需要更换清华镜像源:
    输入下面代码并回车,进入编辑器;

    sudo nano /etc/apt/sources.list

    用以下内容取代;

    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free

    编辑完后按提示保存并退出。输入下面代码并回车,进入编辑器;

    sudo nano /etc/apt/sources.list.d/raspi.list

    用以下内容取代:

    deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main

    编辑完后按提示保存并退出。
    至此,源替换完成

    4.2.5 编译环境

    安装完整的依赖包。

    sudo apt-get update
    
    sudo apt-get upgrade
    
    sudo apt-get install libssl-dev libcurl4-openssl-dev liblog4cplus-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools cmake

    在终端中执行以下命令。

    cd
    
    git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git

    注意:如果您忘记向命令添加--recursive,请执行以下两行命令。

    cd ~/amazon-kinesis-video-streams-producer-sdk-cpp
    
    git submodule update --init

    下载并构建依赖库

    mkdir -p ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build

    编译的时候加上不编译依赖包的参数。

    cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=OFF

    最后执行

    make

    至此,编译环境介绍

    4.2.6 将摄像头的数据上传到 KVS

    **注意:**这里的 ACCESS_KEY 和 SECRET_KEY 都是你前面账号生成的凭证,需要自行修改

    export AWS_DEFAULT_REGION="eu-west-1"
    
    export AWS_ACCESS_KEY_ID="你的ACCESS KEY"
    
    export AWS_SECRET_ACCESS_KEY="你的 SECRET KEY"
    
    export GST_PLUGIN_PATH=$HOME/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    export LD_LIBRARY_PATH=$HOME/amazon-kinesis-video-streams-producer-sdk-cpp/open-source/local/lib
    
    cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    libcamera-vid -n -t 0 -o - | gst-launch-1.0 -v fdsrc do-timestamp=TRUE ! h264parse config-interval=1 ! video/x-h264,stream-format=avc,alignment=au ! kvssink stream-name="kvs-workshop-stream"

    至此,树莓派已持续将摄像头采集的图像推送到 KVS
    如图:

    由于 Amazon Rekognition Streaming Video Events 视频识别时对视频的清晰度等有一定要求,接下来,我们用预先准备的视频进行接下来的操作步骤。

  • 4.3.1 创建 AWS Cloud9 作为 KVS 的 Producer

    在此步骤中,您将设置 AWS Cloud9。
    选择 Region

    • 打开 AWS Cloud9 控制台
    • 从控制台的右上角,选择以下区域之一
      • eu-west-1(爱尔兰)在讲座期间使用同一区域。

    创建 Cloud9 环境

    • 单击 Cloud9 控制面板右上角的创建环境

    创建 Cloud9 环境(步骤1)

    • 输入描述性名称,以便在实验后删除它(例如 kvs-workshop-environment)
    • 点击 Next step

    创建 Cloud9 环境(步骤 2~3)

    • Environment type:选择 Create a new EC2 instance for environment (direct access)
    • Instance type:选择 t3.small
    • Platform:选择 Ubuntu Server 18.04 LTS
    • Cost-saving setting:选择 After four hours
    • 单击屏幕底部的 Next step
    • 在下一个屏幕上,单击 Create environment 以启动 Cloud9 环境,然后等待一两分钟才开始
      【如下图所示】

    注意: 选择默认 VPC 的子网。如果不存在默认 VPC,请按照 AWS Cloud9 开发环境的以下 VPC 设置创建 VPC 和子网;如果存在默认的 VPC 请忽略。

    此时在屏幕底部,您可以看到 Admin:~/environment $,这是 Cloud9(EC2)终端。

    安装库(步骤 4)

    sudo apt update
    
    sudo apt install -y cmake gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools libgstreamer-plugins-base1.0-dev

    磁盘空间扩展

    • 在 Cloud9 终端中执行以下命令,它将扩展磁盘并重新启动实例
    • 请等到实例重新启动,因为您将在实例重新启动时看到 Connecting...
    wget https://awsj-iot-handson.s3-ap-northeast-1.amazonaws.com/kvs-workshop/resize_volume.sh
    
    chmod +x resize_volume.sh
    
    ./resize_volume.sh
    • 实例重新启动后,点击 link 后,在终端中运行以下命令以检查磁盘空间
    df -h

    在命令的结果中,确保/为 20GB,如下所示

    到此为止,我们设置了一个Cloud9环境。接下来,我们将继续安装 SDK。
     
    设置 Amazon Kinesis Video Streams Producer SDK C++(Cloud9)
     
    在这一步中,我们将安装 Amazon Kinesis Video Streams Producer SDK C++ 在您的 Cloud9 环境中。
     
    下载 SDK(步骤 5)
    在 Cloud9 终端中执行以下命令。
    cd      # 进入家目录
    
    git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git      # 克隆仓库
    注意: 如果您忘记向命令添加--recursive,请执行以下命令;如果已增加该参数请忽略。
    cd ~/amazon-kinesis-video-streams-producer-sdk-cpp
    
    git submodule update --init
    构建 SDK(步骤 6)
    此步骤大约需要 10 到 15 分钟才能完成。您可以在等待期间继续执行下面的“创建流”和“下载视频以供播放”步骤。
    以下命令下载并构建依赖库。此命令大约需要 10 分钟才能完成。
    mkdir -p ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    cmake -DBUILD_GSTREAMER_PLUGIN=ON ..

    然后运行以下命令来构建 SDK,这大约需要几分钟。

    make

    现在您已经设置了 Amazon Kinesis Video Streams Producer SDK C++,让我们运行示例应用程序。

    4.3.2 运行示例应用程序(Cloud9)

    在此步骤中,运行 Amazon Kinesis Video Streams Producer SDK C++示例应用程序并上传视频。
    创建流(步骤 7)

    • 打开 Amazon Kinesis 视频流控制台(Kinesis Video Streams)
    • 确认这个地区与您在 前面实验中选择的地区相同
    • 单击左侧菜单中的 “视频流”,然后单击 “创建视频流” 按钮
    • 在表格中填写以下信息,然后单击 “创建视频流” 按钮
    • 视频流名称:kvs-workshop-stream
    • 选择 default configuration
    • 点击创建,成功如下

    到此,流已经创建。

    下载视频进行播放(步骤 8)

    • 您将使用预下载的视频,而不是 USB 相机。
    • 在 Cloud9 终端中运行以下命令下载视频剪辑
    cd
    
    wget https://awsj-iot-handson.s3-ap-northeast-1.amazonaws.com/kvs-workshop/sample.mp4
    注意: 您也可以使用自己的视频,而不是上面的示例视频。请注意,如果您想使用Amazon Recognition Video 分析视频,则该视频必须编码为 H.264。

    获取 AWS 凭据(步骤9)
    获取 AWS 凭证官方文档
    请根据您使用的 AWS 环境选择一个步骤。

    A)如果您正在使用 AWS Event Engine 的帐户
    如果您在 AWS 事件中使用 AWS Event Engine 的帐户,您应该按照此步骤操作,然后跳过“B)如果您正在使用自己的 AWS 帐户”步骤。

    • Copy the credentials like below from Team Dashboard > AWS Console of Event Engine 并将其粘贴到 Cloud9 终端:
    export AWS_DEFAULT_REGION=...
    export AWS_ACCESS_KEY_ID=...
    export AWS_SECRET_ACCESS_KEY=...
    export AWS_SESSION_TOKEN=...
    B) 如果您正在使用自己的 AWS 帐户【这种情况居多】
    使用 AWS CLI 获取上传视频的临时凭据。
    请注意,如果您尚未在 PC 上设置 AWS CLI 进行操作,请点击右边链接安装 AWS CLI:安装 AWS CLI

    在右上角点击用户,再点击安全凭证,然后点击创建访问秘钥

    请记录好该访问秘钥 ID 和私有访问秘钥(只显示一次),下一步会用到

    CLI 完成安装后,在自己的电脑终端进行以下操作:

    aws configure       # 配置 aws 临时凭证
    AWS Access Key ID [None]: [输入自己账号的 AWS Access Key ID]
    AWS Secret Access Key [None]: [输入自己账号的 AWS Secret Access Key]
    Default region name [None]: eu-west-1
    Default output format [None]: json

    接下来在自己的电脑终端中运行以下命令。

    aws sts get-session-token

    您将获得以下结果,因此我们将此值设置为 Cloud9 的环境变量。

    {
        "Credentials": {
            "AccessKeyId": "...",
            "SecretAccessKey": "...",
            "SessionToken": "...",
            "Expiration": "2020-01-01T00:00:01Z"
        }
    }

    接下来,打开 Cloud9 终端并执行以下命令来设置环境变量。
    **注意:**这里的 ACCESS_KEY 和 SECRET_KEY与SESSION_TOKEN 都是上一步 json 返回获得的,需要自行修改

    export AWS_DEFAULT_REGION="eu-west-1"
    
    export AWS_ACCESS_KEY_ID="上一步Json中的AccessKeyId的值"
    
    export AWS_SECRET_ACCESS_KEY="上一步Json中的SecretAccessKey的值"
    
    export AWS_SESSION_TOKEN="上一步Json中的SessionToken的值"

    **在本实验中,AWS CLI 用于获取 IAM 用户的临时凭据,以简化过程,但每次在真正的相机设备上都很难做到这一点。在现实世界的用例中,您可以使用 AWS IoT 管理的客户端证书来获取凭据。如何使用 AWS IoT 凭据提供商消除设备中对硬编码 AWS 凭据的需求

     **将视频上传到视频流(步骤 10)
    在 Cloud9 终端中运行以下命令来设置环境变量。

    export GST_PLUGIN_PATH=$HOME/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    export LD_LIBRARY_PATH=$HOME/amazon-kinesis-video-streams-producer-sdk-cpp/open-source/local/lib

    然后运行以下命令上传视频。

    cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    while true; do ./kvs_gstreamer_file_uploader_sample kvs-workshop-stream ~/sample.mp4 $(date +%s) audio-video && sleep 10s; done

    注意: 如果您收到错误,请确保已将 AWS 凭据设置为环境变量,并且流名称(kvs-workshop-stream)正确无误。
    此视频流将用于以下步骤,保持命令运行,或在您运行下一步时重新运行它

    检查视频流(步骤11)

    • 打开 Amazon Kinesis Video Streams 视频流控制台
    • 点击左侧菜单中的视频流 > 点击列表中的 kvs-workshop-stream
    • 点击媒体播放部分将其展开,您将看到您上传的视频

    就这样。您学习了如何使用 Amazon Kinesis Video Streams Producer SDK C++ 上传视频。

  • 4.4.1 创建 S3 Bucket(步骤 12)

    创建 S3 Bucket,Bucket Name 命名为:video-event-analytics-账户 ID,创建 S3 bucket 时的其他参数都保证默认配置,

    创建 S3 Bucket 成功后,在 bucket 里创建文件夹 video-result

    创建成功后 s3 bucket 的信息如下。

    如下图所示:记录下 S3 bucket ARN 后续实验环节需要用到

    4.4.2 创建 SNS 并配置邮件订阅(步骤 13)

    • 在 Amazon SNS(Simple Notification Service)里创建 Topic,选型类型为:Standard类型,Topic 名称命名为:video-event-sns。
    • 记录该 Topic 的 ARN,后续实验环节需要使用

    创建 SNS Topic 的订阅
    其中 Topic ARN 选择上面创建的 SNS 的 ARN,Protocol 选择为 Email,在实际应用中您可以根据需要采用的订阅方式选型相应的协议类型。

    • 创建完成后,需要到刚刚填写的邮箱里面点击确认,确认成功后,显示如下
    4.4.3 创建 Rekognition Service Role(步骤 14)
    进入 IAM 角色页面
    创建 Rekognition Service Role,该角色用于赋予 Rekognition Processor 操作其他服务的权限。本次实验需要给 Rekognition Processor 赋予操作 S3 和 SNS 的权限。具体步骤如下。
    • 如下所示,首先创建 IAM 策略:Rekognition_call_s3_kvs_policy,授予访问 KVS、SNS、S3 的必要权限
    • 在 JSON 里面用下面的 json 代码覆盖后(其中 KinesisVideoStream-名字、SNS-arn、S3-arn 需要修改为您自己的实验环境中创建的资源。)再点击先一步

    注意: 这里的各个服务的 ARN 都是自己独有的...eu-west-1:123123123123...等都是方便让你了解填写格式的 demo 并没有配置效果,需要自行修改{

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "KinesisVideoPermissions",
                "Effect": "Allow",
                "Action": [
                    "kinesisvideo:GetDataEndpoint",
                    "kinesisvideo:GetMedia"
                ],
                "Resource": [
                    "arn:aws:kinesisvideo:eu-west-1:::stream/你的kvsStreamName/*"
                ]
            },
            {
                "Sid": "SNSPermissions",
                "Effect": "Allow",
                "Action": [
                    "sns:Publish"
                ],
                "Resource": [
                    "arn:aws:sns:eu-west-1:123123123123:video-event-sns"
                ]
            },
            {
                "Sid": "S3Permissions",
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject"
                ],
                "Resource": [
                    "arn:aws:s3:::video-event-analytics-123123123123/*"
                ]
            }
        ]
    }
    • 至此,策略创建完成
    • 其次,IAM 角色:Rekognition_call_s3_kvs_Role,并关联上一步创建的策略
    • 【创建角色】时选择 Trusted Entity Type为AWS Service ,选择支持的 AWS 服务的场景为 Rekognition
    • 角色创建完成后,进入该角色,记录好角色的 ARN(后续会用到),并在权限里面,将上一步创建的 IAM 策略关联到 Rekognition Service Role。
  • 4.5.1 升级 Cloud9 的 AWS Cli 到最新版本【如果已是最新版本请忽略】

    因为 Rekognition Streaming Video Events 是 2022 年 4 月底才发布的新功能,要采用 aws cli 创建 rekognition-stream-processor 使用该功能,需要将您的cli升级到包含 rekognition 这个新特性的版本,这里我们将 cli 升级到最新版本。

    • 执行如下命名升级 AWS Cli 到最新版本
    cd
    
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    
    unzip awscliv2.zip
    
    sudo ./aws/install
    
    sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update

    4.5.2 创建 rekognition-stream-processor(步骤 15)

    • 准备好创建 rekognition-stream-processor的 json 文件在 Cloud9 的 /home/ubuntu/environment/ 目录(这里可以直接在 Cloud9 中创建,也可以在本地创建然后使用 Cloud9 的 upload 上传上来)createstreamprocessor.json

    创建 rekognition-stream-processor 参数的json文件如下图所示,其中 KinesisVideoStream-Arn、S3Destination-Bucket、S3Destination-KeyPrefix、RoleArn 需要修改为您自己的实验环境中创建的资源。
    ConnectedHome 是 rekognition-stream-processor 新功能提供的新参数,其中ConnectedHome 的 Labels 目前支持包括”PERSON”, “PET”, “PACKAGE”, and “ALL”。可以跟您希望检测的标签来填写。详细介绍可以参考:
    https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor.html
    createstreamprocessor.json 内容如下所示:

    {
        "DataSharingPreference": { 
          "OptIn":true
        },
        "Input": {
          "KinesisVideoStream": {
            "Arn": "你的kvs ARN值"
          }
        },
        "Name": "video_event_stream_processor",
        "Output": {
          "S3Destination": {
            "Bucket": "你的桶名",
            "KeyPrefix": "video-result"
          }
        },
        "NotificationChannel": {
          "SNSTopicArn": "你的SNS ARN值"
        },
        "RoleArn": "你的IAM ARN值",
        "Settings": {
          "ConnectedHome": {
            "Labels": [
              "PERSON"
            ],
          "MinConfidence": 80
          }
        },
        "RegionsOfInterest": [
          {
            "BoundingBox": {
              "Top": 0.11,
              "Left": 0.22,
              "Width": 0.33,
              "Height": 0.44
            }
          },
          {
            "Polygon": [
              {
                "X": 0.11,
                "Y": 0.11
              },
              {
                "X": 0.22,
                "Y": 0.22
              },
              {
                "X": 0.33,
                "Y": 0.33
              }
            ]
          }
        ]
    }
    • Stream-Processor Request 主要参数说明
      以下为 Rekognition Streaming Video Events 需要用到主要参数

    No. Name Required Default Description
    2 Input Yes N/A 目前支持KVS的视频流
    3 Output Yes N/A 对应Rekognition streaming video events检测结果的输出,目前仅支持s3作为输出
    4 S3Destination Yes N/A 用于保存推理结果,BucketName必选,ObjectKeyPrefix可选
    5 RoleArn Yes N/A IAM Role ARN,赋予stream-processor操作kvs、s3和SNS的权限
    6 NotificationsChannel Yes(for New feature) N/A 发送视频分析结果通知的通道,目前仅支持SNS
    7 KMSKeyId Yes(for New feature) N/A 用于对保存到s3中处理结果进行加密的KMS Key
    8 Settings Yes N/A SecurityMonitoring : 用于使用者指定需要检测的对象类型,目前支持的类型有: PERSON, PET, PACKAGE, ALL.FaceSearch: 在实时视频的场景使用者用于设置人脸搜索的设置
    9 HomeSecurityMonitoringObjectDetection Yes(for New feature) N/A Rekognition streaming video events场景下设置视频标签检测的类型
    10 ObjectClassesToDetect Yes(for New feature)   Rekognition streaming video events场景设置需要检测的标签
    11 MinConfidence No 50 设置视频标签检测的最小置信度
    12 RegionsOfInterest No Empty检测全部视频帧 设置视频帧相应标签检测的区域
    13 DataSharingPreferences No True for optIn flag 设置是否容许Rekognition将视频用于的模型训练

    • 将该 json 文件上传到 Cloud9 的 /home/ubuntu/environment/ 目录,在 Cloud9 terminal 中执行如下的命令创建 rekognition-stream-processor
    aws rekognition create-stream-processor --region eu-west-1 --cli-input-json file:///home/ubuntu/environment/createstreamprocessor.json
    • 执行如下命令查看 rekognition-stream-processor 的详细信息
    aws rekognition describe-stream-processor --name video_event_stream_processor --region eu-west-1

    如下图示 stream-processor 目前处于 STOPPED 状态

    {
        "Name": "video_event_stream_processor",
        //StreamProcessorArn
        "StreamProcessorArn": "your stream proccessor arn",
        "Status": "STOPPED",
        "CreationTimestamp": "2022-05-05T09:50:07.013000+00:00",
        "LastUpdateTimestamp": "2022-05-05T09:50:07.013000+00:00",
        "Input": {
            //kvs视频来源的ARN
            "KinesisVideoStream": {
                "Arn": "your kvs stream arn"
            }
        },
        //保存检测结果的S3
        "Output": {
            "S3Destination": {
                "Bucket": "your s3 Bucket arn",
                "KeyPrefix": "your key prefix"
            }
        },
        //streaming processor 执行的 Role
        "RoleArn": "your streaming processor role",
        "Settings": {
            "ConnectedHome": {
                "Labels": [
                    "PERSON"
                ],
                "MinConfidence": 80.0
            }
        },
        //发送检测结果通知的 SNSTopicArn
        "NotificationChannel": {
            "SNSTopicArn": "Your SNSTopicArn"
        },
        "RegionsOfInterest": [
            {
                "BoundingBox": {
                    "Width": 0.33000001311302185,
                    "Height": 0.4399999976158142,
                    "Left": 0.2199999988079071,
                    "Top": 0.10999999940395355
                }
            },
            {
                "Polygon": [
                    {
                        "X": 0.10999999940395355,
                        "Y": 0.10999999940395355
                    },
                    {
                        "X": 0.2199999988079071,
                        "Y": 0.2199999988079071
                    },
                    {
                        "X": 0.33000001311302185,
                        "Y": 0.33000001311302185
                    }
                ]
            }
        ],
        "DataSharingPreference": {
            "OptIn": true
        }
    }
    4.5.3 启动 rekognition-stream-processor(步骤 16)
    • 准备启动 rekognition-stream-processor 的 json 文件

    startstreamprocessor.json 内容如下所示:

    {
       "Name": "video_event_stream_processor",
       "StartSelector": {
          "KVSStreamStartSelector": {
             "ProducerTimestamp": 1651702500
          }
       },
       "StopSelector": {
          "MaxDurationInSeconds": 30
       }
    }
    StartSelector
    除了通过ProducerTimestamp(Producer产生视频的时间)设置视频分析的开始位置外,您还可以通过KVSFragmentNumber(视频帧号)设置开始时间。
    StopSelector
    通过MaxDurationInSeconds(最大视频检测时长)设置停止检测分析外,未来您还可以通过NoDetectionForDuration(在固定检测时间中如果没有检测到设定的标签则停止检测出来)。
    • 执行如下命令启动rekognition-stream-processor
    aws rekognition start-stream-processor --region eu-west-1 --cli-input-json file:///home/ubuntu/environment/startstreamprocessor.json

    返回值

    {
    "SessionId": "16d15f11-02a1-4955-8248-f3184d66cb94"
    }

    4.5.4 观测执行结果(步骤 17)

    stream-processor 按照 start-stream-processor 中设定的视频检测起始与结束条件完成对设置的目标标签(Person/Package/Pet/ALL)检测处理后,将检测结果保存到 S3 并通过配置的 SNS 发送出去。

    • 观测 S3 中保存的检测结果
      执行
      注意: 这里的 video-event-analytics-123123123123 是示例桶的名字,这里需要改成你自己的 s3 桶名
    aws s3 ls video-event-analytics-123123123123 --recursive
    此时 s3 中会存入检测的结果,如下所示其中:
    video-result: 对应stream-processo r中配置的 ObjectKeyPrefix
    video_event_stream_processor: 对应 stream-processor 中配置的 name
    **7aa6f62b-dfba-42bb-aa80-b5e50e7403e8:**对应 start-stream-processor 返回的 SessionId。
    2022-05-05 12:08:37 25072 video-result/video_event_stream_processor/7aa6f62b-dfba-42bb-aa80-b5e50e7403e8/notifications/5_1.0_heroimage.jpg
    
    022-05-05 08:58:29 0 video-result/
    2022-05-06 08:32:45 69316 video-result/video_event_stream_processor/16d15f11-02a1-4955-8248-f3184d66cb94/notifications/5_1.0.jpg
    
    2022-05-06 08:32:46 25072 video-result/video_event_stream_processor/16d15f11-02a1-4955-8248-f3184d66cb94/notifications/5_1.0_heroimage.jpg
    
    2022-05-05 10:15:11 69316 video-result/video_event_stream_processor/4923874d-049f-40e4-a38e-5df20955b809/notifications/5_1.0.jpg
    
    2022-05-05 10:15:11 25072 video-result/video_event_stream_processor/4923874d-049f-40e4-a38e-5df20955b809/notifications/5_1.0_heroimage.jpg
    
    2022-05-05 12:08:37 69316 video-result/video_event_stream_processor/7aa6f62b-dfba-42bb-aa80-b5e50e7403e8/notifications/5_1.0.jpg
    观测 SNS 发送的结果
    stream-processor 检测结束后,将发送两种类型的通知消息到 SNS,下面为视频标签检测的结果信息
    {
        "inputInformation": {
            "kinesisVideo": {
                "streamArn": "=your kvs stream arn"
            }
        },
         //通知消息类型LABEL_DETECTED
        "eventNamespace": {
            "type": "LABEL_DETECTED"
        },
         //标签描述
        "labels": [
            {
                "id": "704ecb70-0ec5-4f14-966d-90a1837ae1b5",
                "confidence": 97.671364,
                "name": "PERSON",
                "frameImageUri": "s3://video-event-analytics/video-result/video_event_stream_processor/16d15f11-02a1-4955-8248-f3184d66cb94/notifications/5_1.0.jpg",
                "croppedImageUri": "s3://video-event-analytics/video-result/video_event_stream_processor/16d15f11-02a1-4955-8248-f3184d66cb94/notifications/5_1.0_heroimage.jpg",
                "videoMapping": {
                    "kinesisVideoMapping": {
                        "fragmentNumber": "91343852333196827415010615634393321213860465930",
                        "serverTimestamp": 1651739574510,
                        "producerTimestamp": 1651739574000,
                        "frameOffsetMillis": 1000
                    }
                },
                "boundingBox": {
                    "left": 0.45954865,
                    "top": 0.4983085,
                    "height": 0.48800948,
                    "width": 0.099167705
                }
            }
        ],
        "eventId": "ba763aa1-821c-3592-91e2-dec731329d1a",
        "tags": {},
        "sessionId": "16d15f11-02a1-4955-8248-f3184d66cb94",
        "startStreamProcessorRequest": {
            "name": "video_event_stream_processor",
            "startSelector": {
                "kvsProducerTimestamp": 1651702500
            },
            "stopSelector": {
                "maxDurationInSeconds": 30
            }
        }
    }
    如下所示为检测处理完成的信息
    {
        "inputInformation": {
            "kinesisVideo": {
                "streamArn": "your kvs stream arn",
                "processedVideoDurationMillis": 30000.0
            } 
        },
        "eventNamespace": {
            //通知消息类型STREAM_PROCESSING_COMPLETE
            "type": "STREAM_PROCESSING_COMPLETE"
        },
        "streamProcessingResults": {
            "message": "Stream Processing Success."
        },
        "eventId": "16d15f11-02a1-4955-8248-f3184d66cb94",
        "tags": {},
        "sessionId": "16d15f11-02a1-4955-8248-f3184d66cb94",
        "startStreamProcessorRequest": {
            "name": "video_event_stream_processor",
            "startSelector": {
                "kvsProducerTimestamp": 1651702500
            },
            "stopSelector": {
                "maxDurationInSeconds": 30
            }
        }
    }
    借助上面的检测结果,可以扩展丰富您的业务应用场景。

五、生产应用参考架构

  • 在 2.1 参考架构的基础增加如下内容
     
    后端服务: 提供基于特定业务场景的 API,如设备注册、检测信息保存、检测结果查看、视频事件处理API,该服务可以根据需要部署在 EC2、AWS 容器服务、Lambda 上。
    Database: 将视频检测结果与业务信息(如用户设备信息)持久化存储以供后续的查询使用,基于这些数据的类型、读写要求建议使用 Amazon DocumentDB 或 DynamoDB 来保存。
    SNS 订阅处理: 根据业务需要可以与短信、邮箱、APP推送集成、也可以与其他的设备如(Alexa)等集成丰富您的业务功能。
     
    扩展后的架构如下图所示:
  • 如下图所示为 Rekognition Streaming Video Events 的执行流程,分为预置阶段和事件处理阶段

    • 预置阶段
      预置阶段处理与 2.2 执行流程说明类似,后台服务提供统一 API 在设备注册时完成 kvs stream、streaming-processor 创建和对应关系绑定。
    • 事件处理阶段
      step1: IPC 设备检测到事件。
      step2: IPC 设备调用 KVS Producer SDK 的 PutMedia API 将视频流式传输到 KVS stream,同时调用后端服务的 API 触发 rekognition stream processor 对视频数据进行分析。
      step3: rekognition stream processor 根据启动参数包括处理视频的启动与停止条件、处理视频的时间等信息对视频进行分析。
      step4: rekognition stream processor 将视频分析结果自动保存到 S3 并触发 SNS topic。
      step5: SNS topic 的订阅触发后端服务 API,该 API 根据一定的业务逻辑将检测结果与业务信息保存到数据库。
      step6: SNS topic 的订阅触发消息推送,将处理结果推送给终端用户。
      step7: SNS topic 的订阅触发其他集成设备。
      step8: 终端应用调用后端服务的 API 查看处理结果,显示检测结果中存储在 S3 中的图片或者回看 KVS 中存储的视频片段。

六、实验资源清除

动手实验做完后,为了避免资源持续扣除费用,我们需要删除对应的资源
返回 Cloud9 开发环境,按如下命令进行资源清除:

清除 s3 存储桶

  • 清除存储桶内所有 object
aws s3 rm s3://video-event-analytics-<您的账号ID> --recursive
  • 清除存储桶
aws s3 rb s3://video-event-analytics-<您的账号ID>
  • 清除 Kinesis video stream
aws kinesisvideo delete-stream --stream-arn <您的stream arn>

清除 sns

  • 清除 topic
aws sns delete-topic --topic-arn <您的topic arn>
  • 清除订阅
aws sns unsubscribe --subscription-arn <您的subscripiton arn>
  • 清除 rekognition stream-processor
aws rekognition delete-stream-processor --name=video_event_stream_processor

清除 cloud9 环境

  • 进入控制台 cloud9- Your enviroments 页面
  • 选中创建的 cloud9 环境,点击 Delete

七、结束语

在端到端的处理流程中,按照检测数据输入来源、输入数据格式、数据处理方案、智能识别方式这几个维度的可选的组合有如下几种技术方案可供选择。AWS 提供的云服务能力可以很好的支持这些方案的实现。
序号 A B C D
1 媒体数据来源 媒体数据格式 媒体数据处理 智能检测技术
2 摄像头 Video 不涉及 Rekognition Video(云端)
3       自建模型(云端/设备端)
4   Image 抽图(端侧) Rekognition Image(云端)
5       自建模型(云端/设备端)
6 云端视频流(KVS) Video 不涉及 Rekognition Image(云端)
7       自建模型(云端/设备端)
8   Image 基于KVS GetMedia(云测) 自建模型(云端)
9     基于KVS Images(云测) Rekognition Image(云端)
10     基于Rekognition Video Stream Events(云侧) Rekognition Video Stream Events(云端)

智能识别部署位置对比分析


序号 A B C D E
1 部署位置 成本 时延 技术实现难度 说明
2 设备端 可控 需要自行实现模型部署、训练的工程化,无法借助云端的能力
3 云端 可控 可以自行选择Rekognition、Sagemaker、EC2自建降低开发与维护成本

智能识别输入数据格式对比分析
序号 A B C D
1 数据格式 成本 技术实现难度 说明
2 Video 无需数据格式的处理
3 Images 可控 Video到Image格式的处理,自行管理视频处理程序包括解码和分辨率处理
智能识别输入数据处理对比分析
序号 A B C D E
1 云端抽图方式 成本 技术实现难度 智能检测对接 说明
2 KVS GetMedia 可控 自建或托管 自行管理视频处理程序包括解码和分辨率处理
3 KVS GetImages 可控 适中 自建或托管 只需要调用 KVS 相关API即可
4 Rekognition Video Stream Events 可控 全托管 无需处理,AI场景支持有限
智能识别方案对比分析
序号 A B C D E
1 智能检测方案 成本 技术实现难度 AI场景支持 说明
2 Rekognition Video 较高 适中 较为丰富 自行管理视频处理程序包括解码和分辨率处理
3 Rekognition Image 可控 适中 较为丰富 只需要调用 KVS 相关API即可
4 Rekognition Video Stream Events 可控 固定的几种 完全托管,AI场景支持有限
5 自建模型(云端) 可控 可定制化AI场景 借助Sagemaker,EC2自建降低开发与维护成本
6 自建模型(设备端) 可控 较高 可定制化AI场景 需要自行实现模型部署、训练的工程化,无法借助云端的能力
实际应用中您可以根据 AI 场景的复杂度、团队的技术储备、成本、项目交付周期这几个维度选择适合当前状况的方案。
 
在基于指定标签的视频检测的场景中,Amazon 提供的技术一共有如下 4 种。
 
方案 1: 基于 KVS+Rekognition Detecting labels in a video
方案 2: 基于 KVS+Rekognition Detecting labels in an image
方案 3: 基于 KVS+自建 Detecting labels
方案 4: 基于 KVS+Rekognition Detecting labels in streaming video events
 
其中方案 1、2、3 需要不间断的从 KVS 中读取视频或者抽取图片,然后调用 Rekognition 提供的 API 完成视频分析。这种方式对 Rekognition 的 API 调用非常频繁,相应的成本也较高,为了降低成本可以结合端侧设备侦测事件的能力,在后端服务中提供事件处理的 API,由该 API 触发启停 Rekognition 分析视频的动作,但实现这种 API需要考虑的因素比较多,开发的技术难度也较大。而方案 4 借助 AWS Rekognition 近期发布的 Rekognition Streaming Video Events 功能提供了这种 API 的实现,开发者可以借助 Rekognition streaming processor 的 API 精确控制 Rekognition streaming processor 的创建、启动、停止,从而降低实现于预定标签的视频检测需求的难度,快速实现视频检测功能的上线。对应方案3您需要自己构建视频检测的模型、管理模型的训练推理和自动化扩展,如果 Rekognition 提供的 API 的检测能力无法满足您特定业务需求、且开发团队具备较强的 AI 开发能力可以考虑使用这一方案。但如果您初次为自己的产品提供智能视觉能力,Rekognition Streaming Video Events 可以帮您快速实现这一需求,降低开发与维护的成本,同时后续您也能从 Rekognition Streaming Video Events 不断的迭代推出新的视频检测能力中收益,大大降低前期的研发投入。

八、参考资料

Amazon Kinesis Video Streams 官方简介
Amazon Doc of Rekognition Streaming Video Events Working with streaming video events
Rekognition Streaming Video Events Blog
Real Time Face Identification on Live Camera Feed using Amazon Rekognition Video and Kinesis Video Streams
Amazon Kinesis Video Streams Workshop
Easily perform facial analysis on live feeds by creating a serverless video analytics environment using Amazon Rekognition Video and Amazon Kinesis Video Streams
Amazon Rekognition API 更新说明

入门资源中心

获取更多上手教程,开发资料,以及成本管理攻略。

现在就开始在亚马逊云上构建

无论您是在寻找计算能力、数据库、存储、内容分发、人工智能与机器学习,大数据分析还是其他功能,亚马逊云科技都有相应的服务来帮助您建立具有更高灵活性、可扩展性和可靠性的复杂应用。

企业出海或个人体验

超过 200 项服务
包含 100 余种产品免费试用

发展中国业务

近百项服务
包含宁夏区域 30 余种产品免费试用