申明:
本文转自 DEV Community 网站,文章翻译由开发者社区提供;
点击下方链接,查看英文原文:
- https://dev.to/aws-builders/h…
介绍
不久前,我所在的公司举办了一场黑客松流动,我和一个共事一起,用 AWS Serverless 服务和 raspberry pi 创立了一个智能门铃。
每当有人点击“门铃”按钮,它就会拍下一张图片,并通过 Amazon Rekognition 的人脸汇合来查看图片上的人脸是否曾经被索引。它会向 Slack 发送一条音讯,其中蕴含带有水印和工夫戳的缩放图像,并阐明图片上的人数和人名(如果他们曾经存在于人脸汇合中)。
这篇博文形容了咱们如何建设这个我的项目以及一些教训。
架构
图片:架构
图片:状态机
它是如何运行的
包含两个次要组成部分——人脸索引和人脸识别。
人脸索引
- 咱们用 VueJS 创立了一个简略的前端,托管在一个 S3 桶上。在这里,咱们须要上传一张带有人脸和姓名的图片。.
- 上传图片之后,咱们通过 API 网关代理一个 lambda 函数来创立一个预签名的 url,利用这个生成的预签名 url,咱们把图片上传到 s3 bucket,把姓名作为元数据值。
- 图片上传到 s3 bucket 后,就会触发一个 lambda 函数,它将检测图片中的人脸,并在事后定义的 AWS Rekognition 汇合(人脸汇合)中创立一个条目,以内部 id 命名。
人脸识别
- 利用 Raspberry pi 及其相机模块、无焊面包板和一个按钮,咱们创立了当按下按钮时的图像采集局部——门铃。
- 这张采集的图片被上传到 AWS S3,触发一个 lambda 函数来初始化 Step 函数的执行。
- 在 Step 函数中,有两个平行流程。
- 一个流程会检测图片中的人脸,并在人脸汇合中进行搜寻。这个函数将输入检测到的人脸总数。如果有辨认出的人脸,它会输入这些人脸的姓名。
- 另一个流程会调整图片的大小,并创立一个带有工夫戳的水印。所有这些性能都应用了 lambda 函数。
- 在实现这两个流程后,会触发另一个 lambda 函数来编写和发送音讯到 Slack 频道。
输入
在 Slack 频道中,输入如下:
图片:输入示例
此时,(我的儿子)Wanuja 和 Thenuja 曾经被索引到人脸汇合中,而我没有。
代码
查看残缺的源代码: https://github.com/pubudusj/s…
如何设置
您能够应用 AWS SAM 框架轻松部署该堆栈。
先决条件:
- AWS SAM cli + AWS profile 设置
- npm (用于构建前端)
- Slack Webhook URL
在 https://api.slack.com/apps/,创立一个 Slack 利用。启用 ’Incoming web hook’ 并将创立的 webhook 增加到工作区,抉择一个频道。这将产生一个 webhook 网址,其格局为:https://hooks.slack.com/servi…
部署
1. 首先在您要部署堆栈的区域创立一个 AWS Rekognition 汇合。
2.aws rekognition create-collection \
3.–collection-id serverless-bell-faces-collection
4. 复制该 github repo. 以下是用于不同目标的若干个目录:
- backend – s 须要应用 SAM 部署的源代码
- face_index_frontend – 人脸索引前端的源代码
- testing – 对于不应用 Raspberry pi 的本地测试,能够应用这个代码来测试人脸识别性能。这会上传所提供的图片,相似于 Pi 将图片上传到 s3。
- scripts_in_pi – Pi 外部应用的简略 python 脚本,它从摄像头模块采集图像并上传至 s3。
5. 在 cli 中,转到 /backend 目录
6. 运行命令:Sam build –use-container 建设具备必要依赖性的 python 函数。
7. 而后,为部署资源,运行:sam deploy -g 您须要输出要在 AWS 中创立的堆栈的详细信息,包含堆栈名称、区域、Rekognition 人脸汇合和 slack url。请确保您创立的堆栈与 Rekognition 人脸汇合在同一地区。
8. 部署实现后,复制这些输入值,在接下来的步骤中须要应用:FaceIndexHostingS3Bucket, FaceIndexWebsiteURL, GeneratePresignedUrl, GeneratePresignedUrlForTesting, FaceDetectUploadBucketName
9. 当初进入 face_index_frontend 目录,人脸索引前端的源代码位于此处。
10. 创立新的 .env 文件,复制 .env.example。对于 VUE_APP_GENERATE_URL_API 变量,应用 GeneratePresignedUrl 输入值。
11. 运行 npm install 来装置须要的模块,而后运行 npm run build 来构建我的项目。这将创立 dist 目录。
12. 而后,把 dist 目录的内容上传到 s3,作为 s3 托管的网站。应用输入 FaceIndexHostingS3Bucket 的值作为 s3 bucket。
13.aws s3 cp dist s3://[BucketName] –recursive
14. 当初,能够应用输入值 FaceIndexWebsiteURL 拜访人脸索引网站。
15. 上传一张带有姓名的人脸图像,您会看到该人脸被索引到人脸汇合中。
aws rekognition list-faces –collection-id “serverless-bell-faces-collection”
Raspberry pi
1. 用相机模块和 AWS 配置文件来设置 Raspberry PI。
2. 应用 scripts_in_pi 目录下的示例脚本来采集和上传图片到 S3。用输入值 FaceDetectUploadBucketName 替换 bucket-name。依据您的设置,应用相干的 gpiozero 按钮编号。
3. 采集图片之后,您能够在 Slack 频道中查看音讯。
不应用 Raspberry pi 的本地测试
1. 进入 testing 目录。
2. 创立新的 .env 文件,复制 .env.example。对于 VUE_APP_GENERATE_URL_API 变量,应用 GeneratePresignedUrlForTesting 输入值。
3. 运行 npm install 和 npm run serve
4. 通过提供的 URL,您能够拜访前端,上传图片来检测人脸。
5. 上传图片后,您能够在 Slack 频道中查看音讯。
一些教训
1. 在 Rekognition 人脸汇合中,ExternalImageId 只能蕴含字母和数字字符。因而,在存储两头带有多个空格的姓名时,咱们必须用下划线代替空格,当检索时也是如此。
2. 当从 S3 文件上传触发一个 lambda 函数时,lambda 不会收到上传文件的元数据。因而,要检索文件的元数据,须要再次读取文件。
3. 在 SAM 中,无奈在函数的策略对象中应用主动生成的 S3 bucket 的名称——参考。
正因为如此,咱们必须为 S3 bucket 创立名称,而不是像此处介绍的 SAM 随机生成 S3 bucket 名称。
可能的改良
1. 为人脸索引前端、API、Lambda 函数施行认证。
2. 在 Step 函数执行中解决失败的状况。
3. 解决上传图片的 EXIF orientation 数据,以取得正确的定向。
您能够尝试以上办法,欢送与我交换您的观点。
文章作者:Pubudu Jayawardana
Pubudu Jayawardana for AWS Community Builders