[Kaggle] Passenger Screening Algorithm Challenge 銀牌分享

此篇文章分享個人參加Kaggle最高獎金的競賽(總獎金 $ 1,500,000)中獲得銀牌(第36名)的方法 ,這個競賽的連結如下:

競賽與資料簡介

這個是美國國土安全部尋求機場威脅識別算法的競賽,這個競賽是在機場設置毫米波掃描儀掃描人的全身,然後辨識身上17個位置上是否有異物。此項競賽提供四種資料模式,我了解後採用了其中兩種格式做分析 :
1. .a3daps: 512x660在64個角度下的資料,以下是其中16個角度的例圖,圖中上手臂有異物。

2. .a3d: 512x512x660的3D資料

此訓練資料只有1147筆資料,這個競賽分數是採logloss(越小越好)。是兩個階段,第一階段跟其他競賽一樣,Leaderboard的分數是部分公開(Public Leaderboard),部分隱藏的(Private Leaderboard)。然而第二階段是全部隱藏,且第二階段只有四天的時間,所以答案送出去就決定一切了。

競賽的採用方法

個人採用的是3D CNN的方法,在a3daps以及a3d兩種格式都做嘗試,a3d有較佳的效果,受限於GPU的記憶體,將3D的Stride 4 (即跳四點取)至 128x128x165。我用Keras將VGG16 、Resnet以及DenseNet 121 這3 種Network改成3D CNN去做訓練,並將圖片增量(augmentation) 3D shift +-5 pixel以及3D rotate +- 5度,3D的運算需要用到scipy.ndimage這個函式庫,本來還有做3D scale,但運算時間實在太久了。使用16個CPU Cores (32 Threads)、兩個1080Ti GPU平行運算下,Train一次需要50個小時左右。

3D CNN由於沒有transfer learning可以使用,加上資料只有數千筆,3D CNN可調的參數很多的狀況下,很容易overfitting。嘗試後,比起Resnet 以及Densenet架構的3D CNN,VGG16加入Batch Normalize後,有較好的結果,此外,嘗試用leaky RELU 以及ELU 當作Active function更容易overfitting。為了克服overfitting的問題,增量(augmentation)的方法花了不少時間嘗試,此外,由於VGG16有加入Batch Normalize,dropout只加在Full Connection Layer (dropout和Batch Normalize不能同時加,會降低效能,可以參閱https://arxiv.org/abs/1801.05134)。

我最後拿到第36名(Top 7%,35/518),logloss是 0.15917,第一名 0.02417 (距離世界頂尖還有一段距離)。

心得

競賽後分享有些人用a3daps格式採用 Multi-view CNN (MVCNN) (參考http://vis-www.cs.umass.edu/mvcnn/),3D CNN因為無法使用transfer learning,在只有數千筆資料做訓練遇到很大的挑戰,而MVCNN可以使用transfer learning的技巧,看過其他人的分享後覺得在訓練資料不多的情況下,MVCNN是可以嘗試的好方法。