昨天討論了過小資料即會有過擬合的問題,今天我們會透過調整超參數和資料增強訓練新的偵測模型。
不過今天的實作大起大落
為了解決過擬合的問題,我重新寫了一個 train_v2.py,加了重度的遙測資料增強,然後也調低 learning rate,結果推論出來後看到了假陽性爆炸 (False Positive Explosion) ,密畫面上多出了數百個藍框,混淆矩陣的 FP 高達 216 ,然後嘗試將推論的置信度門檻(conf)拉高到 0.85,但後來的框都在旁邊,完全沒標到目標物,重點是分數都很高,目標物被無視。
因為極端的旋轉和縮放打破原本對目標物的幾何認知,當目標物特徵被扭曲後模型就會放棄學習形狀,只要看到排列整齊的高對比人造物就會誤判為目標物。
為了讓他會到正軌,我把旋轉和縮放關掉,只留左右翻轉,也讓 learning rate 和 weight decay 條回預設。
以下是扣:
results = model.train(
# ... 前略 ...
lr0=0.01, # 恢復預設學習率
weight_decay=0.0005, # 恢復預設正則化
degrees=0.0, # 關閉旋轉
scale=0.0, # 關閉大範圍縮放
fliplr=0.5, # 保留左右翻轉
flipud=0.5 # 保留上下翻轉
)
v3 訓練完之後他直接給我空白,應該是遇到 模型崩潰 (Model Collaose),因為關掉了極端增強,模型在小資料集找不到特徵梯度,因為這樣不確定所以就直接預測沒有。
為了測試他是真的不知道還是假的不知道,我們把推論門檻調到非常低的 0.1:
results = model.predict(
source=str(test_source),
conf=0.1,
iou=0.50,
save=True
)
模型最後還是在右下角畫出了一個 0.22 的框,但她還是很不確定,只敢給低分。
今天經歷了模型自信跟不確定的分析結果,今天演算法已碰到小資料集的天花板,我們可能要加入跨領域的解法,可能將暫時放下 YOLO,進入遙測領域的章節,如何將預測出來的像素座標 (x, y),透過 Affine Transform 轉換為真實世界的 EPSG:4326 地理經緯度,那我們明天見。