499. UW-Madison GI Tract Image Segmentation | uw-madison-gi-tract-image-segmentation
我们的 2.5D 解决方案的整体流程分为两个阶段:分类阶段和分割阶段。前者负责确定图像中是否存在目标,后者则对图像中的目标进行分割。通过分析分类阶段的结果来控制图像中的目标分割,分类和分割阶段均采用模型加权融合以增强我们 2.5D 模型的鲁棒性。纯 2.5D 模型在公共排行榜上可以达到 0.889 的分数。
详情如下 ↓
在数据制作方面,我们参考了 @awsaf49 的数据制作方法,将步幅大小设置为 2,总共取三张图像来生成 2.5D 数据。参考链接:https://www.kaggle.com/code/awsaf49/uwmgi-2-5d-stride-2-data
我们尝试了 640*640 和 512*512 的图像调整分辨率。在 640*640 分辨率的情况下,我们在训练期间使用 RandomCrop 方法将目标随机裁剪为 448*448 分辨率。我们还使用了随机翻转、弹性变换、网格畸变和光学畸变,具体参数如下:
dict(type='RandomFlip', direction='horizental', p=0.5)
dict(type='ElasticTransform', alpha=120, sigma=6.0, alpha_affine=3.6, p=1)
dict(type='GridDistortion', p=1)
dict(type='OpticalDistortion', distort_limit=2, shift_limit=0.5, p=1)
在测试时,我们使用水平翻转方法生成新图像,并使用加权融合获得输出掩码。TTA 大约可以将我们的分数提高 0.001 ~ 0.002。
该算法基于 Unet,我们尝试的骨干网络包括 EfficientNet b4 ~ b7。单模型在公共排行榜上可达约 0.883 分,提交时的模型融合可达约 0.889 分。在深度学习框架方面,我们使用了队友 @CarnoZhao 的工作:https://www.kaggle.com/code/carnozhao/uwmgit-mmsegmentation-end-to-end-submission
分类网络使用完整数据进行训练,其中包含空白图片以及带有掩码的图像。分割网络仅负责分割目标图像,且仅在带有掩码的完整数据上进行训练。分类网络使用单一的 BCELoss 进行训练,而分割网络使用 BCE 和 Dice 加权损失函数进行训练,损失函数比例为 1:3。
此外,我们使用 fp16 训练方法使训练更快,并且可以节省约 50% 的 GPU 内存,这使我们能够使用更大的批次大小。
在分析数据时,我发现存在一些不包含有用信息的边缘区域。我尝试使用 CenterCrop 方法去除那些无用的边缘(可能没用,我不确定),分数影响很小。
def CenterCrop(image, crop_ratio=0.9):
'''
input numpy type image
width
h ###################
e # #
i # #
g # #
h # #
t ###################
crop_ratio -> remain ratio
return crop_image, xmin, ymin, xmax, ymax, org_size
'''
height, width, channel = image.shape
xmin, ymin, xmax, ymax = int(width * (1 - crop_ratio) / 2), \
int(height * (1 - crop_ratio) / 2), \
int(width * (1 + crop_ratio) / 2), \
int(height * (1 + crop_ratio) / 2)
crop_image = image[ymin:ymax, xmin:xmax, ...]
extra_info = [height, width, xmin, ymin, xmax, ymax]
return crop_image, extra_info
def PaddingCrop(crop_image, extra_info):
'''
input crop_image -> the centerCrop image
input extra_info -> original image size and Crop size infomation
'''
crop_shape = np.array(crop_image.shape[:2])
height