亚马逊AWS官方博客

使用Amazon IoT Core, Amazon Kinesis Video Streams 和Amazon Rekognition构建中小安防系统的方法

中小企业商户(SMB)及家用入侵报警系统从传统传感器探测,报警主机上报警情发展到通过智能网络摄像头实现入侵的监测,报警,以及警情视频验证(Alarm Video Verify)。 使用低成本的网络摄像头(硬件资源有限,不支持边缘推理计算)+云端存储推理实现家用及中小商户安防监控成为一个流行的方式。

本文将介绍如何使用Amazon IoT控制网络摄像头的布防撤防状态,根据自带移动探测器(PIR Motion Detector) 触发拍摄一段视频通过Kinesis Video Streams服务上传云端,同时可以使用云端的人工智能Amazon Rekognition服务提供人脸的识别,提供更精准的警报推送服务。

关于Amazon IoT Core,Amazon Kinesis Video Streams, Amazon Rekognition

Amazon IoT Core提供云服务将 IoT 设备连接到其它设备和 Amazon云服务,Amazon IoT Core 提供设备软件以帮助您将 IoT 设备集成到基于 Amazon IoT 的解决方案。 本方案使用到的Amazon IoT Device Shadow 服务在 Amazon IoT Core事物对象中添加设备影子,无论设备是否连接到 Amazon IoT Core,设备影子都可以向应用程序和其他服务提供设备的状态。

Amazon Kinesis Video Streams 是一项完全托管的 Amazon 服务,您可以使用 Kinesis Video Streams 捕获来自数百万种源 (包括智能手机、安全摄像头、网络摄像头、车载摄像头、无人机及其他源) 的海量实时视频数据传输到 Amazon云,或者构建应用程序以进行实时视频处理或进行面向批处理的视频。

Amazon Rekognition 提供高精度的人脸分析,人脸比较和人脸搜索功能。Amazon Rekognition 基于同样由 Amazon 计算机视觉科学家开发的成熟且高度可扩展的深度学习技术,每天能够分析数十亿图像和视频。它不需要机器学习专业知识即可使用。Amazon Rekognition 包含一个简单易用的 API,该 API 可快速分析存储在 Amazon S3 中的任何图像或视频文件。

解决方案架构综述

本方案使用Amazon IoT Device Shadow 服务设置网络摄像头的布防撤防状态,摄像机在布防状态下会使能自带移动探测器(PIR) , PIR探测到有人进入时,会拍摄一段视频通过设备中的Kinesis Video Streams producer上传云端。同时将视频传送至Amazon Rekognition服务进行人脸的识别,Amazon Rekognition将分析的结果通过Lambda,SNS推送邮件给用户,报告发生警情.

方案的整体架构如下:

先决条件

  • Amazon 云账户
  • 一部树莓派4B+摄像头
  • 一台笔记本电脑

演练操作步骤

本演练操作中有三个部分:

  • 通过IoT Device Shadow控制设备的布防撤防状态
  • 使用Kinesis Video Streams Producer C++ SDK传输视频流到云端Kinesis Video Streams
  • 使用Amazon Rekognition分析视频流中人脸信息,推送SNS邮件信息

通过Amazon IoT Device Shadow控制设备的布防撤防状态

在家用或中小商户安防系统中,根据家中有人在否可以区分为布防状态(离家状态),撤防状态(居家状态),在这里我们使用IoT Device Shadow设备影子来控制和同步设备,云端,用户客户端的状态, 影子为设备、应用程序和其它云服务提供可靠的数据存储以共享数据。它们允许设备、应用程序和其它云服务连接和断开连接,而不会丢失设备的状态。

a).  参考用户开发手册,创建IoT thing,保存thing的证书,私钥,Root CA证书

b). 下载aws-iot-device-sdk-embedded-C 到Raspberry Pi

git clone --recurse-submodules https://github.com/aws/aws-iot-device-sdk-embedded-C.git

