YOLO (You Only Look Once) 是一個熱門的物件偵測模型。它的高效能與高準確率,使得它快速地走紅。本文章將介紹如何使用 YOLOv8 來做物件偵測。
Table of Contents
YOLOv8
YOLO 是由華盛頓大學的 Joseph Redmon 和 Ali Farhadi 在 2015 年發表的模型。發表之後,由於它的高效能與高準確率,使它迅速地流行起來。接下來,Joseph Redmon 陸續發表 YOLOv2 (2017) 和 YOLOv3 (2018)。之後,他便宣告離開 computer vision,因為他發現他的發明被應用在軍事和隱私的侵犯。在 2020 年,Alexey Bochkovskiy 發表 YOLOv4。同年,Ultralytics 發表 YOLOv5。2022 年,Meituan Vision AI Department 發表 YOLOv6。同年,Alexey Bochkovskiy 發表 YOLOv7。2023 年,Ultralytics 發表 YOLOv8。YOLO 的歷史相當地特殊、有趣。不同的版本,由不同的人或團體發佈。更詳細的歷史介紹,請參考這裡。
專案建置
接下來,我們會透過建立一個企鵝寶寶偵測模型,來介紹如何使用 YOLOv8。
首先,建立一個資料夾叫 YOLOv8Example
,並設定好 Python3 的虛擬環境。然後,安裝 ultralytics。
% mkdir YOLOv8Example % cd YOLOv8Example YOLOv8Example % python3 -m venv .venv YOLOv8Example % .venv/bin/pip install ultralytics
標記(Labeling)
在開始訓練模型之前,我們要先準備好訓練的資料集。在此專案中,我們準備了 9 張企鵝寶寶的照片,其中 7 張用來訓練模型,2 張用來驗證模型。要注意的是,在真實的專案中,這樣的資料集是遠遠不夠的。
資料集準備好後,我們要開始標記資料。所謂的標記資料是指,在照片中標記有企鵝寶寶的範圍。此外,我們可以在一張照片中標記一個以上的物件與類別(classes)。例如,我們可以在照片中,標記某個範圍有企鵝寶寶,還可標記另一個範圍有北極熊。所以,我們有一個類別叫 Baby Penguin。
以下是一張照片與它的標記檔案。YOLOv8 的標記格式是
- 每一行表示一個標記。
- 第一個數字表示類別的索引。0 表示第一個類別,也就是
Baby Penguin
。 - 第二和第三個數字表示標記範圍的中心點 x 和 y。它們是用百分比表示,而不是 pixel。
- 第四和第五個數表表示標記範圍的寬和高。它們是用百分比表示,而不是 pixel。
0 0.482720 0.527601 0.517280 0.749469
兩個軟體可以來幫我們標記物件。
Roboflow
Roboflow 是一個免費的線上標記軟體。介面好看,而且使用起來很簡單。
Yolo Label
Yolo Label 是一個免費的標記軟體。介面沒有 Roboflow 好看,而且在使用時,圖片的比例會跑掉。但是,這不影響標記的結果,因為標記的範圍是用百分比來表示,而不是 pixel。雖然它有這些缺點,但是它可以在本機上使用。
在使用的時候,Yolo Label 會要求你輸入要標記的圖片資料夾和類別檔案路徑。
我們新增一個類別檔案叫 classes.txt,其裡面每一行都是一個類別。
Baby Penguin
訓練(Training)
訓練資料集
在開始訓練之前,我們先將圖片和標記放到專案裡。訓練用的圖片放在 datasets/train/images,而標記檔案放在 datasets/train/labels。驗證用的圖片和標記則是放在 datasets/val 下。
訓練設定
在訓練的時候,我們需要提供一個設定檔。建立一個檔案叫 data.yaml
,其內容如下。在 data.yaml 裡,我們
- 在
path
指定資料集的路徑 - 在
train
指定給訓練用的圖片的資料夾 - 在
val
指定給驗證用的圖片的資料夾 nc
指定類別的個數names
指定類別的名稱
path: /path/to/waynestalk/YOLOv8Example/datasets train: train/images val: val/images nc: 1 names: [ "Baby Penguin" ]
YOLOv8 Pretrained Detect Models
最後,在開始訓練之前,我們要選用一個 YOLOv8 pretrained model。基於這個 pretrained model 來訓練我們要預測的新類別。越下面的模型,其準確率越高,但是速度越慢、且檔案越大。你要根據你的需求來決定使用哪一個模型。在本文章的範例中,我們將使用 YOLOv8s。
Model | size (pixels) | mAPval 50-95 | Speed CPU ONNX (ms) | Speed A100 TensorRT (ms) | params (M) | FLOPS (B) |
---|---|---|---|---|---|---|
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv8s | 640 | 44.9 | 128.4 | 1.20 | 11.2 | 28.6 |
YOLOv8m | 640 | 50.2 | 234.7 | 1.83 | 25.9 | 78.9 |
YOLOv8l | 640 | 52.9 | 375.2 | 2.39 | 43.7 | 165.2 |
YOLOv8x | 640 | 53.9 | 479.1 | 3.53 | 64.2 | 257.8 |
CLI
我們可以透過以下的指令來訓練我們的模型。我們大概解釋一下各個參數,詳情請參考官網。
- mode:YOLOv8 提供 5 種 modes。我們目前這使用的是 train mode。
- data:指的是我們先前建立的 data.yaml。
- imgsz:指的是訓練的圖片的大小,也就是最後產生出來的模型的輸入圖片大小。當圖片的大小與 imgsz 不相同是,YOLOv8 會自動先將圖片重新調整成 imgsz 的大小。
- epochs:一個 epoch 指的是對整個資料集訓練一次。
- batch:每一批訓練的圖片數量。這取決於記憶體的大小。
- project、name:YOLOv8 沒有提供參數讓我們指定輸出的路徑。反而是用
project
和name
來指定輸出的路徑。其輸出的路徑會是 project/name。
YOLOv8Example % .venv/bin/yolo detect mode=train model=yolov8s.pt data=data.yaml imgsz=640 epochs=5 batch=1 project=runs name=train
訓練結束後,我們會得到以下的輸出資料。其中 best.pt
就是訓練好的模型。
Python
除了 CLI,我們也可以在 Python 中使用 YOLOv8,如下。
from ultralytics import YOLO # Load a pretrained YOLOv8s model model = YOLO('yolov8s.pt') # Train and validate the mode train_results = model.train(data='data.yaml', imgsz=640, batch=1, epochs=5, project='runs', name='train', save=True)
預測(Prediction)
接下來,我們要使用我們剛剛訓練好的模型來做預測,也就是物件偵測。
CLI
我們可以使用以下的指令,來偵測圖片裡是否有企鵝寶寶。我們不需要擔心要預測的圖片大小是否是 640×640,YOLOv8 會自動幫我們調整大小。
YOLOv8Example % .venv/bin/yolo detect mode=predict model=./runs/train/weights/best.pt source=image.jpg project=runs name=predict
預測完後,我們可以在以下資料夾下找到預測的結果。
YOLOv8 會自動幫我們把偵測到的範圍框起來,並且標上類別名稱。
YOLOv8 不但可以預測圖片,還可以預測影片。其使用方式是一樣的,如下。
YOLOv8Example % .venv/bin/yolo detect mode=predict model=./runs/train/weights/best.pt source=video.mp4 project=runs name=predict
Python
我們可以在 Python 中使用 YOLOv8。
from ultralytics import YOLO # Load the trained model model = YOLO('./runs/train/weights/best.pt') # Predict an image model.predict(source='image.jpg', project='run', name='predict', save=True) # Predict a video model.predict(source='video.mp4', project='run', name='predict', save=True)
結語
YOLOv8 使用起來非常地方便簡單。因此在訓練模型時,會有很大量的時間花費在收集資料集,並且 label 這些資料。它提供 5 種任務,分別為 detect、segment、classify、pose、和 OBB。本文章只有介紹 detect 的使用方法。
參考
- The History of YOLO Object Detection Models from YOLOv1 to YOLOv8.
- Ultralytics YOLOv8 Docs.
- YOLOv8 Github.