
前言这次我们来看一个医学图像 AI 领域比较有代表性的方法OTLesMix。它的核心不是做一个大模型而是解决一个很实际的问题——病灶太少了模型学不够。在医学影像中带标签的病灶数据往往稀缺、形态多样、位置分散而模型要学到的恰好又是“形态变化大、位置分布广”的病灶特征。OTLesMix 的思路很直接既然真实病灶少就用数学工具按形态和位置“合成”出更多合理的病灶。它不靠 GAN也不靠扩散模型而是引入最优传输里的Wasserstein Barycenter和Optimal Transport Map来生成病灶。这篇文章会围绕四个问题展开OTLesMix 到底做了什么和 CutMix、MixUp 这些常见增强方法有什么区别。Wasserstein Barycenter 和 Optimal Transport Map 在病灶生成中分别承担什么角色。如果要从代码层面复现或验证这套方法环境、数据、训练流程怎么搭。实际使用时有哪些坑显存、数据格式、评估指标分别怎么看。无论你是做医学图像分割、检测还是做数据增强方向的研究这篇文章都值得往下看。1. 核心能力速览能力项说明项目类型医学图像合成病灶生成方法研究方向/算法级实现核心方法Wasserstein Barycenter 求病灶形态重心Optimal Transport Map 实现病灶形态与位置迁移主要功能从已有病灶生成形态更多样、位置更分散的合成病灶用于增强分割/检测训练集适用模态常见于 CT、MRI 等 3D 医学影像也可扩展到 2D 切片与 GAN 类的区别不需要对抗训练依赖最优传输数学框架合成过程更可控需要哪些额外数据病灶掩码mask或标注框不需要额外的真实图像硬件门槛训练阶段建议 GPU显存需按 2D/3D 和输入尺寸测试推理阶段单张图像生成可尝试 CPU是否支持一键启动取决于作者是否提供完整代码仓库通常需要自行配置环境是否支持 API论文方法一般不带 Web API需要自己封装是否支持批量任务合成病灶过程天然支持批量处理适合离线数据增强适合场景小样本病灶分割、不平衡数据集增强、域泛化研究需要提醒的是目前公开材料中没有作者提供的完整可用代码仓库时下面所有代码都是通用模板用来表达实现思路不能直接当作项目脚本运行。实际部署要以具体开源实现为准。2. 方法原理Wasserstein Barycenter 和 Optimal Transport Map2.1 为什么不能用普通的 CutMix / MixUp在自然图像里CutMix 的用法是从一张图里裁一块放到另一张图上标签也跟着混合。这个方法在分类任务里有效但在医学病灶增强里会有问题病灶不是规则矩形直接裁切会把健康组织也切进来。病灶形态多变矩形拼接生成的图像看起来不真实。位置随意摆放可能违背人体结构约束比如病灶出现在不该出现的解剖位置。医学图像通常要求掩码精确到像素级简单拼贴会产生明显边界伪影。OTLesMix 的思路是把“形态”和“位置”分开处理用最优传输的方法让病灶形状发生可控变形再通过重心计算和映射把病灶放到新的合理位置。2.2 最优传输将病灶形态变化建模成映射问题最优传输Optimal Transport, OT研究的是“如何以最小代价把一个分布搬运到另一个分布”。病灶形态本质上也可以看作一种二维或三维空间中的质量分布。比如病灶 A 和病灶 B我们可以把 A 的像素密度分布通过一个最优传输映射变换到 B 的分布附近。这里的关键是最优传输映射天然带有几何意义。它给出的不只是“哪些点变到哪些点”还保留了空间的连续性和拓扑结构。因此用它来变形病灶不会把病灶撕裂成不连贯的区域。在 OTLesMix 里Optimal Transport Map 承担的任务主要是给定源病灶和目标病灶找到两者之间像素位置对应关系根据对应关系对源病灶进行插值或变形产生从“源形态”过渡到“目标形态”的中间形态。这样就不需要训练一个生成模型而是直接通过数学计算完成形态插值。2.3 Wasserstein Barycenter多病灶形态求重心Wasserstein 距离也叫推土机距离Earth Movers Distance描述的是把一种分布变成另一种分布所需的最小搬运成本。Wasserstein Barycenter 则是多个这种分布的“重心”。给定 N 个病灶掩码计算它们在 Wasserstein 意义上的平均值得到一个能代表这群病灶“共同形态特征”的掩码。这个重心有什么用举个例子输入 3 个肝肿瘤掩码一个偏圆、一个偏长条、一个形态不规则它们的 Wasserstein Barycenter 可能是一个覆盖三者形态特征的形态通过在各个病灶与重心之间做插值参数 t 调控就能得到一系列介于两者之间的新病灶形态t 越接近 0越接近原始病灶越接近 1越接近重心。换句话说Barycenter 的作用是提供一个“形态锚点”配合最优传输映射让合成病灶既保有原来的纹理特征又能产生新的合理形态。2.4 OTLesMix 与 GAN、扩散模型的区别对比项OTLesMix/OT 方式GAN扩散模型是否需要对抗训练否是否实现难度数学计算相对轻量训练不稳定调参难训练和采样成本高合成可控性有明确的形态插值和位置映射较可控通常控制粒度较粗需要额外引导才能精确控制数据需求有病灶掩码即可需要大量训练数据需要大量训练数据计算成本低到中中到高高适合场景小样本增强、数据扩充大规模图像生成高质量生成但资源消耗大OTLesMix 的优势恰恰在于它对数据量和计算资源的要求比较低。它不是从头“画”一个病灶而是基于已有病灶做形态和位置的“插值迁移”因此在小样本的医学影像场景下更实用。3. 适用场景与使用边界3.1 适合谁用做病灶分割的研究者训练集里病灶数量不足想扩展训练数据。做小样本医学图像分类的人利用合成病灶增强稀有类别。做域泛化研究的人希望模型见过更多“形态变化”的病灶提高泛化性。不想引入 GAN/扩散模型复杂训练流程的人用最优传输做数据增强流程更轻。3.2 不适合什么场景如果已经拥有大量真实病灶标注数据OTLesMix 的价值主要体现在数据多样性上不能替代真实数据。如果病灶没有明显形态边界例如弥漫性病变掩码本身难以定义最优传输的效果会受限制。如果下游任务要求合成图像必须和临床完全一致这类合成增强方法的可靠性需要额外验证。3.3 使用边界与合规提醒医学图像合成病灶存在明确的伦理和合规要求合成数据只能用于研究目的的模型训练验证不能直接作为临床诊断依据。涉及真实患者数据时必须遵守医院伦理审批、数据脱敏、患者隐私保护要求。生成的病灶不能用于伪造病例、学术造假或误导诊断。如果要发布合成图像数据集必须明确说明合成方式和适用边界。4. 环境准备与前置条件4.1 基础环境清单复现或参考 OTLesMix 这类方法环境上至少需要满足以下条件依赖项说明操作系统Linux 优先Windows/macOS 也能跑但要注意依赖兼容Python推荐 3.8 到 3.11具体看 PyTorch 版本PyTorch推荐 CUDA 版2.0 以上较稳定CUDA推荐 11.8 或 12.x看驱动版本医学图像库SimpleITK、NiBabel、MONAI用于读 nii.gz 等医学格式最优传输计算库推荐 POTPython Optimal Transport这是最常用的 OT 库GPU有 NVIDIA GPU 更好CPU 可以跑小尺寸实验但较慢4.2 安装 POT 库OTLesMix 的核心数学计算主要依赖最优传输工具包。最常用的库是POT安装命令pip install POTPOT 库提供了 Wasserstein 距离计算、Sinkhorn 近似、Barycenter 计算等方法是复现 OTLesMix 最快的起点。4.3 安装医学图像处理依赖如果你是处理 3D 医学图像如 .nii.gz 格式推荐安装pip install monai1.3.0 pip install simpleitk nibabel pip install numpy scipy scikit-image pip install matplotlib tqdmMONAI 是为了方便做医学图像预处理和数据加载SimpleITK 和 NiBabel 负责格式读写。如果只是做 2D 实验SimpleITK 配合 OpenCV 也可以。4.4 显存和磁盘空间显存需求取决于你处理的是 2D 切片还是 3D 体数据以及输入分辨率。这里给出一个经验区间但最终占用必须按你的实际设置测试输入类型推荐显存说明2D 切片6G 到 12G批量小的话 6G 可以跑3D 小体块裁剪12G 到 24G裁剪区域越小越省显存3D 全尺寸24G 以上全分辨率训练较吃资源磁盘空间主要看数据量。医学图像一个样本通常几十 MB 到几百 MB如果做大批量合成增强建议预留几十 GB 空间存放生成结果。5. 数据准备与病灶掩码处理OTLesMix 方法对数据格式有一定要求。核心输入是“病灶掩码”和“原始图像”。这里的掩码指的是标注的病灶区域可以是二值掩码也可以是概率图。5.1 数据目录结构建议data/ ├── images/ │ ├── patient_001.nii.gz │ ├── patient_002.nii.gz │ └── ... ├── labels/ │ ├── patient_001.nii.gz │ ├── patient_002.nii.gz │ └── ... └── synthetic/ ├── images/ └── labels/5.2 读取病灶掩码示例下面是一段基于 MONAI 的读图模板代码import torch from monai.data import ImageReader reader ImageReader() # 读取图像和标签 image, image_meta reader.read(data/images/patient_001.nii.gz) label, label_meta reader.read(data/labels/patient_001.nii.gz) image_tensor torch.tensor(image).float() label_tensor torch.tensor(label).float() # 二值化确保掩码取值为 0 或 1 label_binary (label_tensor 0.5).float() print(image shape:, image_tensor.shape) print(label shape:, label_binary.shape) print(病灶像素比例:, label_binary.sum() / label_binary.numel())5.3 提取病灶连通域实际场景里一个病人可能只有一处病灶也可能有多处。每个病灶的掩码应该单独提取出来作为 OT 计算的输入单位。常见做法是用连通域分析from scipy.ndimage import label # 对二值掩码做连通域标记 labeled_array, num_features label(label_binary.numpy()) lesion_masks [] for i in range(1, num_features 1): lesion_mask (labeled_array i).astype(float) lesion_masks.append(lesion_mask) print(检测到病灶数量:, len(lesion_masks))这一步很重要因为 Wasserstein Barycenter 计算的输入是“一个独立的病灶形态”而不是一整幅图。如果把多个病灶混在一起算重心形态会失真。5.4 归一化和重采样不同病人的 CT 图像像素间距和灰度范围可能不一致。建议在计算前做两件事重采样到统一的 spacing例如1.0 x 1.0 x 1.0mm灰度裁剪到 [0,1] 范围或使用窗宽窗位归一化。6. OTLesMix 核心计算流程OTLesMix 的整体流程可以拆成四个阶段从训练集中提取病灶掩码集合。计算一组病灶的 Wasserstein Barycenter。基于最优传输映射将源病灶向目标位置或目标形态迁移。把生成的合成病灶贴回健康组织的对应位置。6.1 计算 Wasserstein 距离先看如何用 POT 计算两个病灶掩码之间的 Wasserstein 距离。以下代码针对 2D 掩码import numpy as np import ot def mask_to_points(mask, num_samples1000): 将二值掩码转换为点集。 只采样掩码内的坐标点。 coords np.argwhere(mask 0.5) if len(coords) 0: return np.zeros((1, 2)) if len(coords) num_samples: idx np.random.choice(len(coords), num_samples, replaceFalse) coords coords[idx] return coords.astype(float) # 假设两个 2D 病灶掩码 mask_a np.zeros((128, 128)) mask_b np.zeros((128, 128)) mask_a[40:80, 30:70] 1 mask_b[60:100, 50:90] 1 points_a mask_to_points(mask_a) points_b mask_to_points(mask_b) # 计算距离矩阵 M np.sum( (points_a[:, None, :] - points_b[None, :, :]) ** 2, axis-1 ) # 归一化权重 a np.ones(points_a.shape[0]) / points_a.shape[0] b np.ones(points_b.shape[0]) / points_b.shape[0] # 计算 Wasserstein 距离 wd ot.emd2(a, b, M, numItermax200000) print(Wasserstein Distance:, wd)这段代码的核心是把病灶掩码看成点的分布计算源点云到目标点云的最小搬运距离。距离越小说明两个病灶形态越接近。6.2 计算 Wasserstein BarycenterPOT 库提供了计算 Wasserstein Barycenter 的接口。对一组病灶掩码可以这样近似计算重心import numpy as np import ot def compute_barycenter(mask_list, num_bins_x64, num_bins_y64, reg0.01): 在批量网格上近似计算 Wasserstein Barycenter。 mask_list: 列表每个元素是 (H, W) 的二值掩码。 ref_h, ref_w mask_list[0].shape grid_x np.linspace(0, 1, num_bins_x) grid_y np.linspace(0, 1, num_bins_y) xx, yy np.meshgrid(grid_x, grid_y) grid np.stack([xx.ravel(), yy.ravel()], axis1) M np.sum( (grid[:, None, :] - grid[None, :, :]) ** 2, axis-1 ) M / M.max() distributions [] for mask in mask_list: # 把掩码缩放到网格大小 hist _resample_mask(mask, num_bins_y, num_bins_x) hist hist.ravel() if hist.sum() 0: hist np.ones_like(hist) / len(hist) else: hist hist / hist.sum() distributions.append(hist) weights np.ones(len(distributions)) / len(distributions) bary ot.bregman.barycenter( Anp.array(distributions).T, MM, regreg, weightsweights ) return bary.reshape(num_bins_y, num_bins_x) def _resample_mask(mask, h, w): from scipy.ndimage import zoom zoom_y h / mask.shape[0] zoom_x w / mask.shape[1] resized zoom(mask, (zoom_y, zoom_x), order1) return (resized 0.5).astype(float)需要留意的是真正的 Wasserstein Barycenter 在离散点云上计算十分耗时。POT库提供了多种近似算法包括 Sinkhorn 正则化方法。上面代码中加了正则项reg就是 Sinkhorn 近似。实际使用时需要根据病灶大小调整网格数和正则强度。6.3 最优传输映射与形态插值得到重心后OTLesMix 会通过最优传输映射Optimal Transport Map在两个病灶之间做形态插值。简单说把源病灶的点用最优传输映射搬运到目标位置插值参数 t 控制搬运的完成度t 步进扫描可以得到一系列中间形态。def interpolate_lesion(mask_source, mask_target, t0.5): 在源病灶和目标病灶之间进行最优传输插值。 简化实现基于点集插值。 points_src mask_to_points(mask_source, num_samples500) points_tgt mask_to_points(mask_target, num_samples500) # 计算代价矩阵 M np.sum( (points_src[:, None, :] - points_tgt[None, :, :]) ** 2, axis-1 ) # 求解最优传输规划 a np.ones(points_src.shape[0]) / points_src.shape[0] b np.ones(points_tgt.shape[0]) / points_tgt.shape[0] # 使用 Sinkhorn 求解 reg 0.01 G ot.sinkhorn(a, b, M, reg) # 插值映射 interp_points (1 - t) * points_src t * (G points_tgt) # 用插值后的点重建掩码 mask_result np.zeros_like(mask_source) for (x, y) in interp_points.astype(int): if 0 x mask_result.shape[0] and 0 y mask_result.shape[1]: mask_result[x, y] 1 from scipy.ndimage import binary_closing mask_result binary_closing(mask_result, iterations2).astype(float) return mask_result6.4 位置迁移合成OTLesMix 的另一个重要能力是让病灶“换位置”。这背后的思路是把病灶的最优传输映射推广到空间位置层面在健康组织上选择合理的解剖位置插入合成病灶。要实现这一点需要先定义“可插入区域”。不成熟的暴力做法是随机选一个点然后贴上去。更好的做法是限制到目标器官区域内部。具体实现可能涉及解剖先验知识例如肝病灶只能出现在肝脏分割区域内。7. 训练增强流程示例OTLesMix 在训练中的角色是数据增强模块。一个典型的分割训练 pipeline 应该这样组织每个 epoch 开始前随机抽取一组标注病灶计算重心、做形态插值、生成新病灶将新病灶嵌入到健康图像中合成图像和合成掩码进入分割模型完成一次前向传播和反向传播。7.1 合成病灶嵌入健康图像下面是一个简化的合成嵌入流程模板def paste_lesion(image, healthy_mask, lesion_mask, position): 将合成病灶贴到健康区域的图像上。 image: 原始图像 healthy_mask: 健康组织区域掩码 lesion_mask: 合成病灶掩码 position: 插入位置 (x, y) x, y position h, w lesion_mask.shape # 检查越界 if x h image.shape[0] or y w image.shape[1]: return image, None # 确保插入位置在健康区域内 region healthy_mask[x:xh, y:yw] if region.sum() 0.5 * h * w: return image, None # 生成合成掩码 new_label np.zeros_like(image) new_label[x:xh, y:yw] lesion_mask # 把病灶纹理覆盖到图像上 bg_mean image[x:xh, y:yw][lesion_mask 0.5].mean() lesion_texture image[x:xh, y:yw] * (1 - lesion_mask) synthesized lesion_texture lesion_mask * bg_mean new_image image.copy() new_image[x:xh, y:yw] np.where(lesion_mask 0.5, synthesized, image[x:xh, y:yw]) return new_image, new_label这里采用了极简的纹理复制策略。实际论文中极大概率会根据病灶内部的灰度分布、纹理信息做更精细的处理否则合成病灶和周围组织之间会有明显边界。真实实现通常还会加入高斯平滑、边界融合等步骤。7.2 训练循环集成在实际训练中OTLesMix 模块可以做成一个独立的增强函数挂在 dataloader 之前def otlesmix_augment(image, label, lesion_pool): 在训练时从病灶池中合成新病灶并嵌入当前图像。 if len(lesion_pool) 2 or np.random.random() 0.5: return image, label # 随机选两个病灶 idx1, idx2 np.random.choice(len(lesion_pool), 2, replaceFalse) lesion_a lesion_pool[idx1] lesion_b lesion_pool[idx2] # 随机插值系数 t np.random.uniform(0.2, 0.8) synthetic_mask interpolate_lesion(lesion_a, lesion_b, t) # 嵌入到当前图中 h_w synthetic_mask.shape pos_x np.random.randint(0, image.shape[0] - h_w[0]) pos_y np.random.randint(0, image.shape[1] - h_w[1]) new_image, new_label paste_lesion( image, label 0, synthetic_mask, (pos_x, pos_y) ) if new_label is None: return image, label return new_image, new_label这个模块的设计思路是“能用就用不行就退回原图”保证增强过程不会破坏训练稳定性。8. 效果验证与评估指标合成病灶生成方法好不好不能只看生成图像“像不像”更关键的是它能不能提升下游任务的性能。建议从三个层次验证。8.1 视觉质量验证检查合成病灶形态是否连续是否有空洞、撕裂检查合成病灶边界是否与周围组织过渡自然对比原始病灶直方图和合成病灶直方图观察灰度分布差异使用分割模型对其推理观察预测掩码是否稳定。8.2 下游任务性能验证以病灶分割为例验证方式说明原始训练集训练作为基线原始训练集 随机 CutMix 增强作为对比方法原始训练集 OTLesMix 风格增强实验组在独立测试集上比较 Dice、IoU、HD95衡量分割精度8.3 多样性验证多样性是合成数据的一个关键指标。如果生成的病灶全是一个模子那么增强效果会大打折扣。可以统计一组生成病灶的Wasserstein 距离两两分布形态特征分布面积、长轴短轴比位置坐标分布。如果这些统计量相对分散说明合成病灶确实覆盖了更大的形态和位置空间。8.4 计算代码示例import numpy as np def compute_dice(pred, gt): 计算 Dice 系数。 intersection np.sum(pred * gt) union np.sum(pred) np.sum(gt) if union 0: return 1.0 return 2.0 * intersection / union9. 资源占用与性能观察9.1 显存占用观察方式在训练过程中关注显存占用的方式最直接的是使用nvidia-smiwatch -n 1 nvidia-smi也可以使用 PyTorch 自带的内存统计import torch def print_memory_usage(): if torch.cuda.is_available(): allocated torch.cuda.memory_allocated() / 1024**3 reserved torch.cuda.memory_reserved() / 1024**3 print(f显存分配: {allocated:.2f} GB) print(f显存预留: {reserved:.2f} GB)9.2 影响资源占用的关键因素病灶裁剪尺寸OTLesMix 通常先裁出病灶区域计算区域越大计算量越大点云采样数量mask_to_points中的num_samples越大OT 计算越慢内存越高Sinkhorn 正则强度正则值越小收敛越慢计算越久网格分辨率Barycenter 计算的网格数比如 64x64 vs 256x256直接影响显存和耗时批量大小合成增强如果在线生成批量大会显著增加显存开销。9.3 CPU vs GPUWasserstein Barycenter 和最优传输映射的主体计算涉及矩阵运算。小尺寸2D切片、网格数64x64在 CPU 上就能跑但速度较慢。3D体数据、网格复杂度更高时建议用 GPU。POT 库底层支持部分 GPU 加速但不是所有接口都有 CUDA 实现实际使用时要查当前版本的 API 文档。9.4 降低资源占用的建议离线预处理阶段生成合成数据不要把 OT 计算放到训练循环里实时跑对病灶做中心裁剪和归一化统一到固定尺寸降低num_samples和 Barycenter 网格分辨率适当增大 Sinkhorn 正则项收敛更快使用混合精度训练减少显存占用。10. 常见问题与排查方法问题现象可能原因排查方式解决方案安装 POT 失败Python 版本不兼容或缺少编译器查看 pip 安装日志升级 Python 或使用 conda 安装读取 nii.gz 失败文件路径错误或格式损坏用 SimpleITK 单独打开检查数据格式替换损坏文件Barycenter 计算耗时过长网格过大或正则过小打印每次计算耗时降低网格分辨率增大 reg计算出现 NaNSinkhorn 迭代发散或数据含 0 分布加断点检查中间值对 hist 加平滑增加正则项合成病灶掩码有空洞点云重建掩码时分辨率不足可视化中间掩码增加采样点数做形态学闭合嵌入位置出现重叠插入位置未检查健康区域约束可视化合成结果增加健康区域判断逻辑训练精度没有提升合成病灶与真实病灶分布差距过大统计合成数据和真实数据的分布调整插值系数范围结合原始数据混合训练显存溢出3D 计算或 batch 过大观察 nvidia-smi降低 batch、裁剪尺寸、使用梯度累积10.1 关于“效果不如预期”的排查思路这是最容易遇到的问题。合成增强方法并不是“加上就一定涨点”。如果实验结果显示没有提升可以从以下几个方向排查合成病灶是否在形态上和真实病灶差异太大导致模型学到了错误的特征。嵌入位置是否合理如果病灶被放到组织边界处模型学习会混乱。合成数据比例是否合理过高的合成比例可能降低模型对真实数据的敏感性。插值系数 t 的分布是否过于集中在 0.5缺少形态多样性。11. 最佳实践与使用建议11.1 数据层面建立病灶池时尽量覆盖不同形态、大小、位置的病灶。对病灶做尺度归一化避免大小差异过大影响 OT 计算稳定性。对掩码做形态学后处理去掉孤立点和零散小区域。划分训练集、验证集、测试集时确保患者级分离避免同一个患者出现在不同集合中。11.2 实验设计层面先离线生成一批合成数据观察可视化和统计分布确认合理后再进入训练。基线实验、CutMix 对照、OTLesMix 对照必须用相同训练配置。控制变量调整插值 t、合成比例、嵌入位置策略时一次只改一个变量。每个实验至少重复两次记录均值和方差。11.3 工程化层面合成阶段和训练阶段分离合成数据先生成好存硬盘训练时直接读取不占训练时间。批量生成时记录日志包括输入病灶 ID、插值系数 t、位置坐标方便复现。对合成数据做质量过滤例如计算合成掩码的面积是否在合理范围内。编码时注意使用随机种子保证实验可复现。11.4 合规层面使用真实医学图像时必须确认数据授权范围。合成病灶涉及患者隐私数据脱敏不能直接暴露原始患者信息。涉及人脸、器官、肿瘤等敏感医学内容时不允许在未经授权的情况下公开合成样例。12. 总结与下一步OTLesMix 这类基于 Wasserstein Barycenter 和 Optimal Transport Map 的合成病灶生成方法最大的价值在于提供了一种不依赖 GAN 和扩散模型、计算相对可控、语义上可解释的数据增强思路。它把病灶生成拆分成了“形态插值”和“位置迁移”两步每一步都有明确的数学定义因此特别适合医学图像小样本场景。如果你准备在自己的数据集上尝试建议从这三步开始先准备一个病灶掩码池统计它们的形态、大小分布。用 POT 库跑通两个病灶之间的 Wasserstein 距离和 Sinkhorn 插值确认能生成连续合理的中间形态。再把合成病灶嵌入到健康图像中按 8:1:1 的比例混合真实和合成数据对比分割模型 Dice 指标是否有提升。最容易踩的坑有两个一是把 OT 计算直接塞进训练循环导致训练变慢二是不控制合成病灶的解剖合理性把病灶放在了错误位置。前者建议离线生成后者建议加入区域约束。如果你已经在用 GAN 或扩散模型做病灶增强也可以尝试把 OTLesMix 当作前置筛选器用 OT 方式生成多样化候选病灶再用更重的生成模型做精修两者互补而不是互斥。方法本身并不复杂复杂的是如何把它嵌入到正确的数据流和实验设计里。建议先小规模跑通再逐步扩大。