这里获取支持本文测试的shadow_demo_main.c , 替换原SDK中的\aws-iot-device-sdk-embedded-C-main\demos\shadow\shadow_demo_main.c.   并改动shadow_demo_helpers.c,去除static

c).  将thing的证书,私钥,Root CA证书保存于Raspberry Pi的文件系统

如图为例:

d).  在aws-iot-device-sdk-embedded-C根目录下执行

cmake -S . -Bbuild -DAWS_IOT_ENDPOINT="<your-aws-iot-endpoint>" -DROOT_CA_CERT_PATH="<your-path-to-amazon-root-ca>" -DCLIENT_CERT_PATH="<your-client-certificate-path>" -DCLIENT_PRIVATE_KEY_PATH="<your-client-private-key-path>" -DTHING_NAME="<your-registered-thing-name>"

你可以在Amazon IoT Console的settings界面中发现 “<your-aws-iot-endpoint>,格式如 ABCDEFG1234567.iot.us-east-2.amazonaws.com.

在本演示中,

"<your-path-to-amazon-root-ca>"   “/home/pi/aws-iot-device-sdk-embedded-C/certs/AmazonRootCA1.pem”
"<your-client-certificate-path>"“/home/pi/aws-iot-device-sdk-embedded-C/certs/csdk-certificate.pem.crt”
"<your-client-private-key-path>"“/home/pi/aws-iot-device-sdk-embedded-C/certs/csdk-private.pem.key”
"<your-registered-thing-name>"  在步骤a中,创建的thing name

e). cd build ,   make shadow_demo_main

cd bin, 执行 ./shadow_demo_main

f).  在IoT console MQTT test client,订阅shadow的topic, 模拟客户端应用,publish设备的  shadow中的布防和撤防状态。

{
  "state": {
    "desired": {
      "powerOn": 0,
      "arm_mode": "Arm away"
    }
  }
}
{
  "state": {
    "desired": {
      "powerOn": 0,
      "arm_mode": "Disarmed"
    }
  }
}

从Raspberry Pi终端的log中,可以看到/update/delta的消息,表明设备端收到了状态修改的命令

使用Kinesis Video Streams Producer C++ SDK传输视频流到云端Kinesis Video Streams

本部分将介绍如何在设备端将使用Kinesis Video Streams Producer SDK将视频传输到云端Kinesis Video Streams。确保你的Raspberry Pi安装了CSI摄像头(本例使用Raspberry Pi Camera Rev1.3), 测试方法可以参考指南

a).  登录Raspberry Pi, 安装依赖库

sudo apt update
sudo apt install -y automake build-essential cmake git pkg-config libgstreamer-plugins-base1.0-dev gstreamer1.0-omx-rpi

b).  Git clone Kinesis Video Streams C++ SDK到Raspberry Pi,编译SDK

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

执行以下cmake命令,下载build依赖库

mkdir -p ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
cmake -DBUILD_GSTREAMER_PLUGIN=ON ..

执行make 命令,build SDK

make

c).  设置运行环境变量

为测试目的可以使用你Amazon 账户的Access key和Secret key, 生产目的可以使用IoT thing的证书去做Kinesis Video Streams的鉴权

export AWS_ACCESS_KEY_ID=AXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_DEFAULT_REGION=us-west-2

d).  运行producer SDK,获取视频流并上传云端

cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
./kvs_gstreamer_sample kvs-rekognition-stream

e).  在云端查看Kinesis Video Streams 视频流

打开Kinesis Video Streams console,点击kvs-rekognition-stream, media playback, 你会看到从raspberry Pi端采集的实时视频流,根据网络状况,会有一定延时。

在实际的产品开发中,设备端应用程序根据IoT Device Shadow设置的布防撤防状态,当移动探测器(PIR)触发时,启动Producer的视频上传逻辑。

使用Amazon Rekognition分析视频流中人脸信息

