Boundary-loss数据加载器实现揭秘:距离图预处理流程与关键代码解析

发布时间:2026/7/27 16:14:29
Boundary-loss数据加载器实现揭秘:距离图预处理流程与关键代码解析 Boundary-loss数据加载器实现揭秘距离图预处理流程与关键代码解析【免费下载链接】boundary-lossOfficial code for Boundary loss for highly unbalanced segmentation, runner-up for best paper award at MIDL 2019. Extended version in MedIA, volume 67, January 2021.项目地址: https://gitcode.com/gh_mirrors/bo/boundary-lossBoundary-loss项目是MIDL 2019最佳论文 runner-up专注于解决高度不平衡分割问题。其核心创新点在于通过边界损失函数提升医学影像分割精度而数据加载器与距离图预处理是实现这一目标的关键技术环节。本文将深入剖析数据加载器的实现细节揭示距离图预处理的核心流程与代码逻辑。数据加载器架构概览Boundary-loss的数据加载系统主要通过dataloader.py实现采用PyTorch的Dataset和DataLoader架构支持多模态数据输入、在线数据增强和距离图动态生成。核心类SliceDataset负责数据读取与预处理配合自定义的PatientSampler实现患者级别的数据分组避免训练过程中的数据泄露。# 核心数据加载类定义 class SliceDataset(Dataset): def __init__(self, filenames: list[str], folders: list[Path], are_hots: list[bool], transforms: list[Callable], debugFalse, quietFalse, K4, in_memory: bool False, spacing_dict: dict[str, Tuple[float, ...]] None, augment: Optional[Callable] None, ignore_norm: bool False, dimensions: int 2, debug_size: int 10, no_assert: bool False) - None: # 初始化参数与数据检查 self.folders: list[Path] folders self.transforms: list[Callable[[Tuple, int], Callable[[D], Tensor]]] transforms self.are_hots: list[bool] are_hots self.filenames: list[str] filenames # ... 其他初始化逻辑数据加载流程主要包含三个阶段文件验证与加载、多模态数据转换和距离图生成。系统支持.png和.npy两种格式的文件输入并通过transforms参数灵活配置不同数据类型的预处理流程。距离图预处理核心流程距离图Distance Map是Boundary-loss实现边界感知的基础通过计算像素到目标边界的欧氏距离为损失函数提供边界位置信息。预处理流程主要通过utils.py中的one_hot2dist函数实现将One-Hot编码的分割标签转换为距离图。距离图生成算法距离图生成采用欧氏距离变换Euclidean Distance Transform具体实现如下def one_hot2dist(seg: np.ndarray, resolution: Tuple[float, float, float] None, dtypeNone) - np.ndarray: assert one_hot(torch.tensor(seg), axis0) K: int len(seg) res np.zeros_like(seg, dtypedtype) for k in range(K): posmask seg[k].astype(np.bool) if posmask.any(): negmask ~posmask res[k] eucl_distance(negmask, samplingresolution) * negmask \ - (eucl_distance(posmask, samplingresolution) - 1) * posmask return res算法核心步骤对每个类别K创建二值掩码posmask计算背景区域negmask到最近前景像素的距离计算前景区域到最近背景像素的距离组合距离值生成带符号的距离图背景为正前景为负数据转换管道在dataloader.py中距离图生成被集成到数据转换管道通过dist_map_transform函数实现def dist_map_transform(resolution: Tuple[float, ...], K: int) - Callable[[D], Tensor]: return transforms.Compose([ gt_transform(resolution, K), lambda t: t.cpu().numpy(), partial(one_hot2dist, resolutionresolution), lambda nd: torch.tensor(nd, dtypetorch.float32) ])该转换链将原始标签经过以下处理gt_transform将标签转换为One-Hot编码转换为NumPy数组进行距离计算one_hot2dist生成距离图转换回PyTorch张量供模型使用关键代码解析与优化技巧高效数据加载策略SliceDataset采用内存映射Memory Mapping技术通过load_images静态方法实现数据的按需加载或全内存加载staticmethod def load_images(folders: list[Path], filenames: list[str], in_memory: bool, quietFalse) - list[list[F]]: def load(folder: Path, filename: str) - F: p: Path Path(folder, filename) if in_memory: with open(p, rb) as data: res io.BytesIO(data.read()) return res return p # ... 加载逻辑通过in_memory参数控制加载模式全内存模式适合小数据集加载速度快按需加载适合大数据集节省内存空间患者级数据采样PatientSampler确保同一患者的所有切片不会同时出现在训练集和验证集中避免数据泄露class PatientSampler(Sampler): def __init__(self, dataset: SliceDataset, grp_regex, shuffleFalse, quietFalse) - None: filenames: list[str] dataset.filenames grouping_regex: Pattern re.compile(self.grp_regex) stems: list[str] [Path(filename).stem for filename in filenames] matches: list[Match] map_(grouping_regex.match, stems) patients: list[str] [match.group(1) for match in matches] # ... 患者分组逻辑通过正则表达式提取患者ID将同一患者的切片分组确保训练和验证的患者集合完全分离。预处理效果可视化距离图预处理显著提升了边界分割精度特别是在小目标和复杂边界区域。以下是ACDC数据集上的分割结果对比图ACDC四类别数据集上不同损失函数的分割结果对比。与CE损失和DSC损失相比边界损失能够更准确地分割目标边界。从左到右分别为Ground Truth金标准、CE损失结果、DSC损失结果和Boundary损失结果。可以清晰看到Boundary损失在心肌内膜和外膜边界的分割精度明显优于传统损失函数。另一组WMH脑白质高信号数据集的对比更直观展示了边界损失的优势图WMH数据集分割结果对比。(a)金标准 (b)GDL损失结果 (c)GDL边界损失结果。边界损失有效减少了假阳性和假阴性区域。实际应用与扩展多模态数据支持系统通过transforms参数支持多种数据类型例如png_transform处理PNG格式的医学影像npy_transform处理NumPy数组格式的 volumetric数据equalized_png带直方图均衡化的PNG预处理自定义损失权重生成unet_loss_weights_transform函数生成基于距离图的动态损失权重进一步提升边界区域的分割精度def unet_loss_weights_transform(resolution: Tuple[float, ...], K: int) - Callable[[D], Tensor]: w_0: float 10 sigma: float 5 def closure(in_: D) - Tensor: gt: Tensor gt_transform(resolution, K)(in_) signed_dist_map: Tensor dist_map_transform(resolution, K)(in_) dist_map: Tensor torch.abs(signed_dist_map).type(torch.float32) # ... 权重计算逻辑 return final return closure通过指数函数将距离值转换为损失权重使边界区域获得更高的训练关注度。快速上手指南要使用Boundary-loss的数据加载系统只需三步克隆仓库git clone https://gitcode.com/gh_mirrors/bo/boundary-loss配置数据集路径修改main.py或相应的.make文件如acdc.make、wmh.make设置数据路径运行训练make -f acdc.make系统会自动处理数据加载、距离图生成和模型训练的全过程。总结与展望Boundary-loss的数据加载器通过高效的距离图预处理流程为边界感知分割提供了强大支持。核心创新点包括动态距离图生成算法精确捕捉边界位置信息灵活的数据转换管道支持多模态医学影像患者级数据采样确保训练有效性基于距离的动态损失权重提升边界分割精度未来可以进一步优化的方向3D距离图的高效计算多尺度边界特征融合自适应分辨率调整通过深入理解这些实现细节开发者可以更好地将边界损失技术应用到自己的医学影像分割项目中解决高度不平衡数据的分割挑战。【免费下载链接】boundary-lossOfficial code for Boundary loss for highly unbalanced segmentation, runner-up for best paper award at MIDL 2019. Extended version in MedIA, volume 67, January 2021.项目地址: https://gitcode.com/gh_mirrors/bo/boundary-loss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考