從39個(gè)kaggle競賽中總結(jié)出來的圖像分割的Tips和Tricks

極市導(dǎo)讀
?作者參加了39個(gè)Kaggle比賽,按照整個(gè)比賽的順序,總結(jié)了賽前數(shù)據(jù)的處理,模型的訓(xùn)練,以及后處理等可以助力大家的tips和tricks,非常多的技巧和經(jīng)驗(yàn),現(xiàn)在全部分享給大家。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿

想象一下,如果你能得到所有的tips和tricks,你需要去參加一個(gè)Kaggle比賽。我已經(jīng)超過39個(gè)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
現(xiàn)在把這些知識都挖出來給你們!
外部數(shù)據(jù)
使用 LUng Node Analysis Grand Challenge 數(shù)據(jù),因?yàn)檫@個(gè)數(shù)據(jù)集包含了來自放射學(xué)的標(biāo)注細(xì)節(jié)。
使用 LIDC-IDRI 數(shù)據(jù),因?yàn)樗哂姓业搅四[瘤的所有放射學(xué)的描述。
使用Flickr CC,維基百科通用數(shù)據(jù)集
使用Human Protein Atlas Dataset
使用IDRiD數(shù)據(jù)集
數(shù)據(jù)探索和直覺
使用0.5的閾值對3D分割進(jìn)行聚類
確認(rèn)在訓(xùn)練集和測試集的標(biāo)簽分布上有沒有不一樣的地方
預(yù)處理
使用DoG(Difference of Gaussian)方法進(jìn)行blob檢測,使用skimage中的方法。
使用基于patch的輸入進(jìn)行訓(xùn)練,為了減少訓(xùn)練時(shí)間。
使用cudf加載數(shù)據(jù),不要用Pandas,因?yàn)樽x數(shù)據(jù)更快。
確保所有的圖像具有相同的方向。
在進(jìn)行直方圖均衡化的時(shí)候,使用對比度限制。
使用OpenCV進(jìn)行通用的圖像預(yù)處理。
使用自動化主動學(xué)習(xí),添加手工標(biāo)注。
將所有的圖像縮放成相同的分辨率,可以使用相同的模型來掃描不同的厚度。
將掃描圖像歸一化為3D的numpy數(shù)組。
對單張圖像使用暗通道先驗(yàn)方法進(jìn)行圖像去霧。
將所有圖像轉(zhuǎn)化成Hounsfield單位(放射學(xué)中的概念)。
使用RGBY的匹配系數(shù)來找到冗余的圖像。
開發(fā)一個(gè)采樣器,讓標(biāo)簽更加的均衡。
對測試圖像打偽標(biāo)簽來提升分?jǐn)?shù)。
將圖像/Mask降采樣到320x480。
直方圖均衡化(CLAHE)的時(shí)候使用kernel size為32×32
將DCM轉(zhuǎn)化為PNG。
當(dāng)有冗余圖像的時(shí)候,為每個(gè)圖像計(jì)算md5 hash值。
數(shù)據(jù)增強(qiáng)
使用 albumentations 進(jìn)行數(shù)據(jù)增強(qiáng)。
使用隨機(jī)90度旋轉(zhuǎn)。
使用水平翻轉(zhuǎn),上下翻轉(zhuǎn)。
可以嘗試較大的幾何變換:彈性變換,仿射變換,樣條仿射變換,枕形畸變。
使用隨機(jī)HSV。
使用loss-less增強(qiáng)來進(jìn)行泛化,防止有用的圖像信息出現(xiàn)大的loss。
應(yīng)用channel shuffling。
基于類別的頻率進(jìn)行數(shù)據(jù)增強(qiáng)。
使用高斯噪聲。
對3D圖像使用lossless重排來進(jìn)行數(shù)據(jù)增強(qiáng)。
0到45度隨機(jī)旋轉(zhuǎn)。
從0.8到1.2隨機(jī)縮放。
亮度變換。
隨機(jī)變化hue和飽和度。
使用D4:https://en.wikipedia.org/wiki/Dihedral_group增強(qiáng)。
在進(jìn)行直方圖均衡化的時(shí)候使用對比度限制。
使用AutoAugment:https://arxiv.org/pdf/1805.09501.pdf增強(qiáng)策略。
模型
結(jié)構(gòu)
使用U-net作為基礎(chǔ)結(jié)構(gòu),并調(diào)整以適應(yīng)3D的輸入。
使用自動化主動學(xué)習(xí)并添加人工標(biāo)注。
使用inception-ResNet v2 architecture結(jié)構(gòu)使用不同的感受野訓(xùn)練特征。
使用Siamese networks進(jìn)行對抗訓(xùn)練。
使用_ResNet50_, Xception, Inception ResNet v2 x 5,最后一層用全連接。
使用global max-pooling layer,無論什么輸入尺寸,返回固定長度的輸出。
使用stacked dilated convolutions。
VoxelNet。
在LinkNet的跳躍連接中將相加替換為拼接和conv1x1。
Generalized mean pooling。
使用224x224x3的輸入,用Keras NASNetLarge從頭訓(xùn)練模型。
使用3D卷積網(wǎng)絡(luò)。
使用ResNet152作為預(yù)訓(xùn)練的特征提取器。
將ResNet的最后的全連接層替換為3個(gè)使用dropout的全連接層。
在decoder中使用轉(zhuǎn)置卷積。
使用VGG作為基礎(chǔ)結(jié)構(gòu)。
使用C3D網(wǎng)絡(luò),使用adjusted receptive fields,在網(wǎng)絡(luò)的最后使用64 unit bottleneck layer 。
使用帶預(yù)訓(xùn)練權(quán)重的UNet類型的結(jié)構(gòu)在8bit RGB輸入圖像上提升收斂性和二元分割的性能。
使用LinkNet,因?yàn)橛挚煊质?nèi)存。
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
硬件設(shè)置
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: 2_1080Ti + 4_1080
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
損失函數(shù)
Dice Coefficient ,因?yàn)樵诓痪鈹?shù)據(jù)上工作很好。
Weighted boundary loss 目的是減少預(yù)測的分割和ground truth之間的距離。
MultiLabelSoftMarginLoss 使用one-versus-all損失優(yōu)化多標(biāo)簽。
Balanced cross entropy (BCE) with logit loss 通過系數(shù)來分配正負(fù)樣本的權(quán)重。
Lovasz 基于sub-modular損失的convex Lovasz擴(kuò)展來直接優(yōu)化平均IoU損失。
FocalLoss + Lovasz 將Focal loss和Lovasz losses相加得到。
Arc margin loss 通過添加margin來最大化人臉類別的可分性。
Npairs loss 計(jì)算y_true 和 y_pred之間的npairs損失。
將BCE和Dice loss組合起來。
LSEP – 一種成對的排序損失,處處平滑因此容易優(yōu)化。
Center loss 同時(shí)學(xué)習(xí)每個(gè)類別的特征中心,并對距離特征中心距離太遠(yuǎn)的樣本進(jìn)行懲罰。
Ring Loss 對標(biāo)準(zhǔn)的損失函數(shù)進(jìn)行了增強(qiáng),如Softmax。
Hard triplet loss 訓(xùn)練網(wǎng)絡(luò)進(jìn)行特征嵌入,最大化不同類別之間的特征的距離。
1 + BCE – Dice 包含了BCE和DICE損失再加1。
Binary cross-entropy – ?log(dice) 二元交叉熵減去dice loss的log。
BCE, dice和focal 損失的組合。
BCE + DICE - Dice損失通過計(jì)算平滑的dice系數(shù)得到。
Focal loss with Gamma 2 標(biāo)準(zhǔn)交叉熵?fù)p失的升級。
BCE + DICE + Focal – 3種損失相加。
Active Contour Loss 加入了面積和尺寸信息,并集成到深度學(xué)習(xí)模型中。
1024 * BCE(results, masks) + BCE(cls, cls_target)
Focal + kappa – Kappa是一種用于多類別分類的損失,這里和Focal loss相加。
ArcFaceLoss?—? 用于人臉識別的Additive Angular Margin Loss。
soft Dice trained on positives only – 使用預(yù)測概率的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,在某些場景下比二元交叉熵?fù)p失好。
訓(xùn)練技巧
嘗試不同的學(xué)習(xí)率。
嘗試不同的batch size。
使用SGD + 動量 并手工設(shè)計(jì)學(xué)習(xí)率策略。
太多的增強(qiáng)會降低準(zhǔn)確率。
在圖像上進(jìn)行裁剪做訓(xùn)練,全尺寸圖像做預(yù)測。
使用Keras的ReduceLROnPlateau()作為學(xué)習(xí)率策略。
不使用數(shù)據(jù)增強(qiáng)訓(xùn)練到平臺期,然后對一些epochs使用軟硬增強(qiáng)。
凍結(jié)除了最后一層外的所有層,使用1000張圖像進(jìn)行微調(diào),作為第一步。
使用分類別采樣
在調(diào)試最后一層的時(shí)候使用dropout和增強(qiáng)
使用偽標(biāo)簽來提高分?jǐn)?shù)
使用Adam在plateau的時(shí)候衰減學(xué)習(xí)率
用SGD使用Cyclic學(xué)習(xí)率策略
如果驗(yàn)證損失持續(xù)2個(gè)epochs沒有降低,將學(xué)習(xí)率進(jìn)行衰減
將10個(gè)batches里的最差的batch進(jìn)行重復(fù)訓(xùn)練
使用默認(rèn)的UNET進(jìn)行訓(xùn)練
對patch進(jìn)行重疊,這樣邊緣像素被覆蓋兩次
超參數(shù)調(diào)試:訓(xùn)練時(shí)候的學(xué)習(xí)率,非極大值抑制以及推理時(shí)候的分?jǐn)?shù)閾值
將低置信度得分的包圍框去掉。
訓(xùn)練不同的卷積網(wǎng)絡(luò)進(jìn)行模型集成。
在F1score開始下降的時(shí)候就停止訓(xùn)練。
使用不同的學(xué)習(xí)率。
使用層疊的方法用5 folds的方法訓(xùn)練ANN,重復(fù)30次。
評估和驗(yàn)證
按類別非均勻的劃分訓(xùn)練和測試集
當(dāng)調(diào)試最后一層的時(shí)候,使用交叉驗(yàn)證來避免過擬合。
使用10折交叉驗(yàn)證集成來進(jìn)行分類。
檢測的時(shí)候使用5-10折交叉驗(yàn)證來集成。
集成方法
使用簡單的投票方法進(jìn)行集成
對于類別很多的模型使用LightGBM,使用原始特征。
對2層模型使用CatBoost。
使用 ‘curriculum learning’ 來加速模型訓(xùn)練,這種訓(xùn)練模式下,模型先在簡單樣本上訓(xùn)練,再在困難樣本上訓(xùn)練。
使用ResNet50, InceptionV3, and InceptionResNetV2進(jìn)行集成。
對物體檢測使用集成。
對Mask RCNN, YOLOv3, 和Faster RCNN 進(jìn)行集成。
后處理
使用test time augmentation?,對一張圖像進(jìn)行隨機(jī)變換多次測試后對結(jié)果進(jìn)行平均。
對測試的預(yù)測概率進(jìn)行均衡化,而不是使用預(yù)測的類別。
對預(yù)測結(jié)果進(jìn)行幾何平均。
在推理的時(shí)候分塊重疊,因?yàn)閁Net對邊緣區(qū)域的預(yù)測不是很好。
進(jìn)行非極大值抑制和包圍框的收縮。
在實(shí)例分割中使用分水嶺算法后處理來分離物體。
推薦閱讀

