语义分割性能提升方案


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

最后

需注意某些技巧可能有一定的适用范围,具体能不能用还要视数据而定。

译自:https://neptune.ai/blog/image-segmentation-tips-and-tricks-from-kaggle-competitions?utm_source=reddit&utm_medium=post&utm_campaign=blog-image-segmentation-tips-and-tricks-from-kaggle-competitions

原文中有各技巧的跳转链接,如果你想深入了解,只需跟随链接,查看最好的图像分割模型是如何建立的。


文章作者: BoBoRing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BoBoRing !
评论
  目录