【代码已开源】从QuPath标注到WSI组织分割

【代码已开源】从QuPath标注到WSI组织分割,支持QuPath导出ROI区域Patch,实施Patch级别的组织/肿瘤区域分割

WSI Segmenter 是一个基于轻量化分割网络 DeepLab v3 架构的病理切片肿瘤区域分割工具,可实现切片中 ROI(感兴趣区域)的分割,支持 QuPath 软件(版本 >= 0.4.2);该工具使用预训练的 ResNet 作为骨干网络,通过深度学习算法实现肿瘤区域分割。

仓库地址

https://github.com/HaoyuCui/WSI_Segmenter

功能介绍

  1. 病理切片的肿瘤区域分割(Patch-level的像素分割,低计算成本)
  2. 配合 QuPath 生成切片块与标注掩码
  3. 提供训练、可视化、预测的完整流程支持,可搭配Patch导出流程使用

安装

  1. 克隆本项目
  2. 运行 pip install -r requirements.txt

运行

  1. QuPath中标注,并指定类别为Tumor
    在这里插入图片描述

  2. 在 QuPath 中运行 make_tile_mask_pairs.groovy 生成Patch-Mask样本对。详情请参阅 image.sc

    请确保已在 QuPath 中添加注释,并在脚本中指定参数

    QuPath如何运行脚本文件? - 参照这篇博客:link

  3. 运行该步骤后,你将看到以下文件夹结构:

    ├── /PATH/TO/DATA
    │   ├── slide_1
    │   │   ├── patch_1.jpeg  # tile
    │   │   ├── patch_1.png  # mask
    │   │   ├── ...
    │   ├── slide_2
    │   │   ├── patch_1.jpeg  # tile
    │   │   ├── patch_1.png  # mask
    │   │   ├── ...
    │   ├── ...
    │   └── slide_n
    │       ├── ...
    │       └── patch_n.png
    

    示例结构可在 eg 文件夹中找到。

    后缀:

    • 原图为jpeg
    • 掩膜为png

    在这里插入图片描述

  4. 运行以下命令进行训练,并将训练过程可视化:

    python -m visdom.server
    
    python train.py --data_dir /PATH/TO/DATA --epochs 20
    

    预测结果(上图)和Ground-truth(下图)将在 visdom 服务器中显示和刷新。
    在这里插入图片描述

  5. 同样,也可以在导出Patch时使用,确保保存的Patch都位于ROI区域

    import torch
    from torchvision import transforms
    
    def tile_contains_tumor(tile, seg_model, device, threshold_tumor=0.5):
        tile = tile.convert("RGB")
        tile = tile.resize((256, 256))
        tile = transforms.ToTensor()(tile).unsqueeze(0).to(device)
        with torch.no_grad():
            seg_model.eval()
            output = torch.sigmoid(seg_model(tile)['out']).mean()
    
        if output < threshold_tumor:
            return True
        else:
            return False
        
    def TileExporter():
        # Tile/Patch导出代码
        pass
    
    if __name__ == "__main__":
        # 载入模型
        device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        # 载入前面训练得到的权重文件
        model = torch.load(r'best.pt').to(device) 
        tiles = TileExporter()
        for tile in tiles:
            if tile_contains_tumor(tile, model, device):
                # 逻辑1
            else:
                # 逻辑2
        # 保存结果
    

如果有问题,欢迎联系我。
欢迎Star、点赞和收藏,转载请注明出处,谢谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值