AIoT – 樹莓派暨雲端服務之臉部辨識平台
前言
此教程為一個 AIoT 架構:AI – IoT(物聯網),並參考自 https://github.com/fxgsell/GG-Edge-Inference ,在這示範中,我們使用樹莓派作為物聯網終端設備來擷取臉部資料,並且使用 AWS 雲端服務來建構臉部辨識系統。
教程分為二部分,第一為物聯網裝置設定,第二為臉部辨識系統架設。
架構圖示
實作步驟 (上)
為了要擷取臉部資料並且連接雲端系統,一些套件如Greengrass SDK
,opencv
和dlib
等皆需要安裝。雖然opencv
已經內建在下面提供的映像檔裡,但dlib
仍需要手動安裝,由於樹莓派編譯很慢,可能會耗費大量等待時間。
樹莓派設定作業系統
- 下載映像檔
-
燒錄映像檔至SD記憶卡 (5~10分鐘)
樹莓派設定無線網路
- 將樹莓派連接螢幕
- 插入SD記憶卡,並開機,預設密碼
turtlebot
- 連接至無線網路
-
記下IP位址
ifconfig
- 如果沒有螢幕的話, 可以參考這篇網誌
樹莓派安裝套件
-
安裝一些小套件 (約3分鐘)
sudo pip install awscli boto3 imutils
-
安裝dlib,這可久啦 (約1小時) 教學文
- 過程大綱
- 暫時提高SD卡檔案傳輸速率限制
- 暫時取消GUI以節省更多記憶體空間
- 開始編譯,進行漫長之等待。
- 過程大綱
-
安裝Face_Recognition (約5分鐘)
sudo pip2 --no-cache-dir install face_recognition
樹莓派設定AWS憑證
- 找到你AWS的憑證、密碼,如此一來才能透過程式腳本來觸發AWS服務。
-
設定憑證
aws configure
- AWS Access Key ID [None]: 輸入 Access Key ID
- AWS Secret Access Key [None]: 輸入 Secret Access Key
- Default region name [None]: us-east-1
- Default output format [None]: json
樹莓派安裝Greengrass
-
打開樹莓派的終端機,並執行以下指令
#### 執行在樹莓派上 #### sudo adduser --system ggc_user sudo addgroup --system ggc_group sudo apt-get install rpi-update sudo rpi-update b81a11258fc911170b40a0b09bbd63c84bc5ad59
-
重開機
sudo reboot
-
確定版本
### 連上樹莓派 ### ssh pi@ip_address uname -a
-
在安裝greengrass之前,為了提高樹莓派之安全,要開啟硬連結、軟連結的保護。
cd /etc/sysctl.d ls sudo nano 98-rpi.conf
-
新增以下兩行至
98-rpi.conf
fs.protected_hardlinks = 1 fs.protected_symlinks = 1
-
按
Ctrl+x
, 接著Y
,Enter
來儲存檔案 -
再次重開機
sudo reboot
-
確定更動
### connect to pi### ssh pi@ip_address sudo sysctl -a 2> /dev/null | grep fs.protected
-
以下指令是為了允許IoT Greengrass設定記憶體限制給lambda,如果沒這麼設定,lambda就無法正常執行。
cd /boot/ cgroup_enable=memory cgroup_memory=1 ### 最後一次重開機 ### sudo reboot
-
安裝
Greengrass SDK
至樹莓派cd ~ wget https://d1onfpft10uf5o.cloudfront.net/greengrass-core/downloads/1.7.0/greengrass-linux-armv7l-1.7.0.tar.gz sudo tar -xzvf greengrass-linux-armv7l-1.7.0.tar.gz -C /
樹莓派的基本環境安裝已經完成,接下來將在實作步驟(下)繼續本教程。
實作步驟 (下)
在此部分,我們將建構一臉部辨識的系統架構:
- 手動設定
S3
,lambda
. - 使用程式自動設定
Greengrass group
- 使用程式自動部署臉部偵測程式碼至
Lambda
- 使用程式自動建置雲端臉部辨識架構
設定 S3 Bucket
- 在選單選擇 S3 service
- 建立一個新的 S3 bucket, 輸入 獨一無二 的名字.
設定 Lambda Function
-
建立一個新的 AWS Lambda
- 選擇
Autor from scratch
- 輸入名稱 (例如:
IoT-Face-Detection-Demo
) - 在runtime選擇
Python 2.7
- 選擇
Choosing an existing role
- 選擇
lambda_basic_execution
- 如果你找不到
lambda_basic_execution
- 在選單中選擇
Create a custom role
- 建立新的
lambda_basic_execution
- 在選單中選擇
- 選擇
-
建立完lambda function後,我們要發布新的版本以及分配別名。
- 首先,在你剛創好的Lambda function 裡點選
Action
按鈕, 並且選擇Publish new version
- 接著點選
Publish
- 再次點選
Action
, 並選擇Create Alias
- 在 Name 欄位中輸入
latest
並在 Version 選擇1
。
接著按下Create
。
- 順利的話會出現以下:
- 首先,在你剛創好的Lambda function 裡點選
設定AWS憑證至你的電腦/筆電上
- 這次,為了要讓電腦順利執行一些程式腳本來觸發AWS服務,所以要再次設定AWS憑證。
當然,你也可以都在樹莓派裡執行程式腳本,所以可以由你決定以下步驟在哪環境執行。
-
設定憑證 (如同教程第一部分之設定)
aws configure
建立Greengrass group
現在我們要透過一個程式腳本來自動創建一個Greengrass group
-
載下專案 AWS-IoT-Face-Recognition-Analysis
git clone https://gitlab.com/ecloudture/aws-iot-face-recognition-analysis.git cd AWS-IoT-Face-Recognition-Analysis/script/1-greengrass-configuration/
-
在這資料夾中,
create-greengrass-config.py
用來創建Greengrass group
以及處理相對應的設定。python3 create-greengrass-config.py --create-group 想個名字 --bucket 之前建的S3 --function 之前建的lambda
-
順利的話,程式會產生一個憑證,並且可以在終端機看到以下畫面:
安裝IoT憑證至樹莓派
剛剛產生的憑證是用來鏈接 物聯網裝置 與 AWS IoT. 首先,你要先把它傳到樹莓派裡透過scp
或是 Filezilla 。
-
透過
scp
來安裝scp certificates.tar.gz pi@ip_address:~
-
安裝
Greengrass SDK
ssh pi@ip_address ls sudo tar -xzvf certificates.tar.gz -C /greengrass
-
下載 root.ca.pem. 這裡我們使用 VeriSign Endpoints 而非官方教程提供的 Amazon Trust Services Endpoints。
cd /greengrass/certs/ sudo wget -O root.ca.pemhttps://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem cat root.ca.pem #列出內容
-
啟動Greengrass
cd /greengrass/ggc/core sudo ./greengrassd start exit #回到本機
部署Lambda至樹莓派
- 主選單中選擇 AWS IoT Console , 點選
Greengrass
,接著選Groups
- 點擊
Actions
按鈕, 然後選擇Deploy
進行部署:
- 接下來,點選
Automatic detection
- 點擊
Grant permission
- 稍等片刻,部署將會順利成功。
- 部署成功後,則代表樹莓派與AWS IoT之間鏈接沒有問題。
接下來在左邊欄位選擇Resources
, 為了要能得到相機的存取權限,我們要在Resources
設定相關內容。
點選Add local resources
- 在 resource name, 輸入
Camera
在 Resource Type 選擇Device
在 Device Path, 輸入/dev/video0
- 在 Group owner file access permission 選擇
Automatically add OS group permission of the linux group that owns the resources
然後在Lambda function affiliations點擊select
- 選擇之前建立的lambda function ,例如:
IoT-Face-Detection-Demo
.
然後選擇Read And Write Access
, 並點擊Done
.
- 再次確認是否連結到正確的lambda function 以及讀寫權限,然後按下
save
. - 再次點選
Action
. 然後按下deploy
-
稍等片刻
-
成功部署後,你所建立的lambda就會再次更新部署至樹莓派上。
-
如果你沒成功,有可能是樹莓上的
greengrass
沒有被順利啟動、相關設定有誤、或是憑證無效,請再次確認。##重開greengrass之方式## ssh pi@ip_address cd /greengrass/ggc/core sudo ./greengrassd restart
AWS IoT 鏈接
- 在主選單中,選擇 IoT Core. 如果順利的話,可以看到以下圖表以及成功的連接次數。
設定臉部偵測程式
- 接下來我們要上傳臉部偵測程式碼至剛才建立的lambda。當臉部被偵測後, lambda 會把臉部截圖傳至 S3 bucket.
設定要對接的AWS服務名稱
cp ../properties{.sample,}.mk
nano ../properties.mk
執行腳本
-
此腳本會自動上傳python檔至先前建立的 lambda,成功上傳後,將會透過 IoT Greengrass自動部署程式碼至樹莓派上。
cd ~/GG-Edge-Inference cd 2-face-detection make
-
如果順利的話,你的相機應該很快就會啟動
偵錯工具: Cloudwatch log
如果你遇到問題:
- 在主選單中選擇
cloudwatch
- 在左邊欄位選擇
log
- 尋找你之前建立的 lambda function
- 開始抓蟲。 通常是一些套件缺失問題,例如:
cannot find module: cv2
- 如果順利的話,你會看到以下畫面
設定臉部辨識架構
-
接下來,我們要執行另一個腳本,此腳本會創建一個新的cloudFormation,並且依序創建需要的服務及架構,你只需要喝杯茶並微笑著看著它順利完成。
此CloudFormation會創建新的lambda function,並且鏈接到DynamoDB、S3以及Rekognition。- Rekognition: 作為臉部辨識的模型及演算法,完全由AWS提供
- S3: 儲存大量臉部截圖,提供給Rekognition訓練模型
-
DynamoDB: 作為儲存臉部資訊的資料庫
cd ~/GG-Edge-Inference cd 3-hybrid-face-recognition make
-
如果順利的話,你的相機應該很快就會啟動
-
在主選單中,選擇 cloudFormation,尋找
Hybrid-Face-Recognition
. 你會看到它依序開啟各個服務,如果順利的話會類似以下:
將樹莓派接上螢幕來查看結果
- 開啟終端機執行以下指令
cat /tmp/results.mjpeg | mplayer - -demuxer lavf -lavfdopts format=mjpeg:probesize=32
- 如果 /tmp/results.mjpeg 不存在, 代表你的lambda function沒有正常執行. 快去cloudwatch log 尋找小蟲們 , 或是嘗試重開樹莓派以及greengrass。
在AWS IoT裡查看結果
- 在主選單進入 IoT , 然後在左邊欄位點選 Test 。
- 訂閱消息
face_recognition/inference
, 任何辨識到的人臉資訊都會這裡更新。 -
其他可以使用的消息
-
face_recognition/inference
: 人臉辨識資訊 –face_recognition/admin
: 如果有運行錯誤,會顯示資訊在這裡 –face_recognition/new
: 如果出現辨識模型不認識的人,會顯示資訊在這裡 –face_recognition/match/"Thing_Name"
: 可以用來更新人名 -
要更新人名,可以發布消息至
face_recognition/match/Thing_Name
-
格式為
{"OLD_NAME": "NEW_NAME"}
結論
恭喜你完成本教程,你已學習到: – 基本Linux以及樹莓派之操作 – 透過AWS建立樹莓派IoT之鏈接 – 透過AWS建構一個即時的臉部辨識架構
Gitlab 專案連結
https://gitlab.com/ecloudture/aws-iot-face-recognition-analysis