使用baseline跑出的成績只有0.16,後面幾天試過各種改進,下面記錄一下自己的改進過程:
更好的模型
baseline中使用的模型是yolo8n,首先,8代表的是yolo的第八代,n代表的是模型的大小。目前yolo已經開發出第10代了,相比於第8代,第10代更高更快更強,所以理所當然的選擇yolo10來訓練我們的模型。至於模型的大小,這裡我選擇的是yolov8s,再大的模型我的顯示卡就跑不了了。。。
具體的模型權重可以去ultralytics下載,ultralytics這個網站對新人還是很友好的,關於yolo的訓練及測試方法官方文件都寫的很清楚,完全可以自學。
在下載好模型權重後,將權重的路徑貼上到YOLO函式中就完成模型匯入了,非常的方便。
model = YOLO("yolov8s.pt")
引數調優
使訓了效果更上次層樓的另一個方法就是對模型的超引數進行調優。下面是具體的引數設定:
results = model.train( data="yolo-dataset/yolo.yaml", epochs=2, imgsz=640, batch=8, patience=5, dropout=0.5, label_smoothing=True, exist_ok=True, name='train', dfl=0.5, multi_scale=True, optimizer='AdamW', verbose=True, close_mosaic=1, plots=True, copy_paste=0.5, )
在這裡,我只設定了
- epoch=2,這是因為我們匯入的YOLO已經是經過預訓練的了,後續在比賽資料集上的訓練應該稱之為微調。在前面的實驗中我發現,只需要再經過1-2個epoch模型的訓練就足夠了,再多就會產生過擬合。
- imagsz=640,是因為原始的圖片大小大致在1080左右,太大了,會嚴重佔用GPU的記憶體。將圖片適當減小,空餘出的記憶體可以用於增大batchsize,較大的batchsize可以確保模型的魯棒性。
- batch=8是因為在後面我將multi_scale設定為了True。multi_scale=True會在訓練中隨即地改變輸入圖片的大小,使得模型能在多尺度上具有魯棒性,增加精度。但是隨機地改變圖片的大小,就是說有些圖片的尺寸會非常大,導致GPU記憶體佔用特別大。所以較小的batchsize就能確保GPU有足夠的空間。
- patience=5是說,當模型的loss連續5個epoch不再下降時,就自動停止訓練。
- dropout=0.5: 在訓練的時候隨機停用50%的神經元,這個也是增加模型的魯棒性的。
- label_smoothing=True: 也是增加模型的魯棒性的。
- exist_os=True, name='train':模型的訓練結果輸出到runs資料夾下的名為train的子資料夾中。第一次執行預測程式碼時,系統報錯在train資料夾中找不到名為best.pt的檔案,後來才發現如果runs資料夾中已經有一個train資料夾後,系統會自動建一個名為train0的資料夾用來儲存該次執行的結果,以避免覆蓋以前執行的結果。設定這兩個引數的意思是:該次執行的結果輸出到train資料夾中,如果已經有一個train資料夾了,那麼就覆蓋掉之前的結果。
- dfl=0.5:dfloss在總體loss中的權重。訓練資料中的各個類別數量十分不平衡,百度說設定這個引數可以一定程度上避免類別不平衡。
- optimizer:選擇你的最佳化器。預設的最佳化器是SGD,太low了,還是用AdamW吧。
- verbose:顯示訓練過程。
同時,在訓練中還選擇了兩種資料增強方法:mosaic和copy_paste,這兩種方法的具體內容在官網有解釋,這裡不過多追述。選擇這兩種增強方法的理由是來自經驗,其他的資料增強方法感覺效果有限。
透過這一通操作,成功將分數幹到了0.23,還是很低。
總的來說:還是資料太爛了,賽事方給的標註資料太爛了