2022年1月21日 星期五

使用Google Colab快速體驗ScaledYOLOv4


「物件偵測」一直是電腦視覺的重點項目,已發展了二十多年[1],早期利用各種特徵提取和比對來找出人們對影像中有興趣的像素集合(物件),如VJ, HOG等。近幾年來,大家則把重點放在了「深度學習」的模型上[2],從剛開始的二階段偵測器(Two-stage Detector),如RCNN, SPPNet, Fast RCNN, Faster RCNN等,到目前最流行的一階段偵測器(One-stage Detector),如SSD, RetinaNet, EfficientDet, YOLO等,其中又以YOLO(You Only Look Once)系列發展的最好,一路發展出YOLOv2, YOLOv3, YOLOv4, YOLOv5(非學術論文), 去年更有ScaledYOLOv4, YOLOX, YOLOR等技術推出,讓大家有更快推論速度、更高推論精度、更彈性模型架構,讓同一張影像中大小物件都能順利被檢出。


先前寫過關於YOLOv3的文章[3],去年五月也曾寫過「如何以Google Colab及Yolov4-tiny來訓練自定義資料集─以狗臉、貓臉、人臉偵測為例」[4]。前不久剛好參加一個AI比賽時因為需要對大尺寸及小物件有好一點的準確度所以選用了台灣王建堯博士CVPR 2021大作「Scaled-YOLOv4: Scaling Cross Stage Partial Network」[5][6]來完成。

「ScaledYOLOv4」這個模型可依輸入影像大小選擇不同尺度架構,以往YOLOv4只分標準和tiny兩種,而這裡分為tiny, csp, large,而large又分p5, p6, p7,完整的架構可參考Fig. 1 & 2。至於模型的運作原理[7]寫得頗清楚,這裡就不多作說明。從Fig. 1就可明顯看出其效能大幅優於YOLOv3, YOLOv4及EfficientDet。

Fig. 1 ScaledYOLOv4和其它模型在COCO資料集推論效能比較表。[5](點擊圖放大)


Fig. 2 ScaledYOLOv4模型架構(csp, p5, p6, p7)。[5](點擊圖放大)


為了讓大家快速上手,這裡參考了王建堯博士釋出的PyTorch源碼[6],另外提供了一個完整的Google Colab範例,說明如何建立環境及運行COCO資料集預訓練參數。而訓練及推論自定義資料集就留待下回分解。完整範例請參考下列網址。

https://github.com/OmniXRI/Colab_ScaledYOLOv4

由於csp和large(p5)在模型定義的格式略有不同,前者為cfg,後者是採yaml,權重值亦有不同,前者為weight,後者為pt,所以這裡有兩個範例程式,分別對應csp和large兩種格式,而large又以p5為例,若要執行p6, p7則自行修改內容即可。

scaled-yolov4-csp_coco_test.ipynb
scaled-yolov4-large_coco_test.ipynb


整個程式主要有八個動作,如下說明,這裡以csp為例。

1. 檢查GPU及CUDA版本
由於後面的程式需要用要Nvidia CUDA,所以要先檢查。執行後若顯示failed,則至左上角選單中「編輯」─「筆記本設定」下「硬體加速器」選擇「GPU」,再重新運行一次即可。至於配置到那一種Nvidia GPU則無妨。

!nvidia-smi

2. 檢查系統預設安裝套件及版本
建議版本如下所示,若大於下列版本而造成無法順利運作則請自行降版後再執行後續工作。
Python 3.7.12
opencv-contrib-python 4.1.2.30
opencv-python 4.1.2.30
tensorboard 2.7.0
torch 1.10.0+cu111
torchvision 0.11.1+cu111

!python --version
!pip list

3. 安裝 mish-cuda
這是ScaledYOLOv4必要元件,一定要安裝,否則無法順利運行,預設安裝版本 0.0.3。
本範例無法於無Nvidia CUDA環境下運行。

!pip install git+https://github.com/JunnYu/mish-cuda.git
!pip list


4. 下載ScaledYOLOv4
依需求下載不同版本(csp, large)的PyTorch ScaledYOLOv4到 /content/ScaledYOLOv4 路徑下。請注意這裡 -b yolov4-csp 為指定下載csp版本分支,若無-b參數則為large(default版本)。
!git clone -b yolov4-csp https://github.com/WongKinYiu/ScaledYOLOv4
%cd ScaledYOLOv4
!ls

