iT邦幫忙

2021 iThome 鐵人賽

2
AI & Data

觀賞魚辨識的YOLO全餐系列 第 34

Day 34 - 實作 S3 驅動 Lambda 函數進行 YOLO 物件辨識

Day 34 - 實作 S3 驅動 Lambda 函數進行 YOLO 物件辨識

根據 Day 33 - 實作 S3 驅動 Lambda 函數進行鏡像,這是一個微服務的架構,只需將 AWS Lambda 函數改變成 YOLO 物件辨識的模型,就可以達成 YOLO 物件辨識的功能。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510M9pHR2QktV.png
圖 1、S3 驅動 Lambda 函數進行 YOLO 辨識架構圖

在 github 找到一個這樣的專案 YOLO-on-Lambda,使用上非常簡單,只要上傳事先壓縮好的 darknetmin.zip 到 Lambda 函數中就可以運行,這個專案事實上是將事先在LInux環境編譯好的 YOLOv3 執行檔 darknet,以及一些相關的參數檔壓縮在 darknetmin.zip 中,流程如下所示,我們實際操作一遍。

  1. 下載程式碼。
  2. 上傳相關檔案到 S3。
  3. 建立 IAM 角色,允許執行 AWS Lambda,並有存取 S3 的許可。
  4. 建立 AWS Lambda 函數。
  5. 修改佈署程式並完成測試。

步驟一、下載程式碼

YOLO-on-Lambda 網站中下載 darknetmin.zip,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510tYSzGK4y6G.png
圖 2、下載 darknetmin.zip

步驟二、上傳 YOLO 相關檔案到 S3

因為 AWS Lambda 函數的大小限制為 256 MB,所以需要把 YOLO 的權重檔存到 S3 中,在 Day 16 - 進行影像辨識訓練已經根據自己給定的數據集,完成的權重的訓練,所以可以將這個檔案上傳到 S3,以及先前下載的 Lambda 程式碼和圖片,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510bDiNiEBIkR.png
圖 3、上傳 YOLO 相關檔案到 S3

步驟三、建立 IAM 角色

建立一個 IAM 角色,允許執行 AWS Lambda,並有存取 S3 的許可。進入 IAM 管理控制台,選擇新增角色,接下來如下圖所示,選擇 Lambda 的使用案例後點擊 下一個:許可 按鈕。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510fEpUyCY8BQ.png
圖 4、建立一個角色選擇 Lambda 的使用案例

在搜尋文字框中輸入 basic 找到 AWSLambdaBasicExecutionRole 進行連接,這將允許這個角色有寫入 CloudWatch 記錄檔的全縣,方便程式除錯之用,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510scJpPGSUNo.png
圖 5、連接基礎的 CloudWatch 除錯用的許可政策

最後確定先前的設定後並輸入角色名稱後,就可以建立角色,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510dyUeJxgHxV.png
圖 6、檢閱設定並建立角色

編輯一個新的政策,內容如下圖所示,給定讀取 (GetObject) 儲存貯體 A 與寫入物件 (PutObject) 與權限 (PutObjectAcl) 到儲存貯體 B。

https://ithelp.ithome.com.tw/upload/images/20211106/201295109BY3loOE9L.png
圖 7、新增政策

接著到角色設定畫面,將新建政策連接到角色上,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211106/201295107W4qzR2ZRt.png
圖 8、將新增的政策連接到先前的角色

步驟四、建立 AWS Lambda 函數

進入 AWS Lambda 管理控制台,選擇建立 Lambda 函數,設定內容如下圖所示。比較需要注意的是執行時間務必選擇Python 3.8,這是那個 github 專案的要求;而執行角色要也要記得選擇上一個步驟設定的角色。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510wSRPxHwakY.png
圖 9、建立 Lambda 函數設定畫面

建立 Lambda 函數可以自行撰寫,也可以上傳壓縮檔,在第二個步驟中,我們已經把 Lambda 函數代碼上傳到 S3 ,只需在函數設定主畫面的右邊,可以找到一個 上傳於 按鈕,點擊後選擇 Amazon S3 位置,就可以指定位置,如 https://[BUCKETNAME].s3.ap-southeast-1.amazonaws.com/darknetmin.zip,畫面如下所示。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510m0Mof4ylfh.png
圖 10、建立 Lambda 函數設定畫面

步驟五、修改、佈署程式並進行測試

需要修改的地方有:

  1. 自建資料集相關檔案:物件檔(obj.data, obj.names),用來說明辨識後的物件名稱的;組態檔 (yolov3.cfg),需將原來的組態檔改名,放入新的組態檔。
  2. Lambda 函數執行環境:需要進行必要調整。
  3. Lambda 函數本身:需要根據需求進行調整。

自建資料集相關檔案
相關的三個檔案都是純文件檔,所以只需在 AWS Lambda 操作畫面中進行新增檔案的操作就可以,檔案內容請參照 Day 15 - 說明 YOLO 相關設定,完成後畫面如下。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510t5I0asOcEd.png
圖 11、在 Lambda 函數中新增自建資料集相關檔案

Lambda 函數執行環境

程式碼 頁簽中,下方有一個 執行時間設定 的選項需要進行設定,從上圖中可以知道整個 Lambda 函數的主要函數進入點是 service.py,所以需要在 執行時間設定 中,設定處理常式為 service.handler,完成後畫面如下。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510yzPqg3QaDE.png
圖 12、在執行時間設定中,設定處理常式

接著在 組態 頁簽中,選擇 一般組態,將 記憶體 (MB) 設定為 2048 ~ 5120 M,逾時 設定為 2 分鐘,完成後畫面如下。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510qNdSCmApER.png
圖 13、在組態頁簽中,設定一般組態

Lambda 函數本身

需要修改的是要指定權重檔與待測試圖片的所在位置,並將原本的執行命令改成./darknet detector test cfg/obj.data cfg/yolov3.cfg {} {},這樣才不會使用到預設的 coco.data 的標籤。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510lscsU7YUYR.png
圖 14、修改 service.py 的內容

修改完畢後,進行佈署(Deploy)後,可以設定一個測試(test)計畫,不需要內容,直接測試即可。確認後會需要約 60 幾秒才會完成影像的辨識,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211106/201295106vr2qqDfvZ.png
圖 15、執行 YOLO Lambda 辨識功能

因為輸出是一整行,所以把這個輸出複製到一般編輯器中,比較方便看到辨識結果,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211106/20129510K01lGjxr8M.png
圖 16、YOLO 辨識結果

而這樣的反應速度,如果是批次處理還可以,但是即時處理的話,反應速度太慢,可能需要再找其他工具來滿足這個需求。

參考資料


上一篇
Day 33 - 實作 S3 驅動 Lambda 函數進行鏡像
下一篇
Day 35 - Amazon SageMaker 簡介
系列文
觀賞魚辨識的YOLO全餐38

1 則留言

0
obarisk
iT邦新手 3 級 ‧ 2021-11-12 16:18:27

換用 EFS 會再快一點

你說的是Amazon Elastic File System (Amazon EFS),如果是的話,如何可以加快?

我要留言

立即登入留言