數據預處理
分析數據集中標注框的性質
主要是分析bbox的area和高寬比的分布,根據area和aspect_ratio來設置anchor generator的參數。
另外,當aspect ratio分布比較分散時,可以考慮使用Deform conv
分析類別均衡問題
統計數據集中各類別實例的比例,如果類別分布不均衡(最多和最少差別幾倍以上),可以考慮使用detectron2中的RepeatFactorTrainingSampler。
訓練集和驗證集的分割
在一般的比賽中,都會限制每天結果的提交次數,因此使用網站上的測評來驗證參數性能並不可取,同時也容易過擬合。因此需要從訓練集中分割出來一部分作為測試集。
通常可以采用0.2的比例進行分割。當訓練集中類別極度不平衡時,還要考慮到不平衡類別的分割,也可以在將不平衡類別擴充之后再分割。
數據增強
數據增強極為重要,網絡結構訓練方法基本都是確定了的,好的數據並不是人人都能獲得,而且從原始數據中分析並提取高質量的數據也不是人人都能辦到的。
數據增強的內容很多,具體可以分為像素變換和幾何變換,前者不會影響bbox坐標,后者會涉及bbox的變換。
具體的數據增強方法還是要根據數據集的特性來看,例如圖像有無旋轉,有無運動模糊,flip操作是否合理等。
在數據增強方面,mmdetection 做的比detectron2要好一些,可以使用albu庫,具體可以到github上看。下面推薦一些數據增強方法:
- flip,分為左右和上下,具體哪種看數據情況,常用的是左右;
- resize, 多尺度,很有必要,無論是one-stage還是two-stage,無論是anchor-free還是anchor-based
- distort, 像素級變換,一般都要加,主要調整圖像顏色,色調,飽和度等
- blur,blur有很多種,高斯,中值,運動等,這里推薦使用mmdetection+ablu,可以以一定概率施加blur,很方便。具體使用結合數據集;
- Expand, SSD中采用的數據增強方法,將圖像縮小后其余地方補0,增加對小目標的適應性
- MinIoURandomCrop, SSD中采用的隨機裁剪方法,可以參考知乎文章
另外還有albu中一些數據增強方法。
有兩種數據增強方法不得不提,就是mix-up和填鴨式。
所謂mix-up就是兩張圖按照一定的比例混合在一起,圖中所含目標標簽也以比例重新賦值,mixup的實現我還沒有找到,以后再補充吧。
所謂填鴨式,就是將一些目標扣出來,放到沒有目標的圖上去,增加圖像的魯棒性,摳出來的目標可以使誤檢的(FN)或者漏檢的,具體可以參考實現
模型結構
目標檢測bbox的表現中,cascade rcnn應該是表現最好的,可以以r50+fpn作為backbone為baseline,如果對速度有格外的要求,可以考慮使用ssd+fpn
也可以考慮使用yolov3+GIoU
backbone
一個強的backbone一般都會帶來mAP的提升,但是在考慮速度的情況下,還是要謹慎使用過大的backbone。。
fpn
目前我只是使用過fpn,是不是其他的fpn會帶來提升我也沒試過。
bn,gn, syncbn
batchnorm的方式,推薦都試一下,一般來說syncbn會比較好,但是如果模型太大,batch_size比較小,最好還是frozen_bn,即從預訓練模型中加載,並不更新bn參數。
模型訓練
預訓練模型
預訓練模型十分重要,可以使訓練迅速收斂,減少訓練時間,給調參留下更多機會。
最好的方法是使用整個網絡在一個大數據集上訓練得到的模型,如果條件不允許,也要盡量使用backbone的預訓練模型,或者backbone+FPN的模型。
迭代次數
采用在pascal voc和coco上論文中通用設置,可以先跑一個1x_schedule看看效果,一個1x表示12個epoch,在選擇模型baseline時,可以每個epoch完在分割的val上看下效果。
進一步可以使用3x_schedule,在每兩個epoch看下val上的表現。
學習率
關於學習率,一般論文中都拆用StepLrSchedule,可以考慮使用CosineLrSchedule或者CosineAnnelingLrSchedule。
注意在目標檢測的訓練過程中,一般都是要加上warming up的。
損失函數
損失函數方面也有很多技巧了,但是有些可能並不work,還是要看實驗調參。
分類
對於不均衡問題,常用的損失函數有Focal loss,CHM。這里的類別不均衡是指的是在訓練網絡時,由於anchor密集采樣造成的正負樣本不均衡,而不是數據預處理中的類別不均衡。Focal loss是一個調參的過程,使用在兩步法的檢測器中正負樣本不均衡問題由RPN網絡解決,所以Focal loss在兩步法的檢測器中的性能還要看實驗,CHM也是同理。
對於OHEM,在兩步法中或許有效,但也是要看實驗,個人感覺要比Focal loss要強一點。
回歸
bbox的回歸,最基礎的就是編碼+smooth_l1了,雖然有提出一些IoULoss,GIoUloss,對yolo提升很大,但是對於基於密集采樣的fastx rcnn方法不一定work,所以並不推薦在cascade rcnn中使用。
推理
TTA
多尺度測試還是最有效的。。。
soft_nms
soft_nms一般都能漲分。。。
confidence_th
采用coco和pascal voc的評測方法,一般都會將confidence_th設的比較低,0.001左右,相當於把pr曲線往后拉長了,mAP自然會長