本节将介绍如何使用Amazon Rekognition video从Kinesis Video Streams中获取视频流,并从中检测人脸,对比存储于face collection中的人脸图片,将匹配信息发送到Kinisis data stream,并通过Lambda 将人脸分析结果推送到邮箱,通知用户有熟人或者陌生人进入监控区域。

步骤1、 创建一个Amazon Rekognition face collection

a). 在你的Raspberry Pi中安装配置AWS CLI,可以参考相应指南。

b). 创建S3 bucket,比如kvs-rekognition-bucket

c). 将自己以及其它两到三人的脸部照片上传到kvs-rekognition-bucket, 图片命名如name.jpg, 识别结果会以name标识。

d). 在Raspberry Pi终端执行

export COLLECTION_ID=kvs-rekognition-collection
aws rekognition create-collection --collection-id $COLLECTION_ID

e). S3中的人脸图片加入collection,设置环境变量

export BUCKET_NAME="kvs-rekognition-bucket"

 f). 执行一下命令将S3中的人脸图片加入collection

for key in $(aws s3 ls s3://$BUCKET_NAME | awk '{print $4}'); do
  name=$(echo $key | sed 's/\.[^\.]*$//')
  echo "index: $key"
  aws rekognition index-faces --collection-id $COLLECTION_ID \
  --image "S3Object={Bucket=$BUCKET_NAME,Name=$key}" \
  --external-image-id $name \
  --max-faces=1
done

控制端会出现类似信息

g). 使用如下命令确认collection创建成功

aws rekognition describe-collection --collection-id $COLLECTION_ID

步骤2、 使用CloudFormation 创建Kinesis Data Streams, Lambda, SNS, IAM role。

a).  获取CloudFormation yaml文件及Lambda 文件

这里获CloudFormation yaml file kvsRekognitiondeploy.yaml

创建S3 bucket并上传Lambda.zip

在kvsRekognitiondeploy.yaml中修改Code的S3Bucket名称,与你上传的Lambda.zip一致

b).  打开CloudFormation console创建stack

c). 输入stack 名称,以及SNS消息推送的邮箱地址

d). 等待stack创建成功,关注outputs,后边将会使用到

步骤3、创建Amazon rekognition stream processer

a). 执行命令设置环境变量

export DATA_ARN="ARN of the data stream—find in the cloudforamtion output valueof KinesisDataStreamArn”
export ROLE_ARN="IAMRole ARN—find in the cloudforamtion output ,value of RekognitionVideoIAM”
export VIDEO_ARN="ARN of video stream—find the ARN of kvs-rekognition-stream "
export COLLECTION_ID=kvs-rekognition-collection

b). 执行以下命令创建recognition stream processor

aws rekognition create-stream-processor \
  --input "KinesisVideoStream={Arn=$VIDEO_ARN}" \
  --name kvs-rekognition-processor \
  --settings "FaceSearch={CollectionId=$COLLECTION_ID,FaceMatchThreshold=50.0}" \
  --role-arn $ROLE_ARN \
  --stream-processor-output "KinesisDataStream={Arn=$DATA_ARN}"

执行结果如下所示:

c). 启动processor

aws rekognition start-stream-processor --name kvs-rekognition-processor --region us-west-2

确认processor运行状态

aws rekognition list-stream-processors --region us-west-2

步骤4、启动producer,传输视频,等待人脸识别结果

参考第二部分介绍,在raspberry Pi 启动producer,

./kvs_gstreamer_sample kvs-rekognition-stream

这时你面向Raspberry Pi摄像头,数秒后收到邮件通知,一个已知的人脸被识别出。

步骤5、分析结果的说明

Amazon Rekognition Video stream processor 会将视频中每帧分析的结果输出到Kinesis Data Stream,以下部分是一帧视频的分析结果输出。

InputInformation 是输入的视频帧的信息,包含它的时间等信息。

FaceSearchResponse 里DetectedFace表示视频帧中识别到的人脸的位置,信心度等信息。

MatchedFaces是匹配到collection中人脸的信息。

Lambda会解析输出结果,将分析结果中匹配人脸以及未匹配人脸信息发送到SNS,并推送邮件。