5. 下載COCO預訓練權重檔
在 /content/ScaledYOLOv4下新增 /weights 路徑,將Google共享文件COCO預訓練權重值檔案下載到該路徑下。主要差別在--ld後面的路徑,可自行更換。
yolov4-csp.weights : 1TdKvDQb2QpP4EhOIyks8kgT8dgI1iOWT
yolov4-p5.pt : 1aXZZE999sHMP1gev60XhNChtHPRMH3Fz
yolov4-p6.pt : 1aB7May8oPYzBqbgwYSZHuATPXyxh9xnf
yolov4-p7.pt : 18fGlzgEJTkUEiBG4hW00pyedJKNnYLP3

!mkdir weights
%cd weights
!gdown --id 1TdKvDQb2QpP4EhOIyks8kgT8dgI1iOWT
!ls

6. 下載測試影像
在 /data 路徑下建立 /images 用於存放測試影像
隨便從網路上下載一張影像並更名為 test01.jpg
%cd /content/ScaledYOLOv4/data
!mkdir images
%cd images
!wget https://raw.githubusercontent.com/WongKinYiu/PyTorch_YOLOv4/master/data/samples/bus.jpg
!mv bus.jpg test01.jpg
!ls

7. 進行推論
根據下列參數執行推論程式 detect.py
影像大小 640x640, (預設csp為640, p5為896, p6為1280, p7為1536)
置信度 0.3, (可自行調整)
推論裝置(GPU) 0, (第一組GPU)
配置檔, (csp為yolov4-csp.cfg, large為yolov4-p5.yaml)
模型權重檔, (csp為yolov4-csp.weights,large為yolov4-p5.pt)
來源影像 (可指定單張影像、單個影片、檔案夾等)
%cd /content/ScaledYOLOv4/
!python detect.py \
--img 640 \
--conf 0.3 \
--device 0 \
--cfg models/yolov4-csp.cfg \
--weights weights/yolov4-csp.weights \
--source data/images/test01.jpg

8. 顯示推論結果
推論完成會將結果置於 /inference/output 路徑下
使用OpenCV函數顯示結果影像
import cv2
from google.colab.patches import cv2_imshow

img1 = cv2.imread('data/images/test01.jpg')
cv2_imshow(img1)
img2 = cv2.imread('inference/output/test01.jpg')
cv2_imshow(img2)

Fig. 3 ScaledYOLOv4運行結果,左:csp,右:large(p5)。(點擊圖放大)


從Fig. 3上可以看出,連右上角的遮擋的很嚴重的腳踏車都能偵測到。而左側穿白外套男人領口的橘色部位在large(p5)被辨識為領帶,人眼不仔細看還真的會誤判,更何況模型。整體來說表現不錯。

小結


這篇文章先幫大家暖暖身,如果你想辨識的內容在COCO資料集80類範圍內的話,那就直接使用就可以,若需要自己訓練自定義的資料集,就靜待下回分解囉!


參考文獻


[1] Object Detection in 20 Years: A Survey https://arxiv.org/abs/1905.05055

[2] A Survey of Modern Deep Learning based Object Detection Models https://arxiv.org/abs/2104.11892

[3] 【AI_Column】如何以YOLOv3訓練自己的資料集─以小蕃茄為例 http://omnixri.blogspot.com/2019/11/aicolumnyolov3.html

[4] 如何以Google Colab及Yolov4-tiny來訓練自定義資料集─以狗臉、貓臉、人臉偵測為例 http://omnixri.blogspot.com/search/label/YOLO

[5] Scaled-YOLOv4: Scaling Cross Stage Partial Network https://arxiv.org/abs/2011.08036

[6] Github, WongKinYiu/ScaledYOLOv4 (YOLOv4-large) https://github.com/WongKinYiu/ScaledYOLOv4

[7] YOLO演進 — 4 — Scaled-YOLOv4 https://medium.com/ching-i/yolo%E6%BC%94%E9%80%B2-4-scaled-yolov4-c8c361b4f33f
 



沒有留言:

張貼留言

【頂置】簡報、源碼、系列文快速連結區

常有人反應用手機瀏覽本部落格時常要捲很多頁才能找到系列發文、開源專案、課程及活動簡報,為了方便大家快速查詢,特整理連結如下,敬請參考! Edge AI Taiwan 邊緣智能交流區 全像顯示與互動交流區 台科大(NTUST) 人工智慧與邊緣運算實務 開南大學...