在物件偵測領域,YOLOv8作為最新一代的深度學習模型,以其卓越的性能和效率贏得了廣泛關注。本文將深入探討YOLOv8的模型訓練過程,解析關鍵性能指標,並分享優化策略,幫助您更好地掌握這一強大工具。
遷移學習:YOLOv8模型訓練的捷徑
在開始YOLOv8模型訓練之前,我們首先需要了解遷移學習的重要性。遷移學習允許我們利用預訓練模型的知識,大大縮短訓練時間並提高模型性能。對於YOLOv8,我們可以從官方提供的預訓練模型開始,根據自己的數據集進行微調。
from ultralytics import YOLO
# 載入預訓練的YOLOv8模型
model = YOLO('yolov8n.pt')
# 使用自定義數據集進行訓練
results = model.train(data='custom_dataset.yaml', epochs=100, imgsz=640)
關鍵指標:解讀YOLOv8的性能
在物件偵測任務中,幾個關鍵指標對於評估模型性能至關重要:
- IoU (Intersection over Union):
IoU衡量預測邊界框與真實邊界框的重疊程度,是評估物件偵測準確性的基礎指標。 - mAP (mean Average Precision):
mAP綜合考慮了精確率和召回率,是物件偵測模型整體性能的重要指標。 - 精確率 (Precision) 和召回率 (Recall):
這兩個指標分別反映了模型預測的準確性和完整性,是評估YOLOv8性能的核心指標。
Tensorboard:視覺化YOLOv8訓練過程
為了更直觀地監控YOLOv8模型的訓練過程,我們可以使用Tensorboard這一強大的視覺化工具。Tensorboard能夠實時展示訓練損失、驗證指標等關鍵數據,幫助我們及時調整訓練策略。
# 在訓練命令中添加Tensorboard支持
results = model.train(data='custom_dataset.yaml', epochs=100, imgsz=640, project='YOLOv8_training', name='experiment1')
訓練自定義的YOLOv8模型
以下為官網的一個範例程式
from ultralytics import YOLO
# Load a model
model = YOLO('yolov8n.yaml') # build a new model from YAML
model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt') # build from YAML and transfer weights
# Train the model
results = model.train(data='coco128.yaml', epochs=100, imgsz=640)
範例中三種載入方式的比較
- model = YOLO(‘yolov8n.yaml’):
這段代碼使用給定的 YAML 配置文件構建一個新的 YOLO 模型。 YAML 配置文件包含了有關模型架構、層設置、超參數等的信息。通過提供 YAML 文件的路徑,可以創建一個全新的 YOLO 模型。(yaml檔案位於:ultralytics\cfg\models\v8
) - model = YOLO(‘yolov8n.pt’):
這段代碼加載一個預訓練的 YOLO 模型,該模型以 PyTorch 的 .pt 文件格式保存。預訓練模型已經在某個數據集上進行了訓練,並且包含了在該數據集上學到的權重。這個過程稱為遷移學習,它可以加快在新數據集上訓練模型的收斂速度,同時保留之前任務的特徵提取能力。 - model = YOLO(‘yolov8n.yaml’).load(‘yolov8n.pt’):
這段代碼首先使用給定的 YAML 配置文件構建一個 YOLO 模型,然後從預訓練的 .pt 文件中加載權重,將權重遷移到新構建的模型中。這使您可以根據自己的需求創建模型結構,然後將預訓練模型的權重用於該結構。這種方法允許您根據不同的目標任務進行微調或擴展。
YOLOv8 模型的每個類別中有五個模型
YOLOv8n | YOLOv8s | YOLOv8m | YOLOv8l | YOLOv8x |
YOLOv8 使用了以下預訓練模型:
- 在 COCO 檢測數據集上訓練的對象檢測,圖像分辨率為 640。
- 在 COCO 分割數據集上訓練的實例分割,圖像分辨率為 640。
- 在 ImageNet 數據集上預訓練的圖像分類模型,圖像分辨率為 224。
訓練指標分析
Intersection over Union指標
IoU(Intersection over Union)是一個用於評估目標檢測和分割任務的常用指標。它主要用於衡量預測的目標與實際目標之間的重疊程度。在機器學習和計算機視覺領域中,IoU通常用於衡量模型的預測準確度,特別是在處理像目標檢測、物體定位和分割等任務時。
IoU的計算方式是將預測的目標區域(通常是矩形框或分割區域)與實際目標區域的交集面積除以它們的聯集面積。公式如下:
其中,交集是預測區域和實際區域的重疊部分,聯集是預測區域和實際區域的整體合併部分。
在目標檢測中,當模型預測的目標框與實際目標框之間的IoU值越高,表示模型的預測越準確。通常,當IoU超過一個預定的閾值(例如0.5或0.7)時,可以將該預測視為成功檢測。這種指標可以用於計算Precision-Recall曲線以及平均精度(Average Precision)等性能指標。
在分割任務中,IoU用於衡量模型預測的分割區域與實際分割區域之間的相似度。當分割區域的IoU越高,表示模型的分割結果越準確。
mAP50(B)
mAP50(B) 是指”Mean Average Precision at IoU 0.50 for Large Objects”,意思是在IoU(Intersection over Union,重疊度)為0.50 的情況下,針對較大目標計算的平均精度(AP)值的均值。 mAP 是模型在不同類別上的平均精度值,而 mAP50(B) 是針對較大目標計算的平均精度值。
mAP50-95(B)
mAP50-95(B) 是指 “Mean Average Precision across IoU 0.50 to 0.95 for Large Objects”,意思是在 IoU 從 0.50 到 0.95 範圍內,針對較大目標計算的平均精度值的均值。這個指標更全面地評估了模型在不同重疊度下的性能。
precision(B)
precision(B) 是針對較大目標計算的精確率,即模型在預測中有多少是正確的,相對於所有預測中的正確和錯誤。它是衡量模型預測的準確性的指標之一。
recall(B)
recall(B) 是針對較大目標計算的召回率,即模型正確預測的目標數與實際目標數之比。它表示模型能夠檢測到多少實際目標。召回率是衡量模型識別能力的指標之一。
dfl_loss(Detection Focal Loss)
dfl_loss 是一種在YOLO目標檢測中引入的特殊損失函數,它是基於焦點損失(Focal Loss)的改進。焦點損失的主要目標是應對樣本不平衡問題,即正負樣本比例嚴重失衡。在目標檢測中,負樣本(即不含目標的區域)遠遠多於正樣本(含有目標的區域)。 dfl_loss 試圖通過放大難以分類的正樣本的損失,來應對這種不平衡,從而使模型更關注難以識別的目標。
box_loss(Box Regression Loss)
這是用於衡量預測框位置的損失函數。在目標檢測中,模型不僅要預測目標的類別,還要預測框的位置,即邊界框的中心坐標、寬度和高度。 box_loss 的目標是使模型的位置預測更接近真實目標框的位置。這有助於確保檢測到的框與真實目標框的位置相匹配,從而提高目標定位的準確性。
cls_loss(Class Classification Loss)
cls_loss 用於分類目標的類別。在YOLO中,每個檢測框需要預測它所屬的目標類別。 cls_loss 的作用是確保模型的類別預測盡可能準確。這對於準確地將檢測框與正確的目標類別關聯非常重要,從而實現了目標分類的準確性。
我的tensorborad訓練狀況
這邊深藍色的是使用YOLOv8m.pt做預訓練模型、淺藍色的是使用YOLOv8n,深藍色的跑了2個多小時(100次),淺藍色的因為懶得跑完只做了60幾次。橘色的是別人訓練的歷程。
為什麼自己訓練的結果即使所有資料集都一樣卻有不同的狀況,需要進一步去了解。