我是如何用 Amazon Serverless 建立一個門鈴的

亞馬遜雲開發者發表於2022-04-30

宣告:
本文轉自DEV Community網站,文章翻譯由開發者社群提供;
點選下方連結,檢視英文原文:

介紹

不久前,我所在的公司舉辦了一場黑客鬆活動,我和一個同事一起,用 AWS Serverless 服務和 raspberry pi 建立了一個智慧門鈴。

每當有人點選“門鈴”按鈕,它就會拍下一張圖片,並通過 Amazon Rekognition 的人臉集合來檢查圖片上的人臉是否已經被索引。它會向 Slack 傳送一條訊息,其中包含帶有水印和時間戳的縮放影像,並說明圖片上的人數和人名(如果他們已經存在於人臉集合中)。

這篇博文描述了我們如何建立這個專案以及一些經驗。

架構

image.png
圖片:架構

image.png
圖片:狀態機

它是如何執行的

包括兩個主要組成部分——人臉索引和人臉識別。

人臉索引

  1. 我們用 VueJS 建立了一個簡單的前端,託管在一個 S3 桶上。在這裡,我們需要上傳一張帶有人臉和姓名的圖片。.
  2. 上傳圖片之後,我們通過 API 閘道器代理一個 lambda 函式來建立一個預簽名的 url,利用這個生成的預簽名 url,我們把圖片上傳到 s3 bucket,把姓名作為後設資料值。
  3. 圖片上傳到 s3 bucket 後,就會觸發一個 lambda 函式,它將檢測圖片中的人臉,並在預先定義的 AWS Rekognition 集合(人臉集合)中建立一個條目,以外部 id 命名。

人臉識別

  1. 利用 Raspberry pi 及其相機模組、無焊麵包板和一個按鈕,我們建立了當按下按鈕時的影像採集部分——門鈴。
  2. 這張採集的圖片被上傳到 AWS S3,觸發一個 lambda 函式來初始化 Step 函式的執行。
  3. 在 Step 函式中,有兩個平行流程。
  4. 一個流程會檢測圖片中的人臉,並在人臉集合中進行搜尋。這個函式將輸出檢測到的人臉總數。如果有識別出的人臉,它會輸出這些人臉的姓名。
  5. 另一個流程會調整圖片的大小,並建立一個帶有時間戳的水印。所有這些功能都使用了 lambda 函式。
  6. 在完成這兩個流程後,會觸發另一個 lambda 函式來編寫和傳送訊息到 Slack 頻道。

輸出

在 Slack 頻道中,輸出如下:

image.png
圖片:輸出示例

此時,(我的兒子)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

相關文章