— (1)機器學習小白入門YOLOv :從概念到實踐
(2)機器學習小白入門 YOLOv:從模塊優化到工程部署
(3)機器學習小白入門 YOLOv: 解鎖圖片分類新技能
(4)機器學習小白入門YOLOv :圖片標注實操手冊
(5)機器學習小白入門 YOLOv:數據需求與圖像不足應對策略
(6)機器學習小白入門 YOLOv:圖片的數據預處理
(7)機器學習小白入門 YOLOv:模型訓練詳解
一、訓練模型的基本概念和原理簡介
原理簡介
模型通過一個稱為反向傳播的過程反復進行預測、計算誤差和更新參數。在此過程中,模型會調整其內部參數 (weights and biases) 以減少誤差。通過多次重復這一循環,模型逐漸提高了準確性。隨著時間的推移,它就能學會識別形狀、顏色和紋理等復雜模式。
模型作用:
YOLOv8 是一個用于 目標檢測 的深度學習模型。它的任務是在一張圖片中識別出圖像中存在的對象,并標記它們的位置(通常用邊界框表示)以及每個對象的類別標簽。
目標函數(Loss):
在訓練過程中,我們需要最小化損失函數。YOLOv8 模型的損失主要包括以下幾個部分:
- 分類損失:判斷模型輸出的物體類別是否正確。
- 定位損失:衡量邊界框位置與真實目標之間的差距。
- 置信度損失:判斷一個預測框是否包含一個目標對象。
優化器的作用:
使用優化器來更新神經網絡中的權重參數,以最小化損失函數。常見優化器有 SGD
、Adam
、RMSProp
、AdamW
等。
二、訓練模型的步驟詳解
以下是基于 Python 和 YOLOv8 訓練目標檢測模型的整體流程:
步驟 1:導入必要的庫
import torch
from ultralytics import YOLO
注意:
ultralytics
是官方提供的對YOLOv8的封裝。- 使用前需通過 pip 安裝
ultralytics
包:pip install ultralytics
步驟 2:加載預訓練模型
model = YOLO("yolov8n.pt") # 加載YOLOv8小型目標檢測預訓練權重,也可以使用 'yolov8s.pt'、'yolov8m.pt' 等不同大小的模型
yolov8n.pt
: 小型網絡。yolov8m.pt
: 中型網絡(默認)。yolov8l.pt
/yolov8x.pt
: 大型網絡,檢測精度高但推理速度較慢。
步驟 3:定義訓練配置
# 定義模型的訓練配置參數
config = {"epochs": 100, # 總共訓練多少輪"imgsz": 640, # 圖像縮放大小"batch_size": 16, # 每次送入網絡的數據量(影響訓練速度和內存占用)"workers": 8, # 數據加載線程數,加速數據讀取"device": 'cuda', # 使用GPU進行訓練,'cpu'也可以使用CPU進行訓練但會更慢"project": "yolov8_training", # 訓練結果保存的根目錄名稱(可自定義)"name": "train_exp" # 當前實驗的名字,在 project 文件夾中形成子文件夾
}
步驟 4:開始訓練模型
results = model.train(data='coco.yaml', # 數據集配置文件路徑,需要按照格式提供數據集信息epochs=config["epochs"],imgsz=config["imgsz"],batch_size=config["batch_size"],workers=config["workers"],device=config["device"],project=config["project"],name=config["name"]
)
data='coco.yaml'
是 Ultralytics 提供的 COCO 數據集配置文件路徑,如果你有自定義的數據集,可以自己按照格式創建一個.yaml
文件。
步驟 5:驗證訓練結果
# 在訓練完成后對模型進行驗證
metrics = model.val()
print(metrics)
val()
方法返回的是在驗證數據上的檢測指標(如 mAP、Recall 等)。
三、優化器的選擇和使用(以 AdamW 為例)
YOLOv8 默認使用的是 AdamW 優化器,它是一個改進的 Adam 優化算法,支持 L2 正則化。
示例:
# 如果你需要手動控制訓練過程,也可以直接使用 torch.optim.AdamWfrom torch import optim, nn# 假設你已經有了一個網絡模型 model
model = Model() # 自己定義的神經網絡結構optimizer = optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)
criterion = nn.BCELoss()for epoch in range(config["epochs"]):for batch_data, batch_labels in train_loader:outputs = model(batch_data)loss = criterion(outputs, batch_labels)optimizer.zero_grad()loss.backward()optimizer.step()
四、提前停止策略(Early Stopping)的實現
在模型訓練過程中,如果驗證集上的損失連續多輪沒有下降,則可以考慮提前結束訓練。
from sklearn.model_selection import train_test_split
import torch
from ultralytics import YOLO, EarlyStoppingmodel = YOLO("yolov8n.pt")early_stopper = EarlyStopping(patience=10) # 設置為10輪沒有改進則提前停止for epoch in range(100):model.train()train_loss = model.train() # 訓練val_loss = model.val() # 驗證if early_stopper(val_loss):print("Early stopping triggered.")break
五、如何確定訓練紀元數(Epochs)
- 如果是目標檢測任務,建議設置為
100 ~ 500
。 - 初始可設為 30,然后觀察驗證損失是否在下降,再適當增加。
- 每次增加 20 或 50 輪左右即可。
注意:如果模型過擬合,可以通過早停、數據增強(如 CutMix)等方法緩解。
六、訓練過程的監控與記錄
輸出日志:
YOLOv8 的訓練會實時輸出以下內容:
- 每個 epoch 中損失的變化。
- mAP(mean Average Precision),衡量檢測準確率的一個指標。
- 訓練用時和每個 epoch 速度。
可視化工具:
使用 TensorBoard 來查看模型的訓練過程,可以通過以下方式啟用它:
from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter('runs/train')for i, data in enumerate(train_loader):outputs = model(data)writer.add_scalar("Loss", loss.item(), i) # 記錄損失值
然后使用命令啟動 TensorBoard:
tensorboard --logdir runs/train
📌 小結
模塊 | 內容 |
---|---|
模型選擇 | 使用 YOLOv8 的預訓練模型 yolov8n.pt |
優化器 | AdamW 是目前最常用的選擇,支持權重衰減(防止過擬合) |
提前停止 | 若驗證損失連續10輪無改進,則終止訓練以節省資源 |
訓練紀元數 | 初始設置為50~100,再根據結果增加即可 |
數據處理 | 需要自定義 data.yaml 文件來描述訓練和測試集的路徑、類別等信息 |