本篇介紹如何在 PyTorch 框架之下使用 YOLOv5 模型,偵測移動車輛、計算雙向的車流量統計。
在網路上有多許免費的道路監視器即時影像(例如 tw.live),這些影像的格式大部分是 MJPEG,我們可以利用 VLC 軟體將這類的及時影像儲存為一般的影片檔,方便後續的操作。
Step 1
在動態的 MJPEG 圖片上按下滑鼠右鍵,複製 MJPEG 圖片網址。
Step 2
開啟 VLC 軟體,在主選單中,選擇「媒體」中的「開啟網路串流」。
Step 3
選擇「網路」頁籤,輸入 MJPEG 的網址,然後選擇「轉換」。如果這裡不確定網址正不正確,可以在輸入網址之後,先選擇「播放」,看看是否可以看到即時的影像,確認網址沒問題之後,再選擇「轉換」。
Step 4
設定好目的檔案,然後點選「開始」,即可將 MJPEG 即時影像儲存為影片檔案。
如果想要從影片中擷取出單張的影像,可以使用 VLC 軟體主選單中「視訊」的「抓圖」功能來處理。
安裝 Python 的 venc
套件之後,建立一個 YOLOv5 專用的 Python 虛擬環境:
# 安裝 Python 的 venv 套件 apt install python3.8-venv # 建立 Python 虛擬環境 yolov5env python3 -m venv yolov5env
載入 Python 虛擬環境 yolov5env
:
# 載入 Python 虛擬環境 yolov5env
source yolov5env/bin/activate
下載 YOLOv5 原始碼,並在 Python 虛擬環境之下安裝 YOLOv5 所需要的各種 Python 套件:
# 下載 YOLOv5 原始碼 git clone https://github.com/ultralytics/yolov5 # 安裝 yolov5 所需環境 cd yolov5 pip install -r requirements.txt
安裝好 YOLOv5 之後,可以使用預設的模型進行車輛的偵測,假設 traffic.jpg
是一張道路監視器的照片,我們可以使用以下指令偵測其中的汽車與卡車:
# 使用 YOLOv5s 模型偵測汽車與卡車 python detect.py --weights yolov5s.pt --source traffic.jpg --classes 2 7
這裡的 --weights
是用來指定要使用的模型,而 --source
參數是指定影像來源,--classes
則是指定要偵測的物件種類,在預設的 YOLOv5s 模型中可選擇的物件種類可以參考 coco 資料集的說明(coco.yaml、Amikelive | Technology Blog),這裡我們只偵測汽車(2
)與卡車(7
)。
我拿關渡橋近淡水端的監視器影像進行了測試,以下是兩張偵測結果。
除了輸入圖片之外,也可以直接輸入影片檔案或是各種網路串流:
# 使用 YOLOv5s 模型偵測汽車與卡車(輸入 MP4 影片) python detect.py --weights yolov5s.pt --source traffic.mp4 --classes 2 7
這是使用 YOLOv5s 偵測影片中車輛的結果:
如果想要結合 YOLOv5 與 Deep SORT 模型偵測並追蹤車輛,可以使用 Yolov5_DeepSort_Pytorch 這個專案的程式碼。
先建立一個 Yolov5_DeepSort_Pytorch 專用的 Python 虛擬環境:
# 建立 Python 虛擬環境 yolosortenv python3 -m venv yolosortenv # 載入 Python 虛擬環境 yolov5env source yolosortenv/bin/activate
下載 Yolov5_DeepSort_Pytorch 專案的原始碼,並安裝必要的 Python 模組:
# 下載 Yolov5_DeepSort_Pytorch 原始碼 git clone --recurse-submodules https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch.git # 安裝必要模組 cd Yolov5_DeepSort_Pytorch/ pip install -r requirements.txt
使用其 track.py
指令稿就可以直接以 YOLOv5 與 Deep SORT 模型,偵測並追蹤車輛:
# 使用 YOLOv5 與 Deep SORT 偵測並追蹤汽車與卡車 python track.py --source traffic.mp4 --classes 2 7 --yolo_model yolov5s.pt --save-vid --conf-thres 0.25 --iou-thres 0.45
這個 track.py
指令稿與前面的 detect.py
類似,但是有一些參數的預設值不同,所以這裡我們指定了 --conf-thres
與 --iou-thres
兩個參數,讓兩邊的結果更接近。
將 YOLOv5 與 Deep SORT 搭配之後,就可以成功偵測車輛,並且追蹤每一輛車的移動軌跡,理論上要計算車流量也不是問題,但是由於我們只是將預設的 YOLOv5s 模型直接套用到台灣的道路監視器影像中,辨識率並不是非常高,所以有一些車輛的 ID 會跳號,沒辦法用來直接計算車量量,需要再進行近一步的調整。
若需要計算車流量,可以修改一下 Yolov5_DeepSort_Pytorch 專案中的 track.py
指令稿,以自己想要的方式來計算車輛數量。
在這個指令稿中已經將每個車輛物件辨識出來,並且標上 ID,我們可以在畫面上設定一條基準線,然後計算通過這一條基準線的車輛物件數量,我們以物件的中心點為準,分為上下兩個方向來計算,這樣就可以算出雙向的車流量,以下是加上計算車流量的結果。
在這個畫面的左上角標示的數字是兩個方向的車流量,也就是兩個方向通過基準線的車輛數目。由於這裡並沒有進行任何的模型參數調整,所以預測的準確率比較差,如果希望提高準確度,可能可以嘗試收集一些影像資料之後,進行人工標注並以遷移式學習訓練原本的 YOLOv5s 模型,應該可以增加一些準確度。