type
status
date
slug
summary
tags
category
icon
password

皮肤癌检测竞赛:从EDA到深度学习的完整流程

最近参加了ISIC 2024皮肤癌检测挑战赛,这个比赛要求我们通过皮肤镜图像来识别恶性黑色素瘤。说实话,医学图像识别对我来说是个全新的领域,踩了不少坑,也学到了很多东西。今天就来分享一下我的完整解决方案。

数据探索:了解你的"敌人"

拿到数据的第一件事当然是EDA(探索性数据分析)。这个数据集最大的特点就是极度不平衡——恶性样本只占很小一部分。

关键发现

通过可视化分析,我发现了几个有意思的点:
  1. 性别差异明显:男性患者的恶性比例略高于女性
  1. 年龄分布有规律:恶性黑色素瘤患者的年龄分布更偏向于中老年
  1. 解剖部位很重要:不同身体部位的发病率差异很大,躯干部位的样本最多
这个方法帮我快速筛选出了最有价值的特征。比如tbp_lv_deltaLBnorm这个特征与目标变量的相关性就特别高。

多重共线性问题

做相关性热力图时,我发现很多特征之间存在高度相关性。这提醒我在后续建模时需要考虑特征选择或者降维处理。

图像预处理:细节决定成败

医学图像的预处理特别重要,我尝试了多种方法:

1. 色彩空间转换

不同的色彩空间对不同的任务有不同的效果:
  • HSV空间:适合提取颜色特征,对光照变化更鲁棒
  • LUV空间:提供更均匀的颜色感知,适合检测皮肤细微变化
  • 灰度+高斯模糊:简化图像,专注于纹理特征

2. 毛发去除(这个真的很重要!)

皮肤镜图像经常有毛发干扰,我实现了一个基于形态学操作的毛发去除算法:
这个方法效果出奇的好,能有效去除大部分毛发干扰,而不损害病灶特征。

深度学习:预训练模型大法好

数据平衡策略

由于数据极度不平衡,我采用了欠采样策略:
  • 保留所有恶性样本
  • 随机采样3倍数量的良性样本
这个比例是经过多次实验得出的,既保证了一定的平衡性,又不会丢失太多良性样本的多样性。

模型选择与调优

我测试了多个经典的CNN架构:
  1. ResNet50:收敛快,效果稳定
  1. InceptionV3:对多尺度特征敏感,但训练时间长
  1. AlexNet:相对简单,作为baseline不错
  1. VGG19:深度足够,但参数量大
最终ResNet50的表现最均衡。有几个关键的训练技巧:

踩过的坑和经验教训

  1. 数据泄露要小心:在做train/valid/test划分时,一定要用stratify参数保证各个集合的类别分布一致
  1. 图像归一化很重要:使用ImageNet的预训练权重时,记得用相同的归一化参数:
    1. 可视化预测结果:我实现了一个预测可视化函数,能直观看到模型的预测概率分布,这对调试特别有帮助
    1. 数据增强要适度:医学图像不能像普通图像那样随意增强,过度的旋转、翻转可能会破坏重要的医学特征

    下一步计划

    这个项目还有很多可以改进的地方:
    1. 集成学习:结合多个模型的预测结果
    1. 更精细的特征工程:结合表格数据中的临床特征
    1. 尝试更新的架构:比如Vision Transformer
    1. 后处理优化:根据病灶大小、位置等信息调整预测阈值

    总结

    医学图像识别确实是个很有挑战性的领域。数据的特殊性(不平衡、有噪声)、专业知识的要求,都让这个任务变得不简单。但通过合理的数据处理、恰当的模型选择和细致的调优,还是能取得不错的效果。
    最重要的是,这类项目的意义远不止于竞赛本身。如果这些技术能真正应用到临床,帮助医生更早、更准确地发现皮肤癌,那将是对人类健康的巨大贡献。
    代码已经整理好,有兴趣的朋友可以一起交流讨论。记住,在医学AI领域,我们追求的不仅是模型的准确率,更是对每一个生命的责任。

    PS: 这个项目还在持续优化中,如果你有什么好的建议或者发现了代码中的问题,欢迎留言讨论!