{
	"InputInformation": {	
		"KinesisVideo": {
			"StreamArn": "arn:aws:kinesisvideo:us-west-2:776353586321:stream/kvs-rekognition-stream / 1648715907167 ",
			"FragmentNumber": "91343852333181567872839962036337976941536181188",
			"ServerTimestamp": 1648111202.393,
			"ProducerTimestamp": 1648111199.752,
			"FrameOffsetInSeconds": 0.0
		}
	},
	"StreamProcessorInformation": {
		"Status": "RUNNING"
	},
	"FaceSearchResponse": [{
		"DetectedFace": {
			"BoundingBox": {
				"Height": 0.511713,
				"Width": 0.3156743,
				"Left": 0.5606946,
				"Top": 0.4771309
			},
			"Confidence": 99.99729,
			"Landmarks": [{
				"X": 0.78990537,
				"Y": 0.8060256,
				"Type": "eyeLeft"
			}, {
				"X": 0.65444636,
				"Y": 0.8212687,
				"Type": "eyeRight"
			}, {
				"X": 0.76092005,
				"Y": 0.61012536,
				"Type": "mouthLeft"
			}, {
				"X": 0.64807296,
				"Y": 0.62220466,
				"Type": "mouthRight"
			}, {
				"X": 0.72746074,
				"Y": 0.7247177,
				"Type": "nose"
			}],
			"Pose": {
				"Pitch": 16.809187,
				"Roll": 170.70981,
				"Yaw": -2.5362215
			},
			"Quality": {
				"Brightness": 80.702896,
				"Sharpness": 12.848764
			}
		},
		"MatchedFaces": [{
			"Similarity": 99.994774,
			"Face": {
				"BoundingBox": {
					"Height": 0.708681,
					"Width": 0.672876,
					"Left": 0.199396,
					"Top": 0.15868
				},
				"FaceId": "82044973-4ab3-4b46-9f36-c5ac15ef10c8",
				"Confidence": 99.9983,
				"ImageId": "6d6098e0-86a5-3a9b-9e1a-ba10e64a0bfa",
				"ExternalImageId": "kenny"
			}
		}, {
			"Similarity": 99.97961,
			"Face": {
				"BoundingBox": {
					"Height": 0.339962,
					"Width": 0.41064,
					"Left": 0.300753,
					"Top": 0.309771
				},
				"FaceId": "11b74f6b-782c-4eff-a2f4-e204d00a392b",
				"Confidence": 99.996605,
				"ImageId": "77d83684-0c72-3bfb-ba26-7fee4e085a2e",
				"ExternalImageId": "yekugao"
			}
		}]
	}]
}

清理环境

演练结束之后,请将相关服务资源关闭。

aws rekognition stop-stream-processor --name kvs-rekognition-processor --region us-west-2
aws rekognition delete-stream-processor --name kvs-rekognition-processor --region us-west-2
删除CloudFormation stack

总结

在本文中,我们按步骤介绍了如何使用Amazon IoT Device Shadow设置摄像头的布防,撤防状态,实际产品也可以通过shadow设置其它参数。通过Kinesis Video Streams和Amazon Rekognition等服务实现了事件触发视频片段的上传,分析,人脸对比,匹配结果邮件推送。在实际产品中,可以设置SNS推送到App, App收到提醒可以查看视频片段的回放,可以参考相关开发手册。限于篇幅,不在这里详细介绍。

本篇作者

高业坤

AWS专业服务团队IoT架构师。负责基于AWS IoT的解决方案咨询,架构与交付,深度参与过智慧工厂、智慧供热等行业的IoT解决方案的咨询与交付。在智能家居、智慧安防、智能硬件等IoT行业拥有十年以上软件研发管理经验。

张守武

AWS专业服务团队物联网顾问。负责基于AWS IoT的解决方案咨询和项目交付,同时负责物联网行业解决方案的开发和推广,在物联网、网络、视频等领域有着广泛的设计和实践经验。