ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于多实例学习与注意力机制的糖尿病视网膜病变分级实践

基于多实例学习与注意力机制的糖尿病视网膜病变分级实践 简介针对糖尿病视网膜病变DR检测的多实例学习MIL数据集资源包面向医学图像分析与深度学习研究者。资源以Jupyter Notebook为核心搭配Python脚本与模型权重完整呈现图像预处理、特征提取、多实例模型构建及训练评估流程适合希望将MIL方法落地到医学影像场景的读者。压缩包共5个文件包括2个Notebook数据探索与模型实验、1个模型定义脚本、1个预训练CNN权重文件以及1份README说明文档总体积约10.83MB结构清晰。目前已有756人学习下载。从中可快速掌握DR数据集的实例级标注用法理解病变区域自动识别原理并可直接加载训练好的权重进行验证与微调显著降低复现门槛。1. 项目概述与核心思路糖尿病视网膜病变Diabetic RetinopathyDR是全球范围内导致成年人视力丧失的首要原因之一。国内流行病学数据显示糖尿病患者中DR的患病率大约在20%到40%之间这意味着庞大的筛查需求。传统的DR分级依赖眼科医生逐张阅读眼底彩照按照国际分级标准ETDRS或简化五级分类判定病情严重程度工作量大、主观差异明显在基层医疗场景中尤其吃力。把深度学习和医学影像结合来做自动化筛查自然成为一个研究热点而MIL-DR这个项目就是我在这个方向上的一次完整实践用多实例学习Multiple Instance LearningMIL处理视网膜图像数据集实现DR的自动分级。为什么偏偏要引入多实例学习而不是用普通的图像分类模型直接做核心原因在于DR眼底图像的特殊性。一张眼底彩照的分辨率通常非常高几千乘几千像素病灶微动脉瘤、出血点、硬性渗出、棉絮斑等往往只占据图像中很小的一块区域并且分布极不均匀。如果直接把整张图缩放成224x224或512x512输入CNN大量细微病灶会在降采样过程中被“抹掉”信息如果直接输入原始分辨率显存和计算成本又难以承受。MIL恰好提供了第三种思路把一张图像切分成多个局部区域patch每个patch看作一个“实例”一张图像成为一个“包”bag。我们不需要对每个patch做精细标注只需要知道整个包图像的级别标签就能训练模型学习关键的局部病灶模式——这正是弱监督学习的典型场景。这篇文章主要面向三类读者正在做医学图像分析相关课题的研究生想尝试弱监督方案解决细粒度分类问题的算法工程师以及对多实例学习原理感兴趣但被论文公式劝退的初学者。我会把MIL-DR从数据预处理、模型设计到训练调参的完整链路拆开讲清楚并附上可运行的PyTorch核心代码。即便你没有医学背景只要能理解“包里至少有一个正实例时包才为正”这个逻辑就可以把整套方案迁移到其他弱监督任务上。2. 多实例学习与DR分类的适配性分析2.1 为什么普通分类模型搞不定DR图像先看一个实际矛盾眼底相机拍出来的原始图像往往在3000x2000像素以上而ImageNet上预训练的分类模型基本都吃224x224的输入。强行缩放会带来什么以微动脉瘤为例这类早期病灶在图像上通常只有几个到十几个像素大小缩放后基本消失殆尽。即使是相对明显的出血点和渗出物在高比例压缩后对比度也会严重下降特征变得模糊。另一个问题是DR分级的空间异质性一张处于中度非增殖期NPDR的图像可能只有某个象限出现了少量出血点其余区域看起来完全正常。整图分类模型必须从全局特征中学会“注意力集中在局部异常区域”这需要大量精细标注才能约束住而公开数据集如EyePACS、Messidor恰恰只提供图像级别的标签——正样本中不标注病灶具体位置、数量和范围。有一种看似可行的方案是训练目标检测模型比如用Faster R-CNN或YOLO先定位病灶再分类。但问题又来了训练检测模型需要框级别的标注而医学影像的病灶框标注成本极高需要持证眼科医生逐张勾画一个标注框的获取成本可能高达几元到几十元一个像样的训练集动辄需要上万张图。MIL的价值就在这里它只需要图像级别的标签却能自动学习识别图像内部的关键局部模式。医学图像的诊断逻辑本质上就是“看图找病灶”这和MIL“包内关键实例决定包标签”的假设高度一致。2.2 MIL的三种建模范式MIL不是一个固定模型而是一类问题建模方式。常见的解决方案可以归为三条技术路线。第一种是实例空间方法Instance-Space Approach。这类方法先训练一个实例级别的分类器将每个实例独立判为正或负再通过聚合规则如最大值、大多数投票得到包标签。经典模型包括mi-SVM、MI-SVM以及后续引入神经网络的DeepMIL变体。优点是对“关键实例”的位置有一定的解释性缺点是训练过程需要迭代优化且实例标签和包标签之间的映射假设较强。第二种是包空间方法Bag-Space Approach。把所有实例的特征向量全部聚合concatenate或pooling成一个固定维度的包级特征再输入分类器。这类方法不关心单个实例的标签训练简单直接但容易在聚合时丢失局部关键信息。常见的聚合方式是平均池化或最大池化但平均会稀释稀有病灶信号最大又只保留最强响应而忽略多病灶的联合判断。第三种是嵌入空间方法Embedding-Space Approach也是目前的主流选择。先通过共享的神经网络embedding网络把每个实例映射成低维特征向量然后利用可学习的注意力机制对所有实例特征做加权求和得到包级特征最后过一层分类器。代表工作就是Ilse等人2018年提出的Attention-based Deep MIL它解决了“哪些实例对包标签贡献大”这个问题的可学习化而且注意力权重天然可以作为可解释性输出告诉我们模型重点看了图像的哪些区域。从实际效果看第三种方法最适合DR分级。因为DR分级本身需要综合多种病灶信息和病变范围纯最大化只关心“最像病变的那个patch”平均池化则会被大量的正常patch带偏而注意力机制可以学到“少数异常patch权重高、多数正常patch权重低”这种非线性的组合关系。3. 数据集准备与预处理细节3.1 数据来源与标签体系我用的数据集以EyePACSKaggle平台公开的DR检测数据集为主辅以Messidor-2做跨数据集验证。EyePACS包含约88000张眼底图像标签按国际分级标准分为0到4五级0为无病变1为轻度NPDR2为中度NPDR3为重度NPDR4为增殖期PDR。需要特别提醒的是这个数据集的标签是从每次检查的临床评估中转换来的本身带有一定噪声同一张图可能在不同标注者之间有一级左右的偏差。实际训练时如果直接做五分类类别不均衡会非常严重0级图像数量远超其他级别而且相邻等级之间的边界模糊模型很容易把2级和3级混淆。我在实验中采用的策略是先将任务重映射为三分类0级保持不变1级和2级合并为“非增殖期”3级和4级合并为“重症期”。这样既缓解了类别不均衡也更贴近临床筛查的实际需求——筛查的重点是判断“是否需要转诊治疗”1级和2级在基层都可以先观察但3级以上必须尽快去医院做进一步检查。当然五分类任务也有它的研究价值只是对数据质量和标注一致性要求更高。为了避免训练集和验证集之间存在患者级别的数据泄漏我按照图像ID做了分组同一个患者的多次检查不会同时出现在训练集和验证集中。3.2 图像预处理与分块策略预处理这块有一点踩坑经验值得分享。眼底图像四周通常有黑色边框、闪光反射、眼睫毛等干扰区域直接切patch会在后续训练中产生大量无意义的背景实例白白增加计算量。我用OpenCV做了两件事先通过灰度化加阈值分割定位出眼球圆盘区域用椭圆掩膜把外圈背景剔除再按每个patch的通道均值和标准差做一次简单的信息量过滤去除过于平坦或全黑的patch。真正的分块策略直接决定MIL的性能上限。我实验过固定网格切分如把图像切成4x4、8x8、16x16和滑动窗口两种方案。固定网格的问题在于病灶可能恰好落在两个patch的交界处被活生生切成两半滑动窗口配合重叠率可以缓解这个问题但会带来更多冗余实例。此外patch的尺寸尺度也很关键DR病灶尺度差异很大微动脉瘤是像素级的小点而大片出血可以是几百像素宽的斑块。单一尺度很难覆盖全部病灶类型。最终我用的方案是“多尺度重叠分块”基础尺度选用512x512滑动步长为256即有50%重叠把所有有效patch缩放到224x224后输入网络同时对原始图像做一次2倍降采样用同样的策略切出一组小尺度patch。这样既保证了病灶尽量完整出现在某个patch内部又让模型能看到不同空间尺度下的纹理特征。重叠分块带来的副作用是每个包的实例数量偏多单张图能产生20到40个patch不过配合合适的池化策略这个问题对训练速度影响不大。3.3 数据增强的取舍DR图像的数据增强需要比自然图像更谨慎。常规的随机裁剪、缩放、色彩抖动都可以用但有两个禁忌要注意。第一不推荐用水平翻转和垂直翻转之外的旋转变换之外的角度旋转。眼底图像有解剖学上的“上下左右”概念视盘通常位于鼻侧左眼在右侧、右眼在左侧黄斑位于颞侧。大角度旋转会破坏这种空间位置关系给模型引入错误的先验。最多做90度倍数的旋转即可。第二色彩增强要保守。光照变化是眼底相机拍摄的真实差异所以适当调节亮度、对比度是有效的但不要做强烈的色调偏移因为DR病灶尤其是出血点的颜色是重要诊断依据把红色通道偏移成紫色模型学到的特征就不再是医学上有效的模式。我实际采用的数据增强管线为随机水平/垂直翻转、90度旋转、亮度抖动范围0.8到1.2、对比度抖动0.9到1.1、小范围随机缩放0.9到1.1后随机裁剪到目标尺寸。增强只作用于训练集验证集保持原始状态。4. 核心模型设计与代码实现4.1 模型整体架构MIL-DR整体采用“CNN特征提取器注意力池化分类头”的三段式结构。特征提取器选用了在ImageNet上预训练的ResNet50去掉最后的全连接层把输出维度固定为1024维取ResNet50倒数第二层特征。这里没有选更深的EfficientNet或Swin Transformer主要是考虑到医学图像数据量有限预训练特征本身已经很强过度复杂的骨干网络容易在微调时过拟合而且ResNet50的推理速度和显存占用在工程上也更友好。注意力池化层是核心。给定包内N个实例的特征向量{h1, h2, ..., hN}我们需要学习一组权重{a1, a2, ..., aN}满足所有权重之和为1且每个权重非负然后计算加权和作为包特征。标准的Attention MIL用两层全连接网络加tanh激活函数来产生未归一化的注意力分数再用softmax归一化。我在这个基础上加了一个门控机制gating mechanism把tanh和sigmoid的输出逐元素相乘后再过全连接层。这样做的好处是让注意力打分函数具备更强的表达能力能够建模更复杂的实例重要性关系对DR这种“多个不同尺度病灶共同决定标签”的情况有实际帮助。4.2 PyTorch核心代码下面是注意力MIL模块的核心实现代码遵循PyTorch 1.10以上版本可以直接嵌入训练脚本。import torch import torch.nn as nn import torch.nn.functional as F class AttentionMIL(nn.Module): def __init__(self, feature_dim1024, hidden_dim256): super(AttentionMIL, self).__init__() # 门控注意力网络 self.attention_fc1 nn.Linear(feature_dim, hidden_dim) self.attention_fc2 nn.Linear(feature_dim, hidden_dim) self.attention_fc3 nn.Linear(hidden_dim, 1) # 包级分类头 self.classifier nn.Sequential( nn.Linear(feature_dim, 128), nn.ReLU(inplaceTrue), nn.Dropout(0.5), nn.Linear(128, 3) ) def forward(self, bag_features): # bag_features: [batch, num_instances, feature_dim] # 门控注意力 gate torch.sigmoid(self.attention_fc2(bag_features)) hidden torch.tanh(self.attention_fc1(bag_features)) * gate scores self.attention_fc3(hidden).squeeze(-1) # [batch, num_instances] attn_weights F.softmax(scores, dim1) # 加权求和得到包特征 bag_feat torch.sum(attn_weights.unsqueeze(-1) * bag_features, dim1) logits self.classifier(bag_feat) return logits, attn_weights训练时一个容易忽略的细节是bag的batch拼接。由于不同图像的patch数量不同无法直接堆成规则张量我用了一个简单的collate策略把同一batch内的所有实例特征按第一维拼接同时记录每张图对应的实例区间前向传播时先统一过特征提取器再按区间拆分后送入MIL模块。这样可以在一次前向中处理多个bag训练效率明显高于逐个bag迭代。4.3 损失函数与训练技巧DR分级是典型的有序分类问题等级之间有递进关系但直接套用交叉熵损失忽略了等级之间的远近关系。我尝试过两种改进第一种是把标签转成soft target例如真实标签为2级时目标分布设为[0.05, 0.15, 0.6, 0.15, 0.05]相当于给相邻类别一点的容忍度第二种是使用均方误差风格的回归损失把类别映射为连续值。实测下来soft target交叉熵的效果最稳定在五分类任务上比硬标签交叉熵准确率高了约2个百分点同时改善了相邻类别混淆的问题。优化器选用AdamW初始学习率设为1e-4权重衰减设为1e-4。特征提取器和注意力池化层采用不同的学习率特征提取器因为是微调预训练权重学习率乘0.1池化和分类头保持全量学习率。训练总轮数设为30轮使用CosineAnnealingLR调度器把学习率从1e-4衰减到1e-6。Batch size取16个bag每个bag约30个实例等效于一次前向处理约500个patch显存占用约11GB单卡RTX 2080Ti可以跑动。训练完成后用验证集上AUROC最高的checkpoint来做测试而不是用最后一轮的权重这个细节对于医学图像任务特别重要因为模型往往在验证集性能到达峰值后开始对训练集的噪声过拟合。5. 实验结果、可解释性与坑位排查5.1 性能表现与消融对比在EyePACS的30%数据子集上约26000张图按比例划分训练/验证/测试三分类任务的测试结果如下准确率86.7%加权F1分数0.86三分类AUROC分别为0.97无病变、0.91非增殖期、0.94重症期。作为对比用相同ResNet50骨干直接把整图缩放做三分类准确率只有79.2%AUROC平均下降约5个百分点。这个差距说明MIL的分块策略确实有效模型能够利用局部细节做更精细的判别。消融实验也验证了各组件的必要性。去掉门控机制改用标准Attention MIL准确率下降约1.3个百分点去掉重叠分块策略改为无重叠网格切分准确率下降2.1个百分点把特征提取器换成ResNet18准确率下降3.5个百分点。这些数字说明在MIL框架下输入侧的分块策略和特征提取能力对性能的影响大于池化层的复杂度。还有一个有意思的发现把三分类改回五分类后准确率掉到了72.4%但相邻等级混淆的比例高达65%。这说明MIL-DR的瓶颈已经从“是否能发现病灶”转变为“精细分级所需的数据标注质量”。如果项目目标是辅助临床决策三分类的“筛查转诊”模式比五分类更实用。5.2 注意力可视化模型在关注什么MIL对比普通分类模型最大的优势就是自带一定程度的可解释性。训练完成后我把测试图像的每个patch注意力权重映射回原图位置叠加成热力图用OpenCV的applyColorMap转成伪彩图。观察后发现一个令人鼓舞的现象在重症样本中模型注意力权重较高的patch基本集中出血点密集区域和渗出物聚集部位而这些区域恰好是眼科医生诊断时重点关注的区域。不过也发现了一个需要注意的现象有少量样本的注意力集中在视盘边缘或者图像边界的血管上这可能是训练标签噪声导致的。为了缓解这个问题我在后处理中加了一个先验惩罚项——如果某个patch与视盘区域的重叠面积过大则把它的注意力权重乘上一个0.7的衰减系数。这个操作在验证集上带来了0.8个百分点的提升属于“引入领域知识辅助弱监督模型”的典型做法。5.3 常见问题与解决方案训练和调试过程中踩了不少坑这里集中记录一下希望对后来者有用。第一个是注意力坍塌attention collapse现象。训练初期模型倾向于把注意力权重平均分配给所有patch随着训练推进逐渐集中到少数几个patch。但如果学习率设置过高或数据增强过强注意力会过早收敛到一两个patch上导致模型忽略了其他潜在有效区域。解决办法是降低初始学习率并给注意力权重加一个熵正则项鼓励权重分布保持一定分散度。熵正则的系数我最终定为0.01太小没效果太大会让模型学不出重点。第二个问题是GPU显存爆炸。实例数量多、特征维度高反向传播时显存消耗成倍增长。在8GB显存以下的显卡上训练时可以冻结特征提取器只更新注意力池化和分类头这样单卡就能跑通完整流程只是准确率略有下降。另一个替代方案是预先对所有训练图像提取并缓存实例特征训练时直接从缓存加载特征跳过CNN前向传播这样可以大幅提升迭代速度。我实测过缓存特征后一轮训练只要3分钟而端到端训练一轮要25分钟。第三个问题是跨数据集性能下降。在EyePACS上训练好的模型直接拿去测试Messidor-2准确率下降了约10个百分点。主要原因是两个数据集的拍摄设备、光照条件和图像分辨率分布不同。缓解手段是引入域适应策略或者进行多数据集联合训练。我采用的做法是训练时按比例混合两个数据集的样本同时在预处理阶段做更强的色彩归一化用每个数据集的均值和标准差做标准化最终在Messidor-2上把准确率差距缩小到5个百分点以内。5.4 针对MIL-DR的调参避坑清单整理一张速查表覆盖MIL-DR核心环节最常见问题和我的处理建议。问题现象可能原因解决方案注意力权重分布均匀训练不收敛学习率过低或特征未充分预训练提高学习率到3e-4确认特征提取器可用注意力集中到背景或视盘区域训练标签噪声、实例信息量差异大引入视觉任务通用的区域先验惩罚或过滤低信息量patch验证集性能波动大bag实例数量差异大、batch内bag样本不足增大batch到32个bag或对超长bag做随机采样固定实例数2级和3级混淆严重标签噪声大、类别间特征相似度高合并类别或使用soft target训练预测分数普遍偏向多数类类别不均衡使用加权采样器或焦点损失Focal Loss增广后病灶位置偏移严重数据增强引入过强几何变换移除随机旋转和随机裁剪仅保留翻转和色彩抖动在实际使用中我发现MIL-DR这类方法有一个天然优势它天然适配分布式推理。因为每个patch的特征提取是相互独立的可以通过多线程或分布式框架并行计算池化阶段的计算量几乎可以忽略。这意味着即使没有昂贵的GPU集群用几张中端显卡做并行patch推理也能在秒级完成一张眼底图像的预测完全满足临床筛查场景对实时性的要求。这个项目做下来我最大的体会是多实例学习不是银弹但它恰恰命中了医学图像“大图、稀疏病灶、弱标注”这个痛点的要害。如果一项任务满足“整体标签容易获得、局部关键信息决定整体类别、图像分辨率不适合直接缩放”这三个条件MIL大概率比整图分类更合适。而把MIL应用到DR分级这件事除了技术选型本身数据处理和调参细节对最终效果的影响甚至超过模型架构的选择。实验证明合理分块、门控注意力、soft target这几个简单改动叠加起来比换一个更深的骨干网络带来的收益要高得多。这套方案后续还可以扩展的方向包括把时间维度的多张随访图像纳入MIL框架做病情进展预测或者把注意力权重作为先验信息送入目标检测模型做病灶定位感兴趣的读者可以沿着这两条线继续深入。本文还有配套的精品资源点击获取
返回列表