1 外部数据
- LUng Node Analysis Grand Challenge数据:来自外科医生的详细注释;
- LIDC-IDRI数据:上面有每个肿瘤的放射学家描述;
- Flickr CC, Wikipedia Commons datasets;
- Human Protein Atlas Dataset;
- IDRiD dataset。
数据的探索:
- 用0.5阈值对三维分割进行聚类;
- 确认在测试标签的分配上是否有实质性的差异。
2 图像预处理和数据增强
图像预处理方法有:
- 使用高斯差分方法进行斑点检测;
- 使用基于图像块的输入进行训练,以减少训练时间;
- 加载数据时,用 cudf 替换 Pandas;
- 确保所有图像保持相同的方向;
- 应用对比度受限的自适应直方图均衡化;
- 使用 OpenCV 对所有常规图像进行预处理;
- 采用自主学习并手动添加注释;
- 将所有图像调整成相同的分辨率,以便将相同的模型用于不同厚度的扫描;
- 将扫描图像转换为规范化的3D numpy数组;
- 对单张图像除雾使用暗通道先验法;
- 转换所有数据到亨斯菲尔德单元;
- 在RGBY上使用成对相关法查找重复图像;
- 开发取样器使标签更加平衡;
- 对测试数据应用伪标记以提高得分;
- 缩小图像/遮罩到320×480;
- 内核大小为32×32的直方图均衡化(CLAHE);
- 转换DCM到PNG;
- 当有重复的图像时,计算每个图像的md5哈希值。
数据增强能够使网络具有更复杂的表征能力,从而减小网络性能在验证集和训练集以及最终测试集上的差距,让网络更好地学习迁移数据集上的数据分布。数据增强方法有:
- 用 albumentations 包进行数据增强;
- 使用 90 度随机旋转;
- 使用水平、垂直翻转或这两个方向都做翻转;
- 尝试进行复杂的几何变换,包括弹性变换、透视变换、分段仿射变换、枕形失真;
- 应用随机 HSV;
- 使用损失较小的增强数据进行泛化,以防止有用图像信息丢失;
- 应用通道 shuffle(洗牌);
- 根据类别频率进行数据扩充;
- 应用高斯噪声;
- 使用无损排列的三维图像的数据增强;
- 从0到45度随机旋转;
- 以0.8到1.2之间的随机因子改变规模;
- 改变亮度;
- 随机改变色调,饱和度和值;
- 应用D4扩增;
- 对比度受限的自适应直方图均衡化;
- 使用自动扩充策略。
3 模型架构的改进
可用在图像分割上的网络框架有:
- 使用基于 U-net 的架构,采用这些概念并将其应用于三维输入张量;
- 使用自动主动学习和添加手动注释;
- 用 inception-ResNet v2 架构得到具备不同感受野的训练特征;
- 经过对抗训练的 Siamese 网络;
- 以密集(FC)层作为最后一层的 ResNet50、Xception、Inception ResNet v2 x 5;
- 使用全局最大池化层,无论输入尺寸如何,该层都将返回固定长度的输出;
- 使用堆叠的膨胀卷积;
- VoxelNet;
- 用 concat 和 conv1x1 替换 LinkNet 跳跃连接中的加号;
- 广义平均池化;
- Keras NASNetLarge使用224x224x3从头开始训练模型;
- 用 3D 卷积网络在图像上滑动;
- 使用在 Imagenet 数据集上预训练的 ResNet152 作为特征提取器;
- 用dropout替换3个完全连接的层;
- 在解码器中使用ConvTranspose;
- 应用VGG基线架构;
- 实现接受域调整后的C3D网络和一个64单位的瓶颈层在网络的末端;
- 使用带有预先训练过的权值的UNet类型架构,以改善对8位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
- 自定义的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
4 损失函数
损失函数常用来估计模型预测结果与真值之间的差距。选择合适的损失函数,对模型效果很重要。一系列损失函数和使用场景如下:
- dice 系数:能够很好地处理不平衡数据;
- 加权边界损失:减少预测分割与真值之间的距离;
- MultiLabelSoftMarginLoss:基于最大熵优化多标签一对多损失的标准;
- 具备 logit 损失的平衡交叉熵(Balanced cross entropy,BCE):以特定系数权衡正例和负例;
- Lovasz:基于子模损失的凸Lovasz扩展,对神经网络中的平均交点-联合损失进行直接优化;
- FocalLoss + Lovasz:把FocalLoss和Lovasz损失相加得到;
- Arc margin loss:合并边缘,以最大限度地提高表面可分性;
- Npairs loss:计算y_true和y_pred之间的Npairs损失
- BCE and Dice损失函数的结合;
- LSEP:两两排序在任何地方都是平滑的,因此更容易优化;
- Center loss:同时学习每个类的深层特征中心,并惩罚深层特征与其对应的类中心之间的距离;
- Ring Loss:增加标准损失功能,如Softmax;
- Hard triplet loss:训练网络在同一时间内嵌入同一类的特征,最大限度地提高不同类的嵌入距离;
- 1 + BCE – Dice :包括减去BCE和Dice损失,然后加上1;
- Binary cross-entropy – log(dice):二值交叉熵减去Dice损失的对数;
- BCE, dice and focal的组合;
- Lovasz Loss:对平均交点-联合损失进行直接优化;
- BCE + DICE:通过计算平滑的Dice系数函数得到Dice损失;
- Focal loss with Gamma 2:对标准交叉熵准则的改进;
- BCE + DICE + Focal:三个损失函数的总和;
- Active Contour Loss:整合区域和大小信息,并将这些信息整合到一个密集深度学习模型中;
- 1024 * BCE(results, masks) + BCE(cls, cls_target);
- Focal + kappa:Kappa是深度学习中对有序数据进行多类分类的损失函数,把它和Focal损失相加;
- ArcFaceLoss:用于深度人脸识别的附加角边缘损失;
- 只在正样本下训练的Soft Dice:使用预测的概率的Soft Dice;
- 2.7 BCE(pred_mask, gt_mask) + 0.9 DICE(pred_mask, gt_mask) + 0.1 * BCE(pred_empty, gt_empty):Kaggler使用的自定义损失;
- nn.SmoothL1Loss():创建如果绝对元素误差低于1,则使用平方项,否则使用L1项的标准;
- 在使用均方误差目标函数的情况下,它似乎比二值交叉熵目标函数更好。
5 训练技巧
- 尝试不同的学习率;
- 尝试不同批大小;
- 使用带有动量项的SDG,并且手动设置学习率衰减;
- 数据增强过多会降低准确率;
- 使用裁剪后的图像训练,并在完整的图像上做预测;
- 在学习速率调整上使用Keras中的ReduceLROnPlateau()方法;
- 没有增强的训练直到稳定,然后在某些时期应用软增强和硬增强;
- 冻结除了最后一层以外所有的网络层,并使用Stage1中的1000张图片进行模型微调;
- 开发一个能使标签更加均匀的采样器;
- 使用类别感知采样(class aware sampling);
- 在调整最后一层时使用dropout和增强;
- 伪标记提高分数;
- 用Adam优化算法减少稳定期的学习率伴随着2-4的耐心;
- 使用循环学习率和SGD;
- 如果验证损失在两个连续的时期没有改善,则将学习率降低两倍;
- 重复10批中最差的一批;
- 使用默认UNET进行训练;
- 重叠贴图,使每个边缘像素被覆盖两次;
- 超参数调优:训练的学习率,非最大抑制和推理的分数阈值;
- 移除低置信度得分的差边界框;
- 训练不同的卷积神经网络,然后建立一个集成;
- 当F1分数下降时停止训练;
- 逐渐降低不同的学习率;
- 用5折交叉验证和30次重复验证方式训练ANNs;
- 使用Neptune追踪你的实验。
6 集成方法
许多机器学习竞赛(包括 Kaggle)中最优秀的解决方案所采用的集成方法都建立在一个这样的假设上:将多个模型组合在一起通常可以产生更强大的模型。集成方法有:
- 多数投票法
- XGBoost:最大恶性肿瘤在3个缩放等级,z位置和奇怪组织的数量;
- LightGBM:多类别模型,只针对原始数据特性;
- CatBoost:2层模型;
- 梯度增强分类器:用7个特征训练;
- 课程学习:加快模特培训,在这种技术中,模型首先在简单的样本上训练,然后逐步转移到困难的样本上;
- 集成 ResNet50、InceptionV3 和 InceptionResNetV2 的方法;
- 目标检测的集成方法;
- 由Mask RCNN, YOLOv3和具有DenseNet-121分类网络的Faster RCNN架构n组成的集合,
7 模型评估和验证方法的改进
- 类别不统一的阶级划分;
- 在调整模型最后一层时使用交叉验证方法以有效避免过拟合;
- 用于分类的10倍CV集成;
- 5个用于检测的10倍CV集成进行组合;
- Sklearn的分层K折函数
- k折交叉验证;
- 对抗验证和权衡。
8 后处理
- 测试时增强(Test Time Augmentation,TTA):向模型多次展示经过不同随机变换的图像,取预测平均值;
- 均衡使用测试预测概率,而不是仅使用预测类;
- 将几何平均数应用于预测;
- 在推理过程中将图块重叠,使每个边缘像素至少覆盖 3 次,因为 UNET 在边缘区域范围的预测往往较差;
- 非极大抑制和边界框收缩;
- 分水岭后处理:在实例分割问题中分离对象。
9 硬件配置
- AWS GPU,例如p2.xlarge with a NVIDIA K80 GPU
- Pascal Titan-X GPU
- 8 TITAN X GPUs
- 6 GPUs: 21080Ti + 41080
- 8×NVIDIA Tesla P40服务器, 256 GB RAM and 28 CPU cores
- i7 5930k Intel内核, 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
- i7 5930k, 2×1080Intel内核, 64 GB of RAM, 2x512GB SSD, 3TB HDD
980Ti GPU, 2600k CPU, and 14GB RAM
最后
需注意某些技巧可能有一定的适用范围,具体能不能用还要视数据而定。
原文中有各技巧的跳转链接,如果你想深入了解,只需跟随链接,查看最好的图像分割模型是如何建立的。