RetinaNet在RSNA 2018數據集上的調試(一)
02-14
最近在Kaggle RSNA肺炎識別數據集上進行識別框架的研究。主要涉及的網路有Mask RCNN和RetinaNet,其中RetinaNet是FPN+Focal Loss的單步檢測器,結構簡潔,適合優化,因此主要的研究是在RetinaNet上完成的。
一、Baseline網路
對於單模型解決方案,排名較高的基本都是RetinaNet,而集成模型則也有用Mask RCNN和Fast RCNN的,另外U-Net改造的方案也有取得第四的名次。
對於RetinaNet可用的改造:
- 更換BackBone,據第二名方案的描述,SE-ResNext101取得了最好的結果,但是第三名用ResNet-101也取得了很高的Baseline分數。目前我還是使用ResNet-101 BackBone進行測試。
- 添加P2層,優化小BBox預測。
- Pytorch的RetinaNet實現沒有對純背景圖像進行訓練,通過改造Focal Loss可以對純背景圖像進行訓練。
- 在訓練的時候添加全局分類Head,預測的時候不使用。該項優化目前在本地測試集有提升,但是在Leader Board上並沒有顯示出提升效果,估計是全局收斂速度與BBox不同,可以通過添加Dropout進行調節,但是會引入新的超參數。
- 由於BBox分類和位置回歸的收斂速度不同,可以考慮加入Dropout使得它們同時收斂到最佳,同樣會引入新的超參數。暫時沒有測試。
二、超參調節
可用的超參有:
- NMS_IOU_THRESHOLD,這個比賽中最重要的超參,最佳設置為0,可以在Leader Board上取得極大的提升。因為數據集中沒有重合BBox出現,這與通常的目標檢測任務不同。
- SCORE_THRESHOLD,很重要也很微妙的參數。由於該比賽中訓練集與測試集數據分布不同,精細調節該參數可以有效提高網路在測試集中的表現。
- MAX_DETECTIONS,最佳設置為3,對於MRCNN和RetinaNet都有效。
- SCALE_FACTOR,這是該項比賽中特有的參數。由於測試集中部分BBox是三位醫生標註結果的交集,使得訓練出來的BBox系統性的偏大,因此縮小BBox可以有效提高測試集的分數。另外,數據增廣時做的旋轉也可能使BBox稍微偏大一些(可以選取不同的旋轉關鍵點改善)。
三、評價函數
- Val Loss,主要用來判斷網路是否過擬合。
- 官方mAP,由於訓練集和測試集的數據分布問題,效果並不是很好。
- Youden指數,效果比較好,Youden指數高的模型在測試集上表現較好(一般mAP也比較好),另外Youden中的敏感度可以指導SCORE_THRESHOLD的選擇,一般偏向降低SCORE_THRESHOLD使得敏感度提高一些,這可能是因為測試集中BBox更多一些。
四、模型集成
在我的4 Fold CV測試中用7個checkpoint集成得到了大約10%的提升。
第二和第三名方案都提到了用50層和101層BackBone的模型進行融合,尚未測試。
五、數據集抽取
對於本地Val集的採用隨機抽取,由於數據量較小(1000個),它的分布有可能與訓練、Leader Board測試集差別較大。
可以通過多次調參並上傳,對本地Train、Val和測試集的分布進行估計。
Pytorch和Keras的RetinaNet在訓練Epoch處理上稍微有些不同,Keras允許設置每個Epoch的Step數,對於隨機抽取的訓練集,類似於做Bagging訓練了。
六、結果
目前我的單模型在Private LB上最佳結果是0.22,圖像解析度608×608,訓練了4個Epoch,ResNet-101骨幹,添加了P2層,沒有使用全局分類訓練,超參:
SCORE_THRESHOLD:0.05
SCALE_FACTOR:0.85
第三名的單模型最佳結果比我目前高5%,在0.232。
我會繼續做的實驗:
- 加入數據增廣進行訓練(目前只用了水平翻轉)。
- 用SGD優化器進行訓練(目前是Adam,據說SGD可以得到泛化更好的模型)。
- 添加更長比例的Anchor。
推薦閱讀: