简介皮肤烧伤检测项目是一份面向医学影像与深度学习交叉领域的实战资源适合算法工程师、医疗AI研究者及有Python基础的初学者目标解决烧伤范围、深度和愈合阶段的自动识别问题。压缩包共168个文件、41.69MB主要包含43份Python源码、38份YAML配置、16份Jupyter Notebook、13张JPEG与11张PNG图像另有CSV结果、Docker部署文件与Markdown文档涵盖数据处理、模型设计、训练、验证到部署。源码实现卷积神经网络CNN的特征提取与分类Notebook可分步复现YAML用于调参CSV记录准确率、精确率等指标。已有105人学习适合从零搭建检测模型的读者可作为毕业设计或工程项目参考获取可运行代码与配套教程减少踩坑成本。1. 皮肤烧伤检测为什么值得做一个图像分类问题背后的临床刚需皮肤烧伤检测这个标题看着像教学项目背后对应的其实是一个非常硬的临床场景急诊医生在分诊时必须快速判断烧伤深度——一度、浅二度、深二度还是三度这个判断直接决定补液方案、是否手术清创、要不要转烧伤专科。而现实是这种判断高度依赖医生经验不同年资的医生看同一张照片结论经常不一致。基于深度学习的皮肤烧伤检测算法本质就是把这个主观判断变成可重复的图像分类或分割任务用卷积神经网络吃皮肤颜色、纹理、水疱形态和焦痂特征输出一个客观的烧伤深度概率分布。这个方向适合三类人刚入门医疗影像的算法工程师想找一个数据量不大、能完整走通全流程的项目练手医疗AI创业团队评估产品可行性做智能分诊系统的人想把烧伤这个科室的决策链条自动化。它不算前沿但胜在链路完整、临床价值清楚是一个典型的用项目源码把论文变成工程的实战选题。2. 拿到烧伤检测项目源码后先做的事数据整理、预处理与训练集划分2.1 烧伤检测数据集长什么样公开来源与类别构成烧伤检测数据集和常规ImageNet分类数据有一个明显差异图像数量少、类别极不均衡、拍摄条件混乱。公开能拿到的烧伤图像数据集常见的有BISABurn Image Segmentation Archive里的烧伤语义分割标注图以及Kaggle上不定期出现的烧伤分类挑战赛数据。这些数据的共同特点是每张图包含真实患者创面照片分辨率从几百像素的手机图到专业相机的几千万像素都有光照条件覆盖急诊室白光、手术室无影灯、救护车闪光灯甚至户外自然光。类别构成上多数分类任务把烧伤深度分成三到五类正常皮肤、一度烧伤表皮层、二度烧伤真皮浅层/深层有时分开算、三度烧伤全层皮肤坏死。有的数据集还会加一个非烧伤损伤类别比如擦伤、化学灼伤、电击伤用来降低模型在真实场景的假阳性。类间差距有时候非常小——浅二度和深二度的颜色差异可能只是一个色调的偏移这对模型的特征提取能力提出很高要求也给后面要讲的数据增强和损失函数设计埋下伏笔。2.2 预处理代码归一化、尺寸统一与BGR/RGB陷阱烧伤检测项目源码里第一个让你翻车的往往是颜色通道。医生读图用肉眼怎么显示无所谓但模型用的是PyTorch的预训练权重这批权重是按RGB顺序、ImageNet的均值和标准差归一化训练出来的。而OpenCV读进来的是BGR直接扔给模型颜色特征全乱训练出来的模型在验证集上表现正常一换推理环境就崩。这一步是预处理三件套里最基础也最容易错的地方。import cv2 import torch from torchvision import transforms # 标准预处理管线训练和推理必须保持一致 preprocess transforms.Compose([ transforms.ToPILImage(), # 从numpy/OpenCV格式转成PIL transforms.Resize((224, 224)), # 统一输入尺寸ResNet系列默认224 transforms.ToTensor(), # HWC - CHW像素值缩放到[0,1] transforms.Normalize( # 用ImageNet统计量归一化 mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ) ]) def load_burn_image(path): img cv2.imread(path) # OpenCV读入此时是BGR顺序 img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 关键一步BGR转RGB return preprocess(img_rgb)这段代码的逻辑很直白cv2.imread读出来是BGR转成RGB后做Resize和Tensor化最后用ImageNet的mean/std做归一化。参数上需要关注的是Resize的尺寸——如果你换用EfficientNet-B0它默认输入是224换用EfficientNet-B4就是380这个数字必须和模型匹配否则后续全连接层的维度对不上。归一化的mean/std数值是ImageNet的统计量不要自己重算数据集均值除非你的训练数据和ImageNet分布差距极大烧伤图像本身就是红色系为主沿用ImageNet参数不会有问题。2.3 数据增强让模型不被肤色和光照骗走烧伤检测最大的工程陷阱是模型学到了肤色没学到烧伤。如果训练集里浅肤色人群照片偏多模型很可能会把浅色皮肤当作正常把深色皮肤直接判定为烧伤。这是数据偏置问题不是模型问题。缓解手段除了收集多样化的数据就是在增强阶段做颜色扰动让模型没法依赖绝对颜色值做判断。from torchvision import transforms train_transform transforms.Compose([ transforms.Resize((256, 256)), transforms.RandomCrop((224, 224)), # 随机裁剪增强平移鲁棒性 transforms.RandomHorizontalFlip(p0.5), # 水平翻转烧伤图像左右对称 transforms.RandomRotation(degrees15), # 小角度旋转避免旋转过度失真 transforms.ColorJitter( brightness0.3, # 光照变化 contrast0.3, # 对比度变化 saturation0.2, # 饱和度变化 hue0.05 # 色相小范围扰动 ), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])注意这里Resize(256)之后再做RandomCrop(224)是比直接Resize(224)更稳的做法它相当于在每次迭代里给图像引入一个随机的平移扰动能明显提升模型对创面位置的鲁棒性。ColorJitter的参数不是随便拍的亮度扰动0.3已经算激进急诊室照片确实存在大逆光hue只给0.05因为烧伤诊断本身高度依赖色调色相扰动太大会把二度和三度烧伤的特征抹掉。这个度和临床约束之间的平衡是整个增强策略里最微妙的部分。2.4 训练集/验证集/测试集划分按患者分而不是按图分很多人在烧伤检测项目上遇到验证集准确率0.97上线后一塌糊涂原因不在模型而在数据划分方式错了。同一个患者的多张创面照片——正面一张、侧面一张、清创前一张、清创后一张——如果全部随机打乱后按比例划分同一个人的不同照片会同时出现在训练集和验证集里。模型相当于开卷考试它在训练时见过同一个患者几乎一样的组织颜色和纹理验证时只是换了个角度分数当然虚高。import pandas as pd from sklearn.model_selection import GroupShuffleSplit # df 必须包含列: image_path, label, patient_id df pd.read_csv(burn_metadata.csv) gss GroupShuffleSplit(n_splits1, train_size0.7, random_state42) train_idx, val_idx next(gss.split(df, groupsdf[patient_id])) train_df df.iloc[train_idx] val_df df.iloc[val_idx] # 项目源码里如果是随机split这里改成按患者分组 train_df.to_csv(train_split.csv, indexFalse) val_df.to_csv(val_split.csv, indexFalse)这段代码的核心是GroupShuffleSplit——它按照patient_id分组保证同一个患者的照片全部落在训练集或全部落在验证集不会出现跨集泄漏。random_state42固定下来确保多次实验可以横向对比。很多优质项目实战源码包里默认用的是随机划分拿到手第一件事就要改成按患者划分否则后面所有评估指标都不可信。测试集应该单独留出最好是从不同医院或不同时间段收集的数据模拟真实的数据漂移场景。3. 选什么模型、怎么训练迁移学习、损失函数与训练循环3.1 模型选型ResNet50、EfficientNet还是MobileNet烧伤检测这个任务的特点是数据量小、类别差异微妙、推理设备不确定。基于深度学习的算法项目里选主干网络不是越新越好而是要在参数量、预训练权重的泛化能力和推理速度之间取平衡。我的经验是三选一模型输入尺寸参数量适合场景选择理由ResNet5022425.6M服务端推理预训练权重最丰富微调稳定新手首选EfficientNet-B330012M精度优先同样精度下参数量只有ResNet一半训练收敛更快MobileNetV3-Large2245.4M边缘设备/移动端推理速度快适合后续做床旁分诊App从源码包的完整性和坑的数量来说ResNet系列是首选。一方面PyTorch官方权重质量好另一方面网上能查到的踩坑记录最多出了问题容易定位。EfficientNet在理论上精度更高但它对输入尺寸、缩放系数更敏感训练时容易因为学习率略大就发散。MobileNetV3留给做产品部署时再换不建议从零开始训练。import torchvision.models as models def build_model(num_classes4, backboneresnet50, pretrainedTrue): if backbone resnet50: model models.resnet50(weightsmodels.ResNet50_Weights.IMAGENET1K_V2) in_features model.fc.in_features model.fc torch.nn.Linear(in_features, num_classes) elif backbone efficientnet_b3: model models.efficientnet_b3(weightsmodels.EfficientNet_B3_Weights.IMAGENET1K_V1) in_features model.classifier[1].in_features model.classifier[1] torch.nn.Linear(in_features, num_classes) elif backbone mobilenet_v3_large: model models.mobilenet_v3_large(weightsmodels.MobileNet_V3_Large_Weights.IMAGENET1K_V1) in_features model.classifier[3].in_features model.classifier[3] torch.nn.Linear(in_features, num_classes) return model分类头替换的逻辑很清楚把预训练模型最后一层全连接ResNet是fcEfficientNet和MobileNet嵌在classifier里换成输出维度等于烧伤类别数的线性层前面的特征提取层全部保留。这里有个容易忽略的细节models.ResNet50_Weights.IMAGENET1K_V2比V1训练得更充分Top-1准确率大约高1%在烧伤这个细粒度分类任务上这点优势会直接体现出来。别用默认的pretrainedTrue老接口新版PyTorch已经推荐weights参数。3.2 损失函数CrossEntropy打底Focal Loss治样本不平衡烧伤数据集的类别分布几乎一定是不均衡的正常皮肤照片占一半以上一度烧伤可能只占5%。用普通CrossEntropy模型会倾向把所有样本判成多数类在测试集上还能拿高准确率但对真正需要识别的少数类毫无价值。两种做法可以叠加第一给损失函数加类别权重让少数类的梯度贡献更大第二换Focal Loss它通过调制因子降低易分类样本的权重让模型把注意力放在难样本上。临床场景下难样本恰恰就是浅二度和深二度这种肉眼都容易混淆的类别。import torch.nn as nn import torch.nn.functional as F class FocalLoss(nn.Module): def __init__(self, alphaNone, gamma2.0): super().__init__() # alpha 是类别权重向量长度等于类别数 self.alpha alpha self.gamma gamma def forward(self, logits, targets): ce_loss F.cross_entropy(logits, targets, reductionnone) pt torch.exp(-ce_loss) # pt 是模型对正确类别的置信度 focal_loss (1 - pt) ** self.gamma * ce_loss if self.alpha is not None: alpha_weight self.alpha[targets] focal_loss alpha_weight * focal_loss return focal_loss.mean() # 使用示例假设4个类别按样本数反比计算权重 alpha torch.tensor([0.5, 1.0, 2.0, 3.0]) # 正常/一度/二度/三度 criterion FocalLoss(alphaalpha, gamma2.0)Focal Loss里gamma2.0是论文验证过的默认值含义是当模型对某个样本的置信度达到0.9时损失会被压低到原来的(1-0.9)^2 0.01倍相当于这个样本基本不参与梯度更新而置信度只有0.5的困难样本损失只缩到0.25倍仍然贡献主要梯度。如果你发现模型训练初期损失下降特别快、但验证集上少数类F1上不去通常就是gamma太大把有用样本也压制了改成1.5试试。alpha的设定不必太精细按各类样本占比的倒数归一化就够用。3.3 训练循环迁移学习的三段式训练烧伤检测的训练策略我一般拆成三个阶段冻结backbone训练分类头、解冻全部层微调、低学习率收尾。第一阶段让新初始化的分类头先适应烧伤特征——否则训练一开始backbone的梯度就被分类头的大梯度干扰容易把预训练权重毁掉第二阶段让整个网络在烧伤数据上做全局调整第三阶段用余弦退火把学习率降到极低细粒度收敛。import torch from torch.optim import AdamW from torch.optim.lr_scheduler import CosineAnnealingLR def train_stage(model, train_loader, val_loader, stage, epochs, lr): # stage 1: 冻结backbone只训练分类头 # stage 2: 解冻全部层 # stage 3: 低学习率微调 if stage 1: for name, param in model.named_parameters(): if fc not in name and classifier not in name: param.requires_grad False else: for param in model.parameters(): param.requires_grad True optimizer AdamW( filter(lambda p: p.requires_grad, model.parameters()), lrlr, weight_decay1e-4 ) scheduler CosineAnnealingLR(optimizer, T_maxepochs, eta_minlr * 0.01) for epoch in range(epochs): model.train() running_loss 0.0 for images, labels in train_loader: images, labels images.cuda(), labels.cuda() optimizer.zero_grad() logits model(images) loss criterion(logits, labels) loss.backward() optimizer.step() running_loss loss.item() * images.size(0) # 每个epoch结束后跑一次验证 model.eval() correct 0 total 0 with torch.no_grad(): for images, labels in val_loader: images, labels images.cuda(), labels.cuda() logits model(images) _, preds torch.max(logits, 1) total labels.size(0) correct (preds labels).sum().item() val_acc correct / total print(fStage {stage} Epoch {epoch 1}/{epochs} fLoss {running_loss / len(train_loader.dataset):.4f} fVal Acc {val_acc:.4f}) scheduler.step()参数搭配上三个阶段的典型值是stage 1用lr1e-3跑5个epochstage 2用lr1e-4跑15个epochstage 3用lr1e-5跑10个epoch。AdamW的weight_decay1e-4是图像分类任务的标准值太大会让微调阶段特征退化太小则起不到约束作用。CosineAnnealingLR的T_max必须等于epochs让学习率在周期内从lr平滑降到lr*0.01——注意如果你手动在每个epoch调用scheduler.step()但T_max设的和实际epoch数不一致学习率曲线就会走形。这是源码包流程教程部分最容易忽略的参数玄学。4. 烧伤检测训练避坑指南5个让模型翻车的经典问题4.1 类别不平衡导致模型只会说正常现象训练过程loss下降很快训练集准确率冲到0.95以上但看验证集的混淆矩阵发现所有烧伤类别全部被预测为正常皮肤模型实际上变成了全部判正常的恒等器。原因数据集里正常皮肤照片占比超过70%普通CrossEntropy下模型发现把所有样本判成正常就能拿到0.7的准确率梯度方向被多数类接管。Focal Loss没调对时也会遇到这个问题——gamma太高把少数类样本的损失也压没了。解决立即检查每个batch里类别出现频率打印混淆矩阵而不是只盯着准确率。把损失函数换成带alpha权重的版本alpha值按类别样本占比的反比设正常皮肤给0.3、一度烧伤给1.5、深二度和三度给2.5。如果Focal Loss在验证集上依然不敏感就退回加权的CrossEntropy权重别超过3太大会导致少数类过拟合甚至训练震荡。4.2 模型记住了肤色而不是烧伤现象训练集和验证集上准确率都很好但拿到一张肤色完全没见过的患者照片比如训练集里几乎没有深肤色样本模型直接判错。把图像调暗或调亮预测结果就翻转。原因烧伤数据集的拍摄条件太集中光源、白平衡、患者肤色都成了捷径特征。CNN在训练时发现肤色和标签的相关性比烧伤纹理更强就去学肤色了。这是医疗图像项目里最常见的偏置问题比过拟合更隐蔽。解决做一次颜色崩溃实验——把验证集图像全部转为灰度图后再预测如果模型准确率没有大幅下降说明它根本没在学颜色特征。数据增强里把ColorJitter的brightness和contrast调大同时引入RandomGrayscale(p0.1)。如果项目允许尽量去医院拿真实的、不同光线下的拍照素材做增量训练增强只能缓解偏置不能消除偏置。4.3 小数据集上微调过度验证集过拟合现象训练loss持续下降验证loss先降后升验证集准确率在某个epoch后开始波动下降。这是典型的训练集越学越好泛化越来越差。原因烧伤数据集可能只有几百张图而ResNet50的backbone有2500万参数。解冻全部层后模型有足够能力直接背下训练集的所有图像而不是学习烧伤深度的泛化规律。很多项目源码里的训练epoch数设得偏大以为和ImageNet一样训练200个epoch没问题。解决微调阶段的epoch数控制在25以内早停法Early Stopping必须开。具体做法是监控验证集的F1值而不是loss连续5个epoch不提升就保存当前最好权重并停止。另外解冻全部层后backbone的学习率应该比分类头小10倍通过参数分组实现——否则backbone的预训练特征会被迅速覆盖训练集表现很好测试集一塌糊涂。4.4 推理时少做了一步预处理部署效果全崩现象训练时模型验证准确率0.92导出权重后写推理脚本测试几张新图预测结果几乎全错置信度还特别高。反复核对模型权重没有加载错问题是出在数据上。原因推理脚本里用cv2.imread加载图像后没有做BGR转RGB或者忘了Normalize。更隐蔽的是训练时用Resize((224,224))推理时换了Resize的实现方式——比如用了cv2.resize默认插值算法是双线性而PyTorch的Resize默认也是双线性这通常没问题但如果你开了antialiasTrue或改了插值方式输入分布就会偏移。解决把训练和推理的预处理封装成同一个函数在训练脚本和推理脚本里都import这个函数杜绝两处代码不一致。导出模型之前用torchvision的transforms处理一张图和用推理脚本处理同一张图逐像素比对输出张量理论上差值应该为0。这步比对虽然简单但能拦住九成的训练好好的一部署就翻车血泪案例。4.5 标注人员的标签漂移现象模型训练稳定但每次重新标注一批新数据加入训练后之前调好的模型性能反而下降。检查早先在验证集上预测错的样本发现有不少是标注者自己标错了。原因烧伤深度判断本身存在主观性一个资浅医生标的三度资深医生可能认为是深二度不同医院对浅二度偏深这种边界情况的判法也不一样。标签噪声在细粒度医疗图像分类里是常态模型会去拟合这些噪声表现为训练集准确率特别高、验证集永远差一口气。解决训练前先做一次标注一致性检查——随机抽30张图让两位标注者独立标计算Cohens Kappa系数低于0.8就要统一标注规范。训练过程中把模型预测置信度高但和标注不符的样本挑出来人工复审这类样本往往是标注错误。项目源码里通常没有这个环节需要自己补上。还有一个实用技巧如果标注矛盾集中在某两个类别之间可以考虑把这两个类合并比如浅二度和深二度合并为二度烧伤模型准确率会明显上升临床上也站得住脚。5. 从训练到落地评估指标、推理脚本与模型导出5.1 评估指标烧伤检测不能只看准确率烧伤检测的评估逻辑和普通分类不同三度烧伤漏诊的后果是患者失去最佳手术窗口而一度误判为三度最多是过度检查。所以指标排序应该是敏感度召回率优先特异度次之准确率仅供参考。F1值是敏感度和精确度的调和平均适合衡量整体效果对医疗场景我更建议直接看每一类的召回率尤其是深二度和三度这两类漏诊率必须压到最低。项目源码里如果只用accuracy做评估需要自己扩展评估脚本。计算每一类的精确率、召回率、F1还要画混淆矩阵——混淆矩阵比任何单一指标都能说明问题它能清楚看到哪些类别互相混淆如果模型频繁把浅二度判成深二度那是特征学习不足如果把正常皮肤判成一度烧伤那是偏置方向错误。from sklearn.metrics import classification_report, confusion_matrix, cohen_kappa_score import numpy as np # val_preds: 模型在验证集上的预测类别val_labels: 真实类别 # 类别顺序: 0正常, 1一度, 2浅二度, 3深二度, 4三度 report classification_report( val_labels, val_preds, target_names[正常, 一度, 浅二度, 深二度, 三度], digits3 ) print(report) cm confusion_matrix(val_labels, val_preds) print(混淆矩阵:\n, cm) kappa cohen_kappa_score(val_labels, val_preds, weightsquadratic) print(f加权的Cohens Kappa: {kappa:.3f})classification_report会输出每个类别的precision、recall、F1。重点看深二度和三度的recall如果低于0.85说明还有不少高危患者会被漏掉。cohen_kappa_score加了weightsquadratic它惩罚大误差比小误差更狠——把三度判成正常比把一度判成浅二度严重得多二次加权正好反映这个临床逻辑。这个指标比准确率更能体现模型的实际应用价值。5.2 推理脚本加载模型、预处理、输出置信度推理脚本是整个项目源码里被复用得最多的部分它不只是加载模型跑一下而是要能在真实场景里稳定输出可解释的结果。实际使用中用户拍一张创面照片进来系统要返回判断结果、置信度和提示语——置信度低于阈值时应该提示请专科医生复审而不是硬给一个结论。import torch import torch.nn.functional as F def predict_burn(model, image_tensor, threshold0.6): 输入已经过预处理的图像张量返回预测类别和置信度 model.eval() with torch.no_grad(): logits model(image_tensor.unsqueeze(0)) # 加batch维度 probs F.softmax(logits, dim1) confidence, pred torch.max(probs, dim1) confidence confidence.item() labels [正常, 一度烧伤, 浅二度烧伤, 深二度烧伤, 三度烧伤] label_idx pred.item() if confidence threshold: return { result: 无法判断建议人工复审, label_idx: label_idx, confidence: confidence, advice: 图像质量差或特征不明显请专科医生查看原图 } return { result: labels[label_idx], label_idx: label_idx, confidence: round(confidence, 4), advice: 仅供参考不能替代临床诊断 }这里threshold0.6是经验值应用时应该用验证集调优把验证集所有样本的置信度分布画出来选一个让高危类别召回率达标的最低置信度。如果模型对深二度和三度的预测置信度普遍低于0.7说明模型特征学习还不够这时候盲目调低阈值只会增加假阳性。labels列表的顺序必须和训练时的类别索引一一对应顺序错了整个系统的输出就全部错位——这个看似无聊的细节是推理脚本里最常见的人为错误。5.3 模型导出ONNX与量化训练好的PyTorch模型不能直接塞进移动端或边缘设备需要导出为ONNX格式再通过ONNX Runtime做推理。导出这一步的坑主要在动态尺寸和Batch维度烧伤检测推理时一次只来一张图但训练时是批量输入导出时要把动态轴显式标出来否则转出来的模型只能接受固定尺寸。import torch.onnx model.eval() dummy_input torch.randn(1, 3, 224, 224) torch.onnx.export( model, dummy_input, burn_model.onnx, input_names[input], output_names[logits], dynamic_axes{ input: {0: batch_size}, logits: {0: batch_size} }, opset_version17 )dynamic_axes把batch维度设为动态这样导出的模型在Java、C、Android各个端都能跑不会因为batch size被锁死而报错。opset_version不是越高越好要看你用的ONNX Runtime版本如果部署端是2年以上的老版本opset11反而更稳。导出后用onnxruntime加载模型跑一遍和PyTorch完全相同的输入对比两边的输出差异最大误差应该小于1e-4。误差大了通常是模型里有算子不兼容常见的元凶是nn.Upsample和某些注意力模块需要在导出时用torch.onnx.export的operator_export_type参数做调整。6. 把分类升级成分割CAM可视化和U-Net进阶路线对烧伤检测这件事来说分类模型能回答是几度烧伤但临床医生真正想要的是哪片区域是几度烧伤。同一个创面上边缘可能是浅二度中心已经三度焦痂一张图一个标签远远不够。从分类升级到分割是把这个项目从demo推向可用产品的最短路径。第一步是做可解释性验证。用GradCAM生成热力图叠加在原图上看模型做出判断的依据是不是烧伤区域本身。如果热力图高亮在创面边缘的焦痂上那模型学对了如果高亮在背景的床单或正常皮肤上说明前面说的偏置问题还没解决。这个步骤成本极低用pytorch_grad_cam库十几行代码就能出图但要敢于拿它去挑战模型的每个预测结果——这是让医生信任系统的基础。第二步是数据够不够的问题。分割训练需要像素级标注工作量是分类标注的十倍以上。如果手头只有几百张分类标注数据务实路线是继续用分类模型做初筛只对置信度落在0.5到0.8之间的模糊样本引入分割模型辅助判断。等积累了两万张以上带标注的创面图片再换成U-Net或DeepLabV3架构把分类头的预测作为分割模型的先验能明显提升收敛速度。第三步是主动学习。分割数据标注成本太高一个技巧是用当前模型的预测熵值筛选最有价值的样本熵值高的图像意味着模型很困惑这类图交给医生标注对模型提升最大。每轮只标50张通常迭代三四轮分割模型就能达到分类模型两年积累的效果。做这个项目时我自己吃过最大的亏是花太多时间调模型结构而忽略了数据划分和推理一致性这类不性感的基础问题。后来每个训练实验跑完第一件事不是看准确率而是随机抽50张验证集图像检查预处理、标签顺序和模型输出这三样全对了再谈调参。希望帮到你。本文还有配套的精品资源点击获取