返回列表

4th Place Solution

623. ISIC 2024 - Skin Cancer Detection with 3D-TBP | isic-2024-challenge

开始: 2024-06-27 结束: 2024-09-06 医学影像分析 数据算法赛
第四名解决方案 - ISIC 2024

第四名解决方案

作者: DungNB (Grandmaster)
发布时间: 2024-09-08
比赛: ISIC 2024 Challenge

祝贺所有获奖者!感谢 Kaggle 和 ISIC 组织这次比赛并向我们介绍了这个有趣的问题。距离我上次回到 Kaggle 已经有一年多了,我很高兴能赢得这次比赛。
特别感谢 @greysky 提供了 惊人的表格 notebook,我在解决方案中使用了你的特征。

代码

如果觉得有用请给我点个星!😀 https://github.com/dungnb1333/ISIC-2024

推理 Kernel

我的解决方案如下所述

图像处理流程

数据集

  • Isic 2024 (来自本次挑战)
  • Isic 2019: 链接
  • Isic 2020: 链接
  • Isic 2018 (用于分割任务): 链接
  • PAD UFES 20: 链接 (感谢 @hengck23)

多标签分类

我觉得更细粒度的类别会创建更好的特征表示,有助于提高性能。我使用了 5 个类别目标 (MEL, BCC, SCC, NV) 进行训练,并使用目标类别的 sigmoid 概率进行预测。为了将 ISIC 2019, 2020, 2024 和 PAD UFES 标签映射到上述 5 个类别,我使用了以下规则:

2019 MEL, BCC, SCC, NV -> MEL, BCC, SCC, NV
2020 melanoma -> MEL
2020 nevus -> NV
PAD UFES 20 MEL, BCC, SCC, NEV -> MEL, BCC, SCC, NV
2024 Basal cell carcinoma in iddx_full metadata -> BCC
2024 Melanoma in iddx_full metadata -> MEL
2024 Squamous cell carcinoma in iddx_full metadata -> SCC
2024 Nevus in iddx_full metadata -> NV

如果其中一个类别 (MEL, BCC, SCC) 为 1,则 Target 设为 1。

模型

角逐第四名排行榜奖项

  • 4 个多标签分类模型 (5 类),使用 ISIC 2024+2020+2019 + PAD UFES 训练,使用 ISIC 2024 验证
    • swin_tiny 图像大小 = 224: OOF 分数 = 0.1609
    • convnextv2_base 图像大小 = 128: OOF 分数 = 0.1641
    • convnextv2_large 图像大小 = 64: OOF 分数 = 0.1642
    • coatnet_rmlp_1 图像大小 = 224: OOF 分数 = 0.161
  • 3 个多任务分割 + 分类模型,使用 ISIC 2024+2020+2019 + PAD UFES 训练,使用 ISIC 2024 验证。对于提交,我只使用了分类任务的预测
    • efficientnet-b3 Unet 图像大小 = 224: OOF 分数 = 0.1638
    • mit-b0 FPN 图像大小 = 384: OOF 分数 = 0.1671
    • mit-b5 FPN 图像大小 = 224: OOF 分数 = 0.1656
  • 为了创建分割任务的掩码,我使用 ISIC 2018 数据训练了 3 个模型,并对 ISIC 2024+2020+2019 + PAD UFES 进行预测
    • efficientnet-b7 Unet++ 图像大小 = 256: IoU = 0.829
    • efficientnet-b5 Unet++ 图像大小 = 512: IoU = 0.827
    • mit-b5 FPN 图像大小 = 512: IoU = 0.843
  • 3 个多标签分类模型 (5 类),仅使用 ISIC 2024 数据训练
    • vit_tiny 图像大小 = 384: OOF 分数 = 0.1688
    • swin_tiny 图像大小 = 256: OOF 分数 = 0.1655
    • convnextv2_tiny 图像大小 = 288: OOF 分数 = 0.1645
  • 集成 10 个模型:OOF 分数 = 0.17458

角逐前 15 名检索灵敏度奖项

  • 1 个多标签分类模型 (5 类),使用 ISIC 2024+2020+2019 + PAD UFES 训练,使用 ISIC 2024 验证
    • vit_tiny 图像大小 = 224: OOF 分数 = 0.16040
  • 1 个多任务分割 + 分类模型,使用 ISIC 2024+2020+2019 + PAD UFES 训练
    • mit-b0 FPN 图像大小 = 224: OOF 分数 = 0.1660

