Python

PyTorch 使用 YOLOv5 與 DeepSORT 進行車輛物件偵測、計算車流量教學與範例

本篇介紹如何在 PyTorch 框架之下使用 YOLOv5 模型,偵測移動車輛、計算雙向的車流量統計。

道路監視器即時影像

在網路上有多許免費的道路監視器即時影像(例如 tw.live),這些影像的格式大部分是 MJPEG,我們可以利用 VLC 軟體將這類的及時影像儲存為一般的影片檔,方便後續的操作。
Step 1
在動態的 MJPEG 圖片上按下滑鼠右鍵,複製 MJPEG 圖片網址。

複製 MJPEG 圖片網址

Step 2
開啟 VLC 軟體,在主選單中,選擇「媒體」中的「開啟網路串流」。

開啟網路串流

Step 3
選擇「網路」頁籤,輸入 MJPEG 的網址,然後選擇「轉換」。如果這裡不確定網址正不正確,可以在輸入網址之後,先選擇「播放」,看看是否可以看到即時的影像,確認網址沒問題之後,再選擇「轉換」。

輸入 MJPEG 網址進行轉換

Step 4
設定好目的檔案,然後點選「開始」,即可將 MJPEG 即時影像儲存為影片檔案。

轉換為 MP4 影片檔

如果想要從影片中擷取出單張的影像,可以使用 VLC 軟體主選單中「視訊」的「抓圖」功能來處理。

使用 YOLOv5 模型偵測車輛

安裝 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.yamlAmikelive | Technology Blog),這裡我們只偵測汽車(2)與卡車(7)。

我拿關渡橋近淡水端的監視器影像進行了測試,以下是兩張偵測結果。

車輛物件偵測
車輛物件偵測

除了輸入圖片之外,也可以直接輸入影片檔案或是各種網路串流:

# 使用 YOLOv5s 模型偵測汽車與卡車(輸入 MP4 影片)
python detect.py --weights yolov5s.pt --source traffic.mp4 --classes 2 7

這是使用 YOLOv5s 偵測影片中車輛的結果:

使用 YOLOv5 與 Deep SORT 偵測並追蹤車輛

如果想要結合 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 模型,應該可以增加一些準確度。

Share
Published by
Office Guide
Tags: PyTorch

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago