在 PrimeHub 中使用 YOLOv4 定時偵測景點擁擠度

Original article was published on Deep Learning on Medium

1. 運行實驗

一開始,先登入 PrimeHub 吧!

首先進入 User Portal,此為系統平台的 overview 頁面,我們可於此自由切換至許多功能。

選擇 JupyterHub

我們會先進入 Spawner 頁面,可依據專案開設出所需的 JupyterLab 環境,並在裡面開發、測試我們的程式。

由於 The A-Team 這個 Group 允許使用較多的運算資源,因此先切換至該 Group。

選擇 Instance TypeCPU 1,初期的實驗先選擇較低配額的硬體即可。

選擇 ImageTensorFlow 2.1 (Python 3.7) (Universal),雖然本次實驗不會用到 TensorFlow 或 PyTorch 等機器學習框架,但由於每個 Image 都預先安裝了機器學習常使用到的函式庫(例如 NumPy、OpenCV等),因此選擇較新的 Image,有機會獲得較佳且較廣的 API 支援。完整的可用 Image 列表可參考

在 Spawner 頁面的右側,顯示了目前所屬 Group 中每位 User 運算資源的配置上限、以及整個 Group 運算資源的使用資訊。

上述 Group 資源的配置,都可在 Admin Dashboard > Groups 中設定。藉由每個 Group 對資源配置的獨立規範,可以讓每個部門,在運算資源上做到最好的平衡配置,相當適合團隊協作。

一切設定完成後,按下 Start Notebook 吧!

環境建立中,在 Event log 裡可發現這個資訊:[Normal] pod triggered scale-up

這是因為 Auto-Scaling 的功能,當我們需要運算資源時,才自動 scale-up pool 中的資源,而當我們使用完畢後,也會自動 scale-down pool 中的資源。如此一來,就不用擔心忘記開導致錯誤、亦或是忘記關導致花費過高之情形發生。

稍待片刻,當環境建立完畢後,即可進入到 JupyterLab 囉!

(筆者偏好暗色主題,使用者可依據自身喜好自由切換)

為了下載直播的視訊串流,先安裝 youtube-dl

在 Launcher 中選擇 Terminal,並輸入 pip install youtube-dl

試著執行以下指令以擷取公館夜市的直播串流,並輸出至同目錄的 stream.mp4

youtube-dl -o stream.mp4 https://www.youtube.com/watch?v=WGLUUH5HEVA

(由於擷取目標是無間斷的直播,因此須自行按下 Ctrl + C 將其強制中斷)

查看 stream.mp4,影片下載成功!

有了影片作為輸入資料後,接下來使用 YOLOv4 進行偵測。

先切換至 a-team 目錄,執行以下指令以獲得最新 repo。

git clone https://github.com/AlexeyAB/darknet.git

接著,編譯 CPU 版本的 shared library,以供後續的 Python 程式使用。

開啟 Makefile 並將 AVXOPENMP 、以及 LIBSO 設為 1。

執行 make ,待編譯完成後,我們即可在 darknet_video.py 中使用編譯好的 library 檔案。

而為了執行 YOLOv4,我們亦須下載 yolov4.weights 至 darknet 的目錄中。

yolov4.weights 的下載連結: https://drive.google.com/open?id=1cewMfusmPjYWbrnuJRuKhPMwRe_b9PaT

為呈現完整的 end-to-end 即時偵測,我將 darknet_video.py 做了以下修改:

1. 修改主要的偵測程式區塊,讀入 stream.mp4,保存每張 frame 中 person、motorbike、以及 car 的偵測數量,並將 detection 結果輸出至 output.mp4