【代码已开源】从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、点赞和收藏,转载请注明出处,谢谢!

1、什么是9Path 它是一个对png图片做处理的一个工具,能够为我们生成一个"*.9.png"的图片 2、什么是"*.9.png" "*.9.png"是Android os里所支持的一种特殊的图片格式,用它可以实现部分拉伸,这种图片是经过9Path进行特殊处理过的,如果不处理的话,直接用PNG图就会有失真,拉伸不正常的现象出现。 3、9Path在哪里呢? 在Android SDK路径下X:/android sdk/tools里你会找到一个【draw9Path.bat】,双击启动9Path,官方名:NinePath 导入一张png图片,然后进入9Path的操作界面 图一: 序列 ① :在拉伸区域周围用红色边框显示可能会对拉伸后的图片产生变形的区域,如果完全消除该内容则图片拉伸后是没有变形的,也就是说,不管如何缩放图片显示都是良 好的。 (实际试 发现NinePatch编辑器是根据图片的颜色值来区分是否为bad patch的,一边来说只要色差不是太大不用考虑这个设置。) 序列 ② :区域是导入的图片,以及可操作区域。 序列 ③ :这里 zoom:的长条bar 是对导入的图放大缩小操作,这里的放大缩小只是为了让使用者更方便操作,毕竟是对像素点操作比较费眼,下面的 patch scale 是序列 ④区域中的三种形态的拉伸后的一个预览操作,可以看到操作后的图片拉伸后的效果。 序列 ④: 区域这里从上到下,依次为:纵向拉伸的效果预览、横向拉伸的效果预览,以及整体拉伸的效果预览 序列 ⑤: 这里如果你勾选上,那么当你鼠标放在 ② 区域内的时候并且当前位置为不可操作区域就会出现lock的一张图,就是显示不可编辑区域 ; 序列 ⑥: 这里勾选上,那么在④ 区域中你就会看到当前操作的像素点在拉伸预览图中的相对位置和效果。 序列 ⑦: 在编辑区域显示图片拉伸的区域; 如何操作 按着鼠标左键是选取需要拉伸的像素点,按着shift+鼠标左键取消当前像素点 操作区域 大家看到导入的png图片默认周围多了一像素点,也就是这一圈一像素点就是咱们的可操作区域。因为下方和右方可操作区域是指定内容的显示区域,属于可选区域,可不予理会;但是要注意内容区域的标记不能有间断,也就是说标记要连续且仅有一处,否则.9.png图片在放入项目下会报错。 主要大家注意Left 和 top 操作区域; Top操作区域的一排像素点,表示横向拉伸的像素点; Left操作区的一排像素点,表示纵向拉伸的像素点; 图二 (图一)然后对比(图二),看到区别了吧!很明显,(图1)我们没有任何操作,默认整体拉伸,那么拉伸的效果很明显的失真了...而(图2)我们指定了拉伸的像素点所以只是中间的被拉伸,图片的花边我们保留不拉伸这样看起来就好太多啦 娃哈哈、 然后通过9Path就可以保存出来一张“*.9.png”图片,我们放在android 项目的res 下的 drawable 下就可以拉!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值