图像增强

transform_train = albu.Compose([
    albu.Resize(self.image_size, self.image_size),
    albu.ImageCompression(quality_lower=80, quality_upper=100, p=0.25),
    albu.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.1, rotate_limit=15, border_mode=0, p=0.5),
    albu.Flip(p=0.5),
    albu.RandomRotate90(p=0.5),
    albu.OneOf([
        albu.MotionBlur(blur_limit=5),
        albu.MedianBlur(blur_limit=5),
        albu.GaussianBlur(blur_limit=5),
        albu.GaussNoise(var_limit=(5.0, 30.0)),
    ], p=0.5),
    albu.RandomBrightnessContrast(p=0.5),
    albu.CoarseDropout(num_holes_range=(1,1), hole_height_range=(8, 32), hole_width_range=(8, 32), p=0.25),
    albu.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
    ToTensorV2(),
])
transform_val = albu.Compose([
    albu.Resize(self.image_size, self.image_size),
    albu.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
    ToTensorV2(),
])

指数移动平均 (EMA):

对于提交,我使用 ema checkpoint (使用完整数据训练 - 无验证集) 在第 8->15 个 epoch,无 TTA。

表格数据处理流程

我使用了 3 个模型:LightGBM, CatBoost, XGBoost。我结合了来自图像 pipeline 的 10 个特征和来自 惊人的表格 notebook 的所有特征。再次感谢 @greysky!

  • 参数:
lgbm_params = {
    'objective':        'binary',
    'verbosity':        -1,
    'n_estimators':     300,
    'early_stopping_rounds': 50,
    'metric': 'custom',
    'boosting_type':    'gbdt',
    'lambda_l1':        0.08758718919397321, 
    'lambda_l2':        0.0039689175176025465, 
    'learning_rate':    0.03231007103195577, 
    'max_depth':        4, 
    'num_leaves':       128, 
    'colsample_bytree': 0.8329551585827726, 
    'colsample_bynode': 0.4025961355653304, 
    'bagging_fraction': 0.7738954452473223, 
    'bagging_freq':     4, 
    'min_data_in_leaf': 85, 
    'scale_pos_weight': 2.7984184778875543,
    "device": "gpu"
}
cb_params = {
    'loss_function':     'Logloss',
    'iterations':        300,
    'early_stopping_rounds': 50,
    'verbose':           False,
    'max_depth':         7, 
    'learning_rate':     0.06936242010150652, 
    'scale_pos_weight':  2.6149345838209532, 
    'l2_leaf_reg':       6.216113851699493,
    'min_data_in_leaf':  24,
    'cat_features':      cat_cols,
    "task_type": "CPU",
}
xgb_params = {
    'enable_categorical':       True,
    'tree_method':              'hist',
    'disable_default_eval_metric': 1,
    'n_estimators':             300,
    'early_stopping_rounds':    50,
    'learning_rate':            0.08501257473292347, 
    'lambda':                   8.879624125465703, 
    'alpha':                    0.6779926606782505, 
    'max_depth':                6, 
    'subsample':                0.6012681388711075, 
    'colsample_bytree':         0.8437772277074493, 
    'colsample_bylevel':        0.5476090898823716, 
    'colsample_bynode':         0.9928601203635129, 
    'scale_pos_weight':         3.29440313334688,
    "device":                   "cuda",
}
特征 LGB pAUC CB pAUC XGB pAUC Gmean pAUC
元数据特征 0.17806 0.17498 0.17954 0.17879
10 模型特征 0.18650 0.18669 0.18647 0.18703
2 模型特征 0.18406 0.18378 0.18328 0.18438
  • 对于每个模型,我尝试了 40 种不同的种子组合,并混合了 CV 分数最高的前 5 个 checkpoint 进行提交

最终提交

提交描述 公共 LB 私有 LB 奖项
Sub1-GPU: 0.2*(仅元数据) + 0.8*(10 模型特征) 0.18229 0.17225 第四名排行榜奖项
Sub2-CPU: 0.2*(仅元数据) + 0.8*(2 模型特征) 0.18094 0.17011 前 15 名检索灵敏度奖项

那是我的总结。我有一个通过更改图像模型选择达到私有 LB = 0.1732 (第 1 名) 的提交,但那不是我的最佳 CV 分数。

同比赛其他方案