[Kaggle] Passenger Screening Algorithm Challenge 銀牌分享

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

Passenger Screening Algorithm Challenge

競賽與資料簡介

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

2. .a3d: 512x512x660的3D圖

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

競賽的演算法

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

3D CNN由於沒有transfer learning可以使用,加上資料只有數千筆,十分的難以訓練,十分容易的overfitting。嘗試後Resnet 以及Densenet 都沒有很好的結果,使用 leaky RELU 以及ELU 當作Active function也沒有很好的結果,增量(augmentation)的方法花了不少時間嘗試,加上競賽最後連續加班了十多天,所以我只用了改良VGG16的3D CNN做2個fold的average ensemble。

我最後拿到第36名logloss是 0.15917,第一名 0.02417(神呀)

心得

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

Source: Deep Learning on Medium