尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从DICOM到分割模型:SIIM-ACR气胸X光影像分割实战指南

从DICOM到分割模型:SIIM-ACR气胸X光影像分割实战指南 简介医学影像分割是计算机视觉在医疗领域的关键应用其核心原理是通过深度学习模型对医学图像中的特定组织或病灶进行像素级识别与轮廓勾画。这项技术的核心价值在于能够辅助医生进行定量分析和诊断提升阅片效率与一致性尤其在胸部X光、CT等影像的病灶检测中作用显著。在工程实践中处理DICOM标准格式数据、应对极端类别不平衡以及设计高效分割网络是常见的挑战。以气胸Pneumothorax病灶分割这一具体任务为例其应用场景直接关联胸肺急症的快速诊断。针对SIIM-ACR公开数据集中气胸区域占比极小的特点需要综合运用数据增强、改进的损失函数如Dice Loss以及注意力机制等策略。本文聚焦于解决类别不平衡和模型架构优化等核心问题详细阐述了从数据解码、模型训练到后处理的完整实战流程为相关医学影像分析项目提供了一套可复用的方法论。1. 项目背景与核心挑战从一份压缩包到医学影像分割实战最近在整理硬盘时翻到了一个名为“SIIM-ACR-Pneumothorax-Segmentation 气胸X光.rar”的压缩包。这个文件名对于从事医学影像分析特别是胸部X光片自动诊断方向的朋友来说应该不陌生。它直指一个非常具体且具有临床价值的任务基于SIIM-ACR公开数据集对气胸Pneumothorax病灶进行图像分割。气胸俗称“肺破了个洞”是指气体进入胸膜腔导致肺组织被压缩是一种需要紧急处理的胸部急症。在X光片上气胸通常表现为肺野边缘与胸壁之间的一条透亮带无肺纹理区域。然而这条透亮带的形态、位置、大小千变万化且与肋骨、皮下气肿等其他影像特征容易混淆即使对于经验丰富的放射科医生诊断也存在一定难度和漏诊率。这个压缩包名字背后隐藏的是一整套从数据获取、预处理、模型构建、训练到评估的完整深度学习项目流程。它不是一个简单的Demo而是一个指向工业级应用的起点。对于初学者它可能意味着第一次接触DICOM格式、第一次处理不平衡的医学标签、第一次尝试U-Net及其变体对于有经验的从业者它则是验证新模型架构如Transformer、nnU-Net、探索半监督学习或解决类别不平衡问题的经典“擂台”。无论是哪种角色这个项目都绕不开几个核心挑战如何从原始的DICOM数据中提取有效信息如何设计网络以精准捕捉薄如发丝的胸膜线如何处理正负样本极度不均气胸区域通常只占图像的极小部分带来的训练难题以及如何将模型预测结果转化为临床可用的辅助诊断信息2. 数据解码DICOM格式、竞赛数据与预处理流水线拿到“SIIM-ACR-Pneumothorax-Segmentation”数据集第一步不是急着写模型代码而是彻底理解你手中的“原料”。这个数据集源自Kaggle上的同名竞赛由医学影像学会SIIM和美国放射学会ACR联合提供。2.1 DICOM文件不仅仅是图像数据集的核心是大量的DICOM文件。DICOM是医学影像领域的通用标准它不仅仅包含像素阵列图像更是一个封装了丰富元数据的“容器”。用pydicom库读取一个DICOM文件你会发现除了图像像素还有患者信息已匿名化、检查设备参数、窗宽窗位等。对于分割任务最关键的是正确提取像素数据并还原其真实的灰度值。import pydicom import numpy as np def load_dicom(path): dicom pydicom.dcmread(path) # 获取像素数据 img dicom.pixel_array.astype(np.float32) # 应用Rescale Slope和Intercept将存储值转换为有意义的物理值如Hounsfield单位但X光是灰度值 if hasattr(dicom, RescaleSlope) and hasattr(dicom, RescaleIntercept): img img * dicom.RescaleSlope dicom.RescaleIntercept # 标准化窗宽窗位可选有时直接做全局归一化 # 更常见的做法是直接做归一化到0-1或标准化 img (img - img.min()) / (img.max() - img.min() 1e-8) return img这里的一个关键细节是窗宽窗位。原始DICOM像素值范围可能很大直接归一化会丢失对比度信息。窗宽窗位是放射科医生用来突出特定组织如肺、骨骼的显示工具。在预处理时你可以选择模拟这个操作也可以像上面代码一样做全局归一化。我的经验是对于气胸分割直接做全局归一化或简单的(img - mean)/std标准化通常足够因为网络自己会学习到有用的特征。但了解窗宽窗位的概念在分析模型失败案例时非常有用。2.2 标签数据Run-Length Encoding (RLE) 解码竞赛提供的标签不是常见的PNG掩码图而是以CSV文件形式存储的Run-Length Encoding编码。每一行对应一张图像EncodedPixels字段以空格分隔的字符串存储了掩码信息。其格式为“起始像素1 长度1 起始像素2 长度2 ...”。一张图可能有多个气胸区域也可能没有空值。解码RLE是数据准备的关键一步。def rle_decode(mask_rle, shape): 将RLE编码的字符串解码为二进制掩码数组。 Args: mask_rle (str): Run-length编码的字符串如‘1 3 10 5’。 shape (tuple): 输出数组的形状 (height, width)。 Returns: np.ndarray: 二维二进制掩码。 if mask_rle -1 or pd.isna(mask_rle): return np.zeros(shape, dtypenp.uint8) s mask_rle.split() starts, lengths [np.asarray(x, dtypeint) for x in (s[0:][::2], s[1:][::2])] starts - 1 # RLE编码通常从1开始计数而数组索引从0开始 ends starts lengths img np.zeros(shape[0] * shape[1], dtypenp.uint8) for lo, hi in zip(starts, ends): img[lo:hi] 1 return img.reshape(shape).T # 注意转置因为RLE编码通常是列优先的踩坑提醒务必注意RLE编码的索引顺序。Kaggle的RLE通常是“列优先”而我们的数组是“行优先”因此解码后需要转置.T。忽略这一点会导致生成的掩码完全错位。另一个常见问题是多区域RLE的处理上述代码通过循环zip(starts, ends)已经能正确处理。2.3 构建高效的数据管道当数据量很大时一个高效的数据加载器至关重要。使用PyTorch的Dataset和DataLoader是标准做法。这里的关键在于在线数据增强。医学影像数据有限增强是防止过拟合、提升模型泛化能力的利器。import torch from torch.utils.data import Dataset, DataLoader import albumentations as A from albumentations.pytorch import ToTensorV2 class PneumothoraxDataset(Dataset): def __init__(self, df, image_dir, transformNone, is_trainTrue): self.df df self.image_dir image_dir self.transform transform self.is_train is_train def __len__(self): return len(self.df) def __getitem__(self, idx): row self.df.iloc[idx] img_path os.path.join(self.image_dir, row[ImageId] .dcm) # 加载并预处理DICOM图像 image load_dicom(img_path) # 解码RLE标签 mask rle_decode(row[EncodedPixels], image.shape) if self.transform: augmented self.transform(imageimage, maskmask) image augmented[image] mask augmented[mask] # 将掩码转换为LongTensor用于CrossEntropyLoss或FloatTensor用于DiceLoss mask torch.as_tensor(mask, dtypetorch.long) return image, mask # 定义训练和验证的数据增强策略 train_transform A.Compose([ A.RandomRotate90(p0.5), A.Flip(p0.5), A.ShiftScaleRotate(shift_limit0.0625, scale_limit0.1, rotate_limit15, p0.5, border_mode0), A.RandomBrightnessContrast(p0.2), A.Normalize(mean[0.485], std[0.229]), # 使用ImageNet的均值和标准差是常见做法尽管是单通道 ToTensorV2(), ]) val_transform A.Compose([ A.Normalize(mean[0.485], std[0.229]), ToTensorV2(), ])注意Albumentations库对图像和掩码进行同步变换的能力非常强大且方便。对于医学影像我建议谨慎使用弹性变形等过于强烈的空间变换除非你有充分理由认为它们不会引入不真实的解剖结构扭曲。对于气胸旋转、翻转、小幅度的平移缩放是安全且有效的。3. 模型选型与演进从U-Net到更高效的架构提到医学图像分割U-Net几乎是绕不开的起点。其编码器-解码器结构加上跳跃连接完美适配了从局部特征到全局上下文的信息融合需求。对于气胸分割基础的U-Net就能取得不错的效果。3.1 基础U-Net实现与核心改进点一个标准的PyTorch U-Net实现并不复杂。但针对气胸任务有几个关键改进点需要关注深度与滤波器数量原始U-Net的深度和每层滤波器数可能不足以捕捉细微的胸膜线。可以适当增加网络深度或初始通道数。编码器骨干网络将U-Net的编码器替换为预训练的ResNet、EfficientNet等可以大幅提升特征提取能力这是当前的主流做法。这些骨干网络在ImageNet上预训练的特征提取器对于医学影像的纹理和边缘检测有很好的迁移效果。注意力机制在跳跃连接或解码器中引入注意力门Attention Gate可以让网络更关注气胸可能出现的区域如肺野周边抑制无关背景如纵隔、肋骨的干扰。import torch.nn as nn import torchvision.models as models class AttentionBlock(nn.Module): 简单的注意力门模块 def __init__(self, F_g, F_l, F_int): super(AttentionBlock, self).__init__() self.W_g nn.Sequential( nn.Conv2d(F_g, F_int, kernel_size1, stride1, padding0, biasTrue), nn.BatchNorm2d(F_int) ) self.W_x nn.Sequential( nn.Conv2d(F_l, F_int, kernel_size1, stride1, padding0, biasTrue), nn.BatchNorm2d(F_int) ) self.psi nn.Sequential( nn.Conv2d(F_int, 1, kernel_size1, stride1, padding0, biasTrue), nn.BatchNorm2d(1), nn.Sigmoid() ) self.relu nn.ReLU(inplaceTrue) def forward(self, g, x): g1 self.W_g(g) x1 self.W_x(x) psi self.relu(g1 x1) psi self.psi(psi) return x * psi # 构建一个基于ResNet34编码器的U-Net class ResNetUNet(nn.Module): def __init__(self, n_classes1): super().__init__() base_model models.resnet34(pretrainedTrue) # 获取ResNet的中间层输出 self.base_layers list(base_model.children()) self.encoder1 nn.Sequential(*self.base_layers[:3]) # 初始卷积BNReLU self.encoder2 nn.Sequential(*self.base_layers[3:5]) # layer1 self.encoder3 self.base_layers[5] # layer2 self.encoder4 self.base_layers[6] # layer3 self.encoder5 self.base_layers[7] # layer4 # 解码器部分 self.decoder5 self._make_decoder(512, 256) self.decoder4 self._make_decoder(256 256, 128) # 注意拼接后的通道数 self.decoder3 self._make_decoder(128 128, 64) self.decoder2 self._make_decoder(64 64, 32) self.decoder1 self._make_decoder(32 64, 16) # 与encoder1的输出拼接 self.final nn.Conv2d(16, n_classes, kernel_size1) # 注意力模块可选 self.att5 AttentionBlock(F_g256, F_l256, F_int128) self.att4 AttentionBlock(F_g128, F_l128, F_int64) # ... 其他注意力层 def _make_decoder(self, in_channels, out_channels): return nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size3, padding1), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue), nn.Conv2d(out_channels, out_channels, kernel_size3, padding1), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue), nn.Upsample(scale_factor2, modebilinear, align_cornersTrue) ) def forward(self, x): # 编码过程 e1 self.encoder1(x) # 64, H/2, W/2 e2 self.encoder2(e1) # 64, H/4, W/4 e3 self.encoder3(e2) # 128, H/8, W/8 e4 self.encoder4(e3) # 256, H/16, W/16 e5 self.encoder5(e4) # 512, H/32, W/32 # 解码跳跃连接 d5 self.decoder5(e5) # 256, H/16, W/16 # d5 self.att5(gd5, xe4) # 应用注意力 d4 self.decoder4(torch.cat([d5, e4], dim1)) # 128, H/8, W/8 d3 self.decoder3(torch.cat([d4, e3], dim1)) # 64, H/4, W/4 d2 self.decoder2(torch.cat([d3, e2], dim1)) # 32, H/2, W/2 d1 self.decoder1(torch.cat([d2, e1], dim1)) # 16, H, W out self.final(d1) return torch.sigmoid(out) # 二分类输出3.2 超越U-NetTransformer与nnU-Net的启示近年来Vision Transformer在图像分割领域表现强劲。像Swin Transformer、SegFormer等模型通过自注意力机制捕获长距离依赖关系对于需要全局上下文理解的任务如确定气胸的整个范围可能更有优势。可以将Transformer块作为编码器或构建纯Transformer的分割网络如SETR。不过ViT类模型通常需要大量数据在医学影像数据有限的情况下需要谨慎使用并配合强数据增强。另一个不得不提的框架是nnU-Net。它不是一个新模型而是一个强大的自动化管道。nnU-Net的核心思想是不过度追求网络结构的花哨而是通过系统的数据预处理、模型训练和后处理策略将U-Net的性能推到极致。对于SIIM-ACR气胸分割nnU-Net在当年竞赛中就是强有力的基线。它的成功启示我们工程细节和系统化流程往往比模型结构本身更重要。这包括自动化的数据预处理根据数据集统计自动决定图像重采样策略、归一化方式。强大的数据增强不仅包括空间增强还有亮度、对比度、高斯噪声、模拟低剂量等。模型集成训练2D U-Net、3D U-Net如果适用以及不同配置的模型然后进行集成预测。精巧的后处理例如利用连通域分析去除小的假阳性区域或根据解剖学先验气胸只发生在肺野内对预测结果进行约束。对于个人研究者或小团队完全复现nnU-Net的整个流程可能负担较重但我们可以借鉴其思想重视数据管道、实施鲁棒的增强、进行模型集成和仔细的后处理。3.3 针对“Segmentation Fault”热词的延伸思考在搜索“SIIM-ACR”时关联到了“segmentation fault”这个系统级错误。虽然这与图像分割任务无关但作为一个常见的程序崩溃原因在部署复杂模型尤其是包含自定义C/CUDA扩展的模型时也可能遇到。如果你的训练或推理脚本突然崩溃并报“Segmentation fault”可以按以下思路排查内存问题检查是否因加载过大图像或批次导致内存溢出。尝试减小batch_size或图像尺寸。库版本冲突PyTorch、CUDA、cuDNN版本不兼容是常见原因。确保使用官方推荐的版本组合。自定义算子如果使用了第三方库或自己编译的CUDA扩展可能存在bug。尝试禁用它们以定位问题。数据加载器多进程数据加载DataLoader的num_workers 0有时在Windows或特定环境下会引发问题。尝试设置num_workers0。4. 损失函数与类别不平衡让模型“看见”细微的气胸气胸分割任务最棘手的问题之一是极端的类别不平衡。在一张1024x1024的X光片中气胸区域可能只有几十到几千个像素而背景像素超过百万。如果使用标准的交叉熵损失模型会迅速学会将所有像素预测为背景从而得到一个很高的准确率但完全无用的模型。4.1 二分类损失函数对比与选择解决类别不平衡需要引入对正样本气胸给予更高权重的损失函数。Dice Loss源于衡量分割区域重叠度的Dice系数对类别不平衡非常鲁棒。它直接优化模型预测掩码与真实掩码的重叠面积。class DiceLoss(nn.Module): def __init__(self, smooth1e-6): super(DiceLoss, self).__init__() self.smooth smooth def forward(self, pred, target): pred pred.view(-1) target target.view(-1) intersection (pred * target).sum() dice (2. * intersection self.smooth) / (pred.sum() target.sum() self.smooth) return 1 - diceDice Loss的缺点是训练可能不稳定尤其是当预测和真实掩码都很小时梯度可能会很大。Focal Loss最初为目标检测设计通过降低易分类样本的权重让模型更关注难分类的样本如边界像素、小区域。class FocalLoss(nn.Module): def __init__(self, alpha0.25, gamma2.0): super(FocalLoss, self).__init__() self.alpha alpha self.gamma gamma self.bce nn.BCEWithLogitsLoss(reductionnone) def forward(self, pred, target): bce_loss self.bce(pred, target) pt torch.exp(-bce_loss) # pt p if y1, else 1-p focal_loss self.alpha * (1-pt)**self.gamma * bce_loss return focal_loss.mean()alpha用于平衡正负样本权重gamma调节难易样本的权重。对于气胸可以适当调高alpha如0.5-0.75以给予正样本更多关注。组合损失实践中最有效的方法往往是组合多种损失。BCE Dice Loss是医学分割的黄金组合。BCE提供稳定的梯度Dice Loss直接优化分割目标。class BCEDiceLoss(nn.Module): def __init__(self, bce_weight0.5, dice_weight0.5): super().__init__() self.bce_weight bce_weight self.dice_weight dice_weight self.bce nn.BCEWithLogitsLoss() self.dice DiceLoss() def forward(self, pred, target): bce_loss self.bce(pred, target) dice_loss self.dice(torch.sigmoid(pred), target) return self.bce_weight * bce_loss self.dice_weight * dice_loss通过调整权重你可以在边界清晰度BCE和区域完整性Dice之间取得平衡。4.2 采样策略与数据层面的平衡除了损失函数在数据层面也可以进行平衡过采样在训练每个epoch中对包含气胸正样本的图像进行重复采样使其被抽到的概率高于正常图像。难例挖掘虽然更常用于目标检测但其思想可以借鉴。在训练过程中可以识别出那些被模型错误分类的像素尤其是假阴性在后续训练中给予更高权重或更频繁地出现。我的经验是对于SIIM-ACR气胸数据BCEDice组合损失配合适度的过采样例如确保每个batch中正样本图像的比例不低于30%通常能取得很好的效果。在训练初期可以观察Dice系数在验证集上的表现如果一直为0说明模型没有学到任何正样本特征需要立刻检查数据加载、损失函数或模型初始化。5. 训练策略、调参与模型评估有了数据、模型和损失函数接下来就是漫长的训练与调优过程。这个过程充满了“玄学”但也有一套科学的方法论。5.1 训练流程与关键超参数优化器与学习率AdamW是目前很多任务的首选它比Adam具有更好的权重衰减处理方式。初始学习率通常设置在1e-4到3e-4之间。使用学习率预热和余弦退火策略能显著提升训练稳定性和最终性能。import torch.optim as optim from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts, OneCycleLR optimizer optim.AdamW(model.parameters(), lr3e-4, weight_decay1e-4) # 使用OneCycleLR策略 scheduler OneCycleLR(optimizer, max_lr3e-4, epochsnum_epochs, steps_per_epochlen(train_loader), pct_start0.1)批次大小与图像尺寸受限于GPU内存你可能无法以原始分辨率进行训练。常见的做法是将图像下采样到512x512或768x768。批次大小Batch Size尽可能大但至少为2以确保批量归一化能工作。如果内存不足可以使用梯度累积来模拟更大的批次。早停与模型保存根据验证集上的Dice系数或IoU来监控模型性能。使用torch.save保存检查点时不仅要保存模型参数最好也保存优化器状态和当前epoch以便从中断处恢复训练。checkpoint { epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), best_val_score: best_val_score, scheduler_state_dict: scheduler.state_dict() if scheduler else None, } torch.save(checkpoint, fcheckpoint_epoch_{epoch}.pth)5.2 评估指标超越准确率对于分割任务像素准确率是毫无意义的。我们需要使用对类别不平衡不敏感的指标Dice系数 / IoU最核心的指标。Dice 2|A∩B| / (|A||B|) IoU |A∩B| / |A∪B|。它们衡量的是预测区域与真实区域的重叠程度。灵敏度与特异度在医学领域我们通常更关心灵敏度召回率即有多少真实的气胸区域被检测出来。漏诊假阴性的代价远高于误诊假阳性。因此一个高灵敏度、可接受特异度的模型可能比一个两者平衡但灵敏度较低的模型更有临床价值。F1 Score精确率和召回率的调和平均数是另一个综合指标。在验证时应该计算整个验证集所有样本的平均Dice而不是每个批次平均值的平均。同时可以单独计算正样本有气胸图像上的指标这更能反映模型检测病灶的能力。5.3 可视化模型学习的“X光片”可视化是调试模型和理解其行为的利器。在训练过程中定期查看模型在验证集上的预测结果将原始X光图像、真实掩码、预测掩码叠加显示。特别关注假阳性模型说有实际没有和假阴性模型说没有实际有的案例。分析假阳性是否出现在特定解剖位置如锁骨重叠处、肋膈角这可能提示需要引入解剖学先验知识。分析假阴性是否因为气胸区域太小、太淡或形态不典型这可能提示需要更强的数据增强或更敏感的解码器。通过可视化你可能会发现模型将皮下气肿误判为气胸或者无法识别张力性气胸的特定形态。这些观察是进一步改进模型和数据增强策略的直接依据。6. 后处理与结果优化从像素到临床报告模型输出的是一张概率图或二值掩码图但这并不是终点。要使其对医生有用还需要一系列后处理步骤。6.1 阈值化与连通域分析模型通常输出每个像素是气胸的概率0到1。我们需要一个阈值如0.5将其转换为二值掩码。但这个固定阈值可能不是最优的。可以尝试动态阈值在验证集上寻找一个能最大化Dice系数或F1 Score的最佳阈值。连通域分析使用scipy.ndimage或OpenCV的findContours识别出二值掩码中所有的独立区域。import cv2 import numpy as np def postprocess_mask(pred_mask, prob_threshold0.5, area_threshold100): # 阈值化 binary_mask (pred_mask prob_threshold).astype(np.uint8) # 形态学操作先闭运算填充小孔再开运算去除小点 kernel np.ones((5,5), np.uint8) binary_mask cv2.morphologyEx(binary_mask, cv2.MORPH_CLOSE, kernel) binary_mask cv2.morphologyEx(binary_mask, cv2.MORPH_OPEN, kernel) # 连通域分析去除小面积区域 num_labels, labels, stats, centroids cv2.connectedComponentsWithStats(binary_mask, connectivity8) for i in range(1, num_labels): if stats[i, cv2.CC_STAT_AREA] area_threshold: binary_mask[labels i] 0 return binary_mask通过设定一个最小面积阈值如100像素可以过滤掉那些可能是噪声的小区域显著降低假阳性。6.2 结果量化与报告生成对于临床辅助诊断医生需要知道气胸的大小和位置。面积估算可以根据像素面积和DICOM头文件中的像素间距信息估算气胸的实际面积平方厘米。pydicom的PixelSpacing标签提供了毫米/像素的转换比例。pixel_spacing dicom.PixelSpacing # 例如 [0.143, 0.143] 单位 mm area_per_pixel pixel_spacing[0] * pixel_spacing[1] / 100 # 转换为平方厘米 pneumothorax_area_cm2 np.sum(binary_mask) * area_per_pixel定位可以计算气胸掩码的质心并大致描述其位于左肺/右肺上野/中野/下野。生成结构化报告最终可以输出一个简单的JSON或文本报告包含{“是否存在气胸”: True/False, “预估面积(cm2)”: 15.6, “主要位置”: “右肺上野”}。这比单纯提供一张带掩码的图片更有临床价值。7. 项目总结与避坑指南回顾整个“SIIM-ACR气胸分割”项目从解压一个RAR文件到构建一个能输出量化报告的初步系统涉及了医学影像AI的完整链路。这个过程里充满了“坑”以下是我个人实践中总结的一些关键点数据一致性是生命线确保训练、验证、测试集的数据预处理如归一化方法完全一致。一个常见的错误是在训练时使用了数据增强中的归一化而在验证/推理时忘记了。最好将预处理逻辑封装成一个可复用的函数或类。验证集划分要科学不要随机划分。医学数据中同一个患者的多次检查可能在不同图像中如果它们被分到训练集和验证集会导致数据泄露使验证分数虚高。务必根据患者ID进行分层划分。损失函数的选择需要实验没有放之四海而皆准的损失函数。BCEDice是个安全的起点但如果你的模型预测边界模糊可以尝试加入基于边界的损失如Boundary Loss。多花时间在损失函数的对比实验上回报率很高。不要忽视简单后处理一个简单的连通域分析去除小面积区域可能比调参一周对降低假阳性的效果更明显。模型输出的是概率需要根据实际应用场景进行合理的“加工”。以临床视角评估模型最终模型是要给医生用的。除了看Dice分数更要和放射科医生一起在真实的未见过的工作流中评估模型。关注它是否在容易漏诊的案例上提供了帮助以及它的假阳性是否干扰了医生的正常读片节奏。这个压缩包只是一个起点。在此基础上你可以探索的方向还有很多尝试最新的分割模型如Segment Anything Model的微调、利用半监督学习利用大量未标注的X光片、开发不确定性估计以提示模型“存疑”的案例或者将分割模型集成到一个完整的CADx计算机辅助诊断系统中。每一张X光片背后都是一个真实的患者驱动我们不断优化模型的不仅是更高的分数更是那份对临床价值的不懈追求。本文还有配套的精品资源点击获取
返回列表