從39個kaggle競賽中總結出來的圖像分割的Tips和Tricks(附資源)

來源:AI公園 本文約2700字,建議閱讀10分鐘
本文與你分享參加了39個Kaggle比賽的技巧和經驗。
Data Science Bowl 2017?– $1,000,000 Intel & MobileODT Cervical Cancer Screening?– $100,000 2018 Data Science Bowl?– $100,000 Airbus Ship Detection Challenge?– $60,000 Planet: Understanding the Amazon from Space?– $60,000 APTOS 2019 Blindness Detection?– $50,000 Human Protein Atlas Image Classification?– $37,000 SIIM-ACR Pneumothorax Segmentation?– $30,000 Inclusive Images Challenge?– $25,000
外部數據
使用 LUng Node Analysis Grand Challenge 數據,因為這個數據集包含了來自放射學的標注細節(jié); 使用 LIDC-IDRI 數據,因為它具有找到了腫瘤的所有放射學的描述; 使用Flickr CC,維基百科通用數據集; 使用Human Protein Atlas Dataset; 使用IDRiD數據集。
數據探索和直覺
使用0.5的閾值對3D分割進行聚類; 確認在訓練集和測試集的標簽分布上有沒有不一樣的地方。
預處理
使用DoG(Difference of Gaussian)方法進行blob檢測,使用skimage中的方法; 使用基于patch的輸入進行訓練,為了減少訓練時間; 使用cudf加載數據,不要用Pandas,因為讀數據更快; 確保所有的圖像具有相同的方向; 在進行直方圖均衡化的時候,使用對比度限制; 使用OpenCV進行通用的圖像預處理; 使用自動化主動學習,添加手工標注; 將所有的圖像縮放成相同的分辨率,可以使用相同的模型來掃描不同的厚度; 將掃描圖像歸一化為3D的numpy數組; 對單張圖像使用暗通道先驗方法進行圖像去霧; 將所有圖像轉化成Hounsfield單位(放射學中的概念); 使用RGBY的匹配系數來找到冗余的圖像; 開發(fā)一個采樣器,讓標簽更加的均衡; 對測試圖像打偽標簽來提升分數; 將圖像/Mask降采樣到320x480; 直方圖均衡化(CLAHE)的時候使用kernel size為32×32; 將DCM轉化為PNG; 當有冗余圖像的時候,為每個圖像計算md5 hash值。
數據增強
使用 albumentations 進行數據增強; 使用隨機90度旋轉; 使用水平翻轉,上下翻轉; 可以嘗試較大的幾何變換:彈性變換,仿射變換,樣條仿射變換,枕形畸變; 使用隨機HSV; 使用loss-less增強來進行泛化,防止有用的圖像信息出現(xiàn)大的loss; 應用channel shuffling; 基于類別的頻率進行數據增強; 使用高斯噪聲; 對3D圖像使用lossless重排來進行數據增強; 0到45度隨機旋轉; 從0.8到1.2隨機縮放; 亮度變換; 隨機變化hue和飽和度; 使用D4:https://en.wikipedia.org/wiki/Dihedral_group增強; 在進行直方圖均衡化的時候使用對比度限制; 使用AutoAugment:https://arxiv.org/pdf/1805.09501.pdf增強策略。
模型結構
使用U-net作為基礎結構,并調整以適應3D的輸入; 使用自動化主動學習并添加人工標注; 使用inception-ResNet v2 architecture結構使用不同的感受野訓練特征; 使用Siamese networks進行對抗訓練; 使用ResNet50, Xception, Inception ResNet v2 x 5,最后一層用全連接; 使用global max-pooling layer,無論什么輸入尺寸,返回固定長度的輸出; 使用stacked dilated convolutions; VoxelNet; 在LinkNet的跳躍連接中將相加替換為拼接和conv1x1; Generalized mean pooling; 使用224x224x3的輸入,用Keras NASNetLarge從頭訓練模型; 使用3D卷積網絡; 使用ResNet152作為預訓練的特征提取器; 將ResNet的最后的全連接層替換為3個使用dropout的全連接層; 在decoder中使用轉置卷積; 使用VGG作為基礎結構; 使用C3D網絡,使用adjusted receptive fields,在網絡的最后使用64 unit bottleneck layer ; 使用帶預訓練權重的UNet類型的結構在8bit RGB輸入圖像上提升收斂性和二元分割的性能; 使用LinkNet,因為又快又省內存; MASKRCNN; BN-Inception; Fast Point R-CNN; Seresnext; UNet and Deeplabv3; Faster RCNN; SENet154; ResNet152; NASNet-A-Large; EfficientNetB4; ResNet101; GAPNet; PNASNet-5-Large; Densenet121; AC-GAN; XceptionNet (96), XceptionNet (299), Inception v3 (139), InceptionResNet v2 (299), DenseNet121 (224); AlbuNet (resnet34) from ternausnets; SpaceNet; Resnet50 from selim_sef SpaceNet 4; SCSEUnet (seresnext50) from selim_sef SpaceNet 4; A custom Unet and Linknet architecture; FPNetResNet50 (5 folds); FPNetResNet101 (5 folds); FPNetResNet101 (7 folds with different seeds); PANetDilatedResNet34 (4 folds); PANetResNet50 (4 folds); EMANetResNet101 (2 folds); RetinaNet; Deformable R-FCN; Deformable Relation Networks;
硬件設置
Use of the AWS GPU instance p2.xlarge with a NVIDIA K80 GPU; Pascal Titan-X GPU; Use of 8 TITAN X GPUs; 6 GPUs: 21080Ti + 41080; Server with 8×NVIDIA Tesla P40, 256 GB RAM and 28 CPU cores; Intel Core i7 5930k, 2×1080, 64 GB of RAM, 2x512GB SSD, 3TB HDD; GCP 1x P100, 8x CPU, 15 GB RAM, SSD or 2x P100, 16x CPU, 30 GB RAM; NVIDIA Tesla P100 GPU with 16GB of RAM; Intel Core i7 5930k, 2×1080, 64 GB of RAM, 2x512GB SSD, 3TB HDD; 980Ti GPU, 2600k CPU, and 14GB RAM。
損失函數
Dice Coefficient ,因為在不均衡數據上工作很好; Weighted boundary loss 目的是減少預測的分割和ground truth之間的距離; MultiLabelSoftMarginLoss 使用one-versus-all損失優(yōu)化多標簽; Balanced cross entropy (BCE) with logit loss 通過系數來分配正負樣本的權重; Lovasz 基于sub-modular損失的convex Lovasz擴展來直接優(yōu)化平均IoU損失; FocalLoss + Lovasz 將Focal loss和Lovasz losses相加得到; Arc margin loss 通過添加margin來最大化人臉類別的可分性; Npairs loss 計算y_true 和 y_pred之間的npairs損失; 將BCE和Dice loss組合起來; LSEP – 一種成對的排序損失,處處平滑因此容易優(yōu)化; Center loss 同時學習每個類別的特征中心,并對距離特征中心距離太遠的樣本進行懲罰; Ring Loss 對標準的損失函數進行了增強,如Softmax; Hard triplet loss 訓練網絡進行特征嵌入,最大化不同類別之間的特征的距離; 1 + BCE – Dice 包含了BCE和DICE損失再加1; Binary cross-entropy – ?log(dice)?二元交叉熵減去dice loss的log; BCE, dice和focal 損失的組合; BCE + DICE - Dice損失通過計算平滑的dice系數得到; Focal loss with Gamma 2 標準交叉熵損失的升級; BCE + DICE + Focal – 3種損失相加; Active Contour Loss 加入了面積和尺寸信息,并集成到深度學習模型中; 1024 * BCE(results, masks) + BCE(cls, cls_target); Focal + kappa – Kappa是一種用于多類別分類的損失,這里和Focal loss相加; ArcFaceLoss?—? 用于人臉識別的Additive Angular Margin Loss; soft Dice trained on positives only – 使用預測概率的Soft Dice; 2.7 * BCE(pred_mask, gt_mask) + 0.9 * DICE(pred_mask, gt_mask) + 0.1 * BCE(pred_empty, gt_empty)?一種自定義損失; nn.SmoothL1Loss(); 使用Mean Squared Error objective function,在某些場景下比二元交叉熵損失好。
訓練技巧
嘗試不同的學習率; 嘗試不同的batch size; 使用SGD + 動量并手工設計學習率策略; 太多的增強會降低準確率; 在圖像上進行裁剪做訓練,全尺寸圖像做預測; 使用Keras的ReduceLROnPlateau()作為學習率策略; 不使用數據增強訓練到平臺期,然后對一些epochs使用軟硬增強; 凍結除了最后一層外的所有層,使用1000張圖像進行微調,作為第一步; 使用分類別采樣; 在調試最后一層的時候使用dropout和增強; 使用偽標簽來提高分數; 使用Adam在plateau的時候衰減學習率; 用SGD使用Cyclic學習率策略; 如果驗證損失持續(xù)2個epochs沒有降低,將學習率進行衰減; 將10個batches里的最差的batch進行重復訓練; 使用默認的UNET進行訓練; 對patch進行重疊,這樣邊緣像素被覆蓋兩次; 超參數調試:訓練時候的學習率,非極大值抑制以及推理時候的分數閾值; 將低置信度得分的包圍框去掉; 訓練不同的卷積網絡進行模型集成; 在F1score開始下降的時候就停止訓練; 使用不同的學習率; 使用層疊的方法用5 folds的方法訓練ANN,重復30次。
評估和驗證
按類別非均勻的劃分訓練和測試集; 當調試最后一層的時候,使用交叉驗證來避免過擬合; 使用10折交叉驗證集成來進行分類; 檢測的時候使用5-10折交叉驗證來集成。
集成方法
使用簡單的投票方法進行集成; 對于類別很多的模型使用LightGBM,使用原始特征; 對2層模型使用CatBoost; 使用?‘curriculum learning’?來加速模型訓練,這種訓練模式下,模型先在簡單樣本上訓練,再在困難樣本上訓練; 使用ResNet50, InceptionV3, and InceptionResNetV2進行集成; 對物體檢測使用集成; 對Mask RCNN, YOLOv3, 和Faster RCNN 進行集成。
后處理
使用test time augmentation?,對一張圖像進行隨機變換多次測試后對結果進行平均; 對測試的預測概率進行均衡化,而不是使用預測的類別; 對預測結果進行幾何平均; 在推理的時候分塊重疊,因為UNet對邊緣區(qū)域的預測不是很好; 進行非極大值抑制和包圍框的收縮; 在實例分割中使用分水嶺算法后處理來分離物體。
評論
圖片
表情
