基於數願AI挑戰賽數據集,採用 keras 和 MXNet 框架聯合訓練並預測病變
來自專欄 FastAI
一、數據
數據來源於數願AI挑戰賽
數據為胃癌病理切片,常規HE染色,放大倍數20×,圖片大小為2048×2048像素,比賽數據為整體切片的部分區域,tiff 格式。有兩大類,cancer 和 non_cancer數據集,其中cancer數據集對應著label數據集(mask標註數據),大小為2048×2048像素的svg格式圖片。
二、預處理,定義數據生成器
* 兩個隨機過程——(從文件夾中)隨機讀取大圖,(從大圖中)隨機讀取小圖 *
- 獲取patches。採用從2048×2048像素的圖片中隨機讀取(256,256)大小的區域。
- 獲取negative patches。non_cancer patches 直接從non_cancer數據集中隨機讀圖並隨機讀取(256,256)大小的區域。
- 獲取positive patches。cancer patches 需要先從label中判斷是否取到了標註出來的數據,如果沒取到,就繼續循環。
- 數據增強。隨機旋轉、隨機翻轉、隨機色調變換(採用MXNet自帶的隨機色調變換函數)。
* 兩個值得注意的地方——svg格式先轉換為png格式的圖片,然後採用opencv將label中的圈填充處理(有利於快速判斷cancer區);數據生成器內部採用數據增強。 *
增強後的數據可視化如下:

三、訓練參數
採用InceptionV3的網路層,權重可以導入也可以不導入。如果不導入,就要把nb_classes改為2。
epochs = 100batch_size = 32widths, heights = 256, 256base_model = InceptionV3(weights=imagenet, include_top=False, input_shape=(widths, heights, 3)) x = base_model.outputx = GlobalAveragePooling2D()(x)x = Dense(1024, activation=relu)(x) x = BatchNormalization()(x)x = Dropout(0.1)(x)predictions = Dense(2, activation=softmax)(x)model = Model(inputs=base_model.input, outputs=predictions)for layer in base_model.layers: layer.trainable = Truemodel.compile(optimizer=SGD(lr=0.01), loss=categorical_crossentropy, metrics=[accuracy])
四、訓練結果

- 沒有出現過擬合。
- 5輪訓練,acc達到90%,10輪訓練,acc 達到95%,趨勢比較好。
五、預測結果



被預測圖片,是從驗證集中剪切出來的,沒有參與過訓練(和驗證)。
- 從預測的熱力圖可以看出,癌症區域都預測對了,非癌症區域存在誤判。
- 原label圖,有3塊不連接的癌症區,預測成1個區域,這說明patches尺寸過大,細節沒有預測出來,需要調整patches尺寸。
- ROC曲線還不錯,AUC達到0.96,結果還不錯。但如果追求預測mask的準確性,模型還需調整。
- 如果想得到更精細的mask圖,InceptionV3的可行性有待研究(輸入的 patch 尺寸最低為139x139),可採用U-Net網路框架,也可自行構建反卷積層。
推薦閱讀:
TAG:深度學習DeepLearning | 機器學習 | Python |
