MMSegmentation实现病理肿瘤分割全流程

MMSegmentation(MMseg)是OpenMMLab团队开发的、工业级的语义分割开源库,也广泛应用于病理影像分割。
其滑动窗口推理(inference_sliding)可高效处理超大医学影像(如WSI),适合病理肿瘤检测和分割。

下面详细介绍MMSegmentation中使用inference_sliding实现病理影像肿瘤分割模型的训练和检测完整流程,包括核心步骤和关键代码示例,适合项目实战和二次开发。


1. 环境准备

# 推荐conda环境,python 3.8/3.9
conda create -n mmseg python=3.8 -y
conda activate mmseg
pip install mmcv-full
pip install mmsegmentation
pip install opencv-python openslide-python

2. 数据准备与标注格式

  1. 原始WSI(.svs/.tif)大图,建议预处理为patch,或直接自定义数据读取方式

  2. 掩膜标签(.png/.tif)与WSI同尺寸或patch级别,像素级标注

  3. 目录结构建议

dataset/
  images/
    case1.png   # 或patch文件,如case1_patch001.png
    ...
  masks/
    case1.png   # 对应mask
    ...

也可以自定义数据集,继承 CustomDataset


3. 配置文件修改

以UNet、patch级训练为例(可用HRNet、SegFormer等MMseg模型)。

基本配置项如下:

  • data.train.img_dir/ann_dir:训练集图片和mask文件夹

  • data.val.img_dir/ann_dir:验证集

  • crop_size:训练时patch大小

  • model:分割模型结构(如UNet、DeepLabV3等)

  • runner.max_epochs:训练轮数

# config示例
img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)

train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations'),
    dict(type='RandomCrop', crop_size=(256, 256)),
    dict(type='RandomFlip', prob=0.5),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='DefaultFormatBundle'),
    dict(type='Collect', keys=['img', 'gt_semantic_seg']),
]

data = dict(
    train=dict(
        type='CustomDataset',
        img_dir='dataset/images',
        ann_dir='dataset/masks',
        pipeline=train_pipeline),
    val=dict(
        ...  # 同理
    )
)

推荐用 MMseg 官方UNet、DeepLabV3等分割模型。


4. 模型训练

python tools/train.py configs/your_config.py

训练过程自动采用 patch 采样(见 pipeline 里的RandomCrop),每次一个patch输入模型,减小显存压力。


5. 滑动窗口推理(inference_sliding)

MMSegmentation中大图推理推荐用inference_sliding

  • 将整张大图分为滑窗patch,单独推理后拼接结果,适合超大医学图像

  • 推理时窗口重叠可平滑边缘(如stride=128, crop_size=256)

推理流程代码示例

from mmseg.apis import init_segmentor, inference_sliding
import mmcv
import numpy as np
import cv2

# 1. 加载训练好的模型
config_file = 'configs/your_config.py'
checkpoint_file = 'work_dirs/your_exp/latest.pth'
model = init_segmentor(config_file, checkpoint_file, device='cuda:0')

# 2. 读取待分割大图
img = mmcv.imread('dataset/images/case1.png')  # WSI建议先转为tiff/png或用OpenSlide读取

# 3. 滑动窗口推理(crop_size窗口大小,stride滑窗步长,建议有重叠)
crop_size = (256, 256)
stride = (128, 128)

result = inference_sliding(model, img, crop_size, stride, batch_size=4)  # batch_size视显存定

# result.pred_sem_seg:即分割掩膜(与输入同尺寸)
pred_mask = result.pred_sem_seg[0].cpu().numpy()

6. 可视化结果

import matplotlib.pyplot as plt

plt.subplot(1,2,1)
plt.title("WSI Image")
plt.imshow(img[..., ::-1])
plt.subplot(1,2,2)
plt.title("Predicted Mask")
plt.imshow(pred_mask, cmap='Reds', alpha=0.5)
plt.show()

7. 高级技巧与注意事项

  • 超大WSI:建议分层/分块保存(用OpenSlide/大图切patch脚本),拼接全图mask需留意坐标。

  • 自定义数据集:如原始数据为OpenSlide格式,可继承 CustomDataset,在 get_gt_seg_map_by_idxget_img_info 中定制读取方式。

  • 多类别肿瘤/小目标:采样时可重点采集正负样本patch,提升训练效果。

  • TTA增强:MMseg支持多尺度/翻转推理提升精度。


8. 官方文档/示例


总结流程

  1. patch方式训练模型(减小显存需求)

  2. inference_sliding对超大病理图滑窗推理,高效全图检测肿瘤区域

  3. 可视化与评估,支持全自动批量分割

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值