资讯动态

基于ISIC数据集的黑色素瘤分类:深度学习毕设完整指南

发布时间:2026/10/19 12:36:02 来源:尧图企业网站定制
每年到毕设选题季总有人问我“想做个深度学习相关的项目数据最好是现成的又不要太卷有什么推荐”。这一题我几乎都会回同一个方向基于ISIC数据集的皮肤病黑色素瘤分类。原因很简单——数据集公开、任务边界清晰、训练成本可控而且医学影像加深度学习的组合天然适合写论文、画可视化、做答辩展示。它不像人脸识别那样被做烂了也不像语义分割那样要折腾一堆标注工具属于那种“认真做能出彩偷懒抄也死不了”的稳妥型选题。下面我把从选题、数据准备、模型训练到答辩避坑的完整思路都捋一遍打算拿这个当毕设的同学可以直接照着走。1. 为什么我推荐把ISIC黑色素瘤分类做成毕设1.1 医学影像与深度学习的天然契合点皮肤镜图像从数据结构上看是张普通RGB图片不需要像CT那样做三维体素重建直接用现成的卷积神经网络就能处理这是它比很多医学影像任务门槛低的关键。但它的临床含义又足够深刻黑色素瘤是恶性程度很高的皮肤肿瘤早期五年生存率能到95%以上晚期却骤降到不到20%所以“AI辅助识别黑色素瘤”天然自带社会价值。拿这个做毕设无论论文引言还是最终答辩你都有充足的动机可以讲不愁没话说。再加上ISIC数据集本身是公开的皮肤镜病灶图像集合图像已经做过匿名脱敏不需要自己跑医院收集数据完全绕开了医疗隐私和伦理审批的大坑对在校生尤其友好。1.2 数据集公开、工作量可控适合毕设节奏毕设最怕两个问题一是数据收集到崩溃二是模型怎么调都不收敛。ISIC避开了第一点下载解压就能用标注基本清晰第二点也不用太担心因为这是标准的图像分类任务各大预训练模型都能直接迁移。以我平时建议的时间分配为例前两到三周做数据清洗、划分和预处理中间五到六周做模型搭建、训练和调参再花三周做错误分析、可视化图表和论文插图最后留四周写论文和做PPT。整个节奏很线性中途就算卡住最多是AUC差一两个点不会出现连数据都拿不到这种死局。对于第一次完整做人工智能项目的同学来说这种“可回退”的感觉非常重要。1.3 可延展的创新方向不止“套个ResNet跑一遍”很多同学担心这个题目被人做烂了其实恰恰相反公开数据意味着你能跟大量基线对比但公开数据也意味着人人都能看到同样的问题。比如类别不平衡——ISIC里良性痣的数量明显多于黑色素瘤怎么设计损失函数让少数类召回率提上去再比如模型可解释性——用Grad-CAM画出模型关注区域分析它到底是在看病灶边缘还是背景纹理还有改进点可以是数据增强策略、模型集成、伪标签半监督等等。这些方向都不需要去额外找数据只需要换一种训练策略或分析视角就能形成论文里的“增量创新”对本科毕设来说是够用的。2. ISIC数据集到底能不能直接用数据构成与任务边界2.1 先认清ISIC官方数据的常见版本ISIC是一个系列数据集常被用的是2016、2017、2018这几届挑战赛数据其中2017版训练集大概有2000张皮肤镜图像类别包括黑色素瘤、良性痣和脂溢性角化病三类。很多毕设会进一步把它简化成二分类只保留黑色素瘤和良性痣两类把脂溢性角化病舍弃。这样处理的好处是任务更纯粹临床中最关键的鉴别就是“这个黑痣是良性还是恶性”二分类的指标解释也直观。如果你想增加一点难度也可以保留三分类跟官方挑战赛的任务设定保持一致但那样就要处理多分类不平衡和类别相似度的复杂问题工作量会明显增加。2.2 二分类和三分类该怎么选我个人的倾向是优先做二分类尤其对本科毕设而言。理论上二分类的混淆矩阵、ROC曲线、AUC这些指标都非常好讲答辩时随便问都能接得住而三分类一旦被追问“为什么第三类样本这么少”“你想没想过多标签关系”就容易卡壳。从实验角度说二分类只用两类数据也减少了训练时间方便快速跑通全流程。等到二分类模型稳定后若还有余力可以再做一个额外实验把三分类情况作为对比或扩展分析放进去这样论文里就有了“主实验 扩展实验”的结构层次更丰富。2.3 数据划分是最容易翻车的环节很多新手一上来就把所有图像随机打乱按比例划出训练集和验证集表面看没问题实际上可能严重“数据泄露”。ISIC数据集的元数据里包含患者编号信息同一个患者的病灶有可能拍了多张不同角度或不同时期的图像。如果这些图像被随机分进训练集和验证集模型在验证时就会“记住”同一个人的背景和纹理特征导致验证指标虚高到离谱。正确做法是必须按患者ID划分先根据元数据把同一个患者的所有图片归入同一子集再去切训练验证测试。我之前帮同学排查过一个AUC高达0.97但换成患者级划分后只剩0.91的案例这个0.06的差距不是模型退步而是之前的结果里混了太多“作弊成分”后面那个数字才是真实水平。3. 落手之前先定好“度量标准”准确率骗人AUC才靠谱3.1 为什么准确率在皮肤癌数据上会失真黑色素瘤分类天生是类别不平衡问题。比如数据集中黑色素瘤可能只占10%如果模型把所有图像都判为良性准确率也会是90%看起来不错但完全没有临床价值。如果只盯着准确率调参你很容易选中一个“全猜良性”的坏模型。所以在医学图像领域通用的评估指标是AUC、F1、敏感性和特异性。简单解释一下敏感性也叫召回率是指所有真正的黑色素瘤样本中有多少被模型识别了出来特异性是指所有良性样本中有多少被正确判断为良性。临床上“漏诊”比“误诊”更危险所以我们通常优先看敏感性再同时关注特异性防止模型为了抓阳性而把所有图片都标成恶性。3.2 建议记录的多维指标组合我建议每个实验结束后至少记录四样东西AUC、F1、敏感性、特异性。AUC反映模型整体排序能力不依赖具体阈值F1是精确率和召回率的调和平均适合不平衡评估敏感性和特异性则对应不同临床场景。画ROC曲线时把AUC标在图上论文里非常直观。对于少数类特别少的场景还可以补充Precision-Recall曲线因为正例极少时PR曲线比ROC曲线更能暴露模型性能差异。报告时不要只写“准确率96%”这种话最好写成“模型在ISIC验证集上取得AUC 0.93敏感性0.86特异性0.89在阈值为0.4时F1为0.68”老师一看就知道你有评估常识。3.3 训练过程中不要只看loss有个高频困惑是训练loss明明降得很低验证集AUC却上不去。这是因为交叉熵loss的最小化方向不完全等价于分类阈值的优化尤其在小数据集上loss在后期容易过拟合到训练集的噪声上。正确做法是每个epoch同时打印训练loss、验证loss、验证AUC三项指标并且优先把验证AUC作为早停依据。如果连续10个epoch验证AUC没有创新高就保存当前最优权重并降低学习率继续训练或者直接停止。调参时也别强迫训练loss降到接近0那样大概率是过拟合真正要看的是验证集指标怎么走。4. 模型选型与迁移学习主干网络对比与踩坑记录4.1 从ResNet起步还是直接上EfficientNet皮肤镜图像分类的主流做法是使用在ImageNet上预训练过的CNN。VGG16太老且参数量大ResNet50是稳妥起点EfficientNet系列则性价比更高。第一次跑通流程我建议用ResNet50因为结构经典、代码实现随处能找到、调试资料多训练速度也适中。等全套流程稳定后再换成EfficientNet-B3或B4通常能在相近训练成本下把AUC提升一到两个点。要注意EfficientNet的输入尺寸和缩放方式B4默认输入可能是224或240显存占用也会变大。如果显存不够优先降低batch size不要直接把图像分辨率改成128否则预训练权重的感受野会被打乱迁移效果反而变差。4.2 迁移学习的具体打开方式不建议从零随机初始化训练。常规做法是加载预训练权重先冻结大部分网络层只训练最后面的全连接分类层这样能快速得到一个勉强可用的基线。但这个基线并不是终点因为皮肤镜图像和ImageNet自然图像的特征分布差异比较大只训练分类头学不到病灶特有的颜色纹理组合。更稳妥的分阶段策略是第一阶段冻结主干5个epoch只训练分类头把学习率设为1e-3级别第二阶段解冻主干最后一小部分大约四分之一规模用1e-5级别的学习率微调整个网络。如果数据只有一两千张不建议解冻过多层否则很容易过拟合验证集AUC先升后降。4.3 输入尺寸、全局池化与分类层设计不同预训练模型对输入尺寸要求不同但多数情况224×224够用。这里有个操作细节很多人直接把原始图像resize成227×227或224×224结果病灶被拉变形比例失真。更推荐的预处理是先将图像短边缩放到目标尺寸再做中心裁剪或随机裁剪保留病灶的相对形状。分类头方面建议把预训练模型的最后一层换成“全局平均池化GAP Dropout 全连接层”的组合。GAP能大幅减少参数数量也能保留空间特征Dropout率可以设0.5数据量小的时候提到0.7。输出层做二分类就输出两个节点接softmax即可。5. 让训练曲线真正收敛的调参细节损失权重、学习率与数据增强5.1 类别不均衡的损失函数写法处理类别不平衡最直接的方式是给交叉熵损失加类别权重。例如统计得到黑色素瘤样本500张良性样本1500张那权重可以设为其他类样本数除以该类的样本数class_counts torch.tensor([1500.0, 500.0]) # [良性, 黑色素瘤] weights class_counts.sum() / (2 * class_counts) weights weights.to(device) criterion nn.CrossEntropyLoss(weightweights)这样少数类的损失贡献会被放大模型就不会一味把样本往多数类推。除了加权交叉熵也可以尝试Focal Loss它对容易分类的样本施加较低权重让模型更关注难分的黑色素瘤。不过Focal Loss有gamma和alpha两个超参数要调初期不必急于引入。对于ISIC这种10%~20%阳性比例的数据集加权交叉熵通常已经足够Focal Loss的收益有限。如果最终还需要提升敏感性可以把分类阈值从0.5降低到0.3这样更多“存疑”图像会被判为黑色素瘤代价是特异性下降这是可以接受的取舍。5.2 学习率调度与优化器选择优化器首选AdamW初始学习率建议为5e-5到1e-4。如果整个网络都从头训练可以用1e-3但迁移学习场景下主干网络用的是预训练权重学习率太大会把已经学好的特征破坏掉。我推荐分不同模块设置不同学习率分类头用1e-4主干解冻部分用1e-5这样既让新学习器快速拟合也避免破坏旧知识。调度器上余弦退火简单好用也可以配合ReduceLROnPlateau在验证指标停滞后把学习率降到原来的十分之一。在小数据集上batch size也很关键。ISIC这种量级16或32都可以如果显存允许尽量选32梯度更稳定。5.3 数据增强要像“皮肤科医生”而不是“图像滤镜”很多同学直接套用CIFAR/ImageNet的增强习惯随机旋转90度、上下翻转、随机裁剪、颜色抖动全都上。这对于皮肤镜图像是危险的。皮肤镜图像里的病灶有特定的方向性特征其实旋转方向本身不该成为分类依据但旋转过大确实会让病灶形态失真更关键的是图像里常有的毛发、反光、血管、标尺、油滴等伪影容易成为模型“捷径特征”。正确思路是模拟临床中可能遇到的变化小角度旋转±10度、水平翻转、轻微缩放裁剪、亮度对比度小幅度扰动。Random Erasing这种随机遮挡对皮肤镜图像尤其有效它强迫模型关注全局病灶结构而不是某一个小亮斑。我见过不少项目去掉Random Erasing后AUC下降2-3个点的例子强烈建议把它加进训练流。6. 模型检视混淆矩阵和Grad-CAM能告诉你的三件事6.1 混淆矩阵漏诊是第一禁忌训练好后不要只汇报AUC还要画出验证集或测试集的混淆矩阵。以二分类为例四个格子分别是真良性、假恶性、真恶性、假良性。临床上最怕的是假良性也就是真黑色素瘤被模型漏掉了这在混淆矩阵里是左下角或右下角必须重点盯。如果混淆矩阵出现敏感性偏低说明模型过于保守需要降低判断阈值或加强少数类训练。如果特异性偏低说明模型把大量良性误判为恶性虽然后果不如漏诊严重但也会造成不必要的活检负担。建议输出百分比格式并标注每个类别的样本数答辩时直接放大展示。6.2 Grad-CAM可视化模型关注的是病灶本身还是背景伪影Grad-CAM是检验模型“到底在看什么”的利器。它把最后一层特征图的梯度加权求和叠回到原图上形成热力图回答“模型的决策依据是哪块区域”。实际操作时选择几个典型的真阳性和假阳性样本分别生成热力图。一个经常出现的问题模型预测黑色素瘤时热力图高亮区域却落在图片角落的标尺、背景皮肤纹理甚至污渍上说明模型学到了数据集的伪影而不是临床特征。遇到这种情况回到数据预处理环节把标尺区域裁剪掉或对这类伪影做随机擦除再重新训练。Grad-CAM不只是论文里的插图更是诊断模型偏见的手段这个认知能让你的答辩分析部分很有深度。6.3 和公开基线横向对比的技巧ISIC官方挑战赛每年都有排行榜很多论文公开了在ISIC测试集上的AUC和敏感性结果。对比时需要注意两个陷阱一是保证数据集划分一致二是保证评估指标口径一致。如果你用自己划分的验证集跟官方测试集对比数字没有可比性。更稳妥的做法是下载官方训练集和验证集先跑一个最朴素的ResNet作为自建baseline记录其AUC、F1、敏感性、特异性然后在此基础上加迁移学习、数据增强、损失函数改进形成“baseline vs 改进方案”的纵向对比最后引用公开SOTA结果作为外部参照。这样论文的曲线既有“自己的上升弧线”又有“和顶会的差距参考”逻辑非常完整。7. 从“跑通”到“答辩”毕设最容易扣分的坑和补救清单7.1 实验记录习惯决定答辩底气我见过不少同学跑完模型只留下一张训练曲线截图老师问“优化器是什么”“学习率多少”“训练了几个epoch”时支支吾吾。最好的办法是从第一天就建一个实验记录表至少包括数据集划分方式、预训练权重来源、输入分辨率、batch size、优化器、初始学习率、学习率调度、数据增强配置、最终AUC、F1、敏感性、特异性。每次实验追加一行最后整理成论文附录。这个表不仅是你的工作量证明还能帮你快速复盘哪些修改真正起了作用。答辩时拿出这个表告诉老师“我总共做了27组实验最终的方案是在第18组基础上……”说服力非常强。7.2 数据集划分泄露最隐蔽的扣分点按患者ID划分这个点我前面已经说过但这里要再强调一次因为它是所有新手最容易踩的坑。如果你不小心用了随机划分验证集AUC可能虚高答辩时一旦老师追问“你的训练集和验证集里面有没有同一个患者的图像”你可能答不上来。所以在实验设置部分一定要写清楚基于患者ID去重划分保证同患者所有图像处于同一子集。哪怕重新划分后AUC降低了这个“降低”反而是可信的技术上绝对是加分项。也不要试图用随机划分跑出高AUC来糊弄答辩这类数据泄露问题在提问环节几乎是必考题。7.3 别忽略可复现性固定种子、保存配置、写README可复现性是深度学习项目的生命线。代码里要固定随机种子Python、NumPy、PyTorch分别固定数据加载的shuffle随机种子也固定。保存配置文件config.py或yaml每次实验都记录下当前配置并在保存模型权重时同步保存一份配置快照。最好把每个epoch的权重都存一份至少保留最优权重和最后一个epoch权重方便中途断点恢复。最后写一个详细的README注明数据集版本、预训练权重下载地址、运行顺序、依赖环境版本、GPU型号和显存大小。具备这些答辩时如果老师现场要求“把你的代码跑一遍”你不会手忙脚乱。最后再说一点实在的用ISIC做毕设最大的收获往往不是AUC涨了几个点而是你完整走了一遍“数据清洗—实验设计—模型训练—错误分析—结论主张”的闭环。表面上看这是个分类任务实际上你练的是如何把抽象问题拆成可验证的实验再用证据说服别人。这个题目给了一个非常合适的起点剩下的高度取决于你愿意把每个环节琢磨得多细。祝你顺利把这个项目做扎实答辩的时候底气十足。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