【科研笔记】《Semi-Supervised PR Virtual Staining for Breast Histopathological Images》


说明:本文将继续不定时更新,最后也会把源码公开,但由于本人并非论文的原作者,因此,征求原作同意及代码重构都需要一定的时间。请谅解!

0.引言

近期组内同学的论文《Semi-Supervised PR Virtual Staining for Breast Histopathological Images》被MICCAI2022接收,这项工作是一项十分难得且精巧的工作,因此我决定将这篇文章介绍一下,就是复现起来比较麻烦。特此写出本文供大家参考。由于跑数据是在服务器上,而上传代码经过了一定的整理,有些代码位置可能发生了变化,仅供大家参考。

1.文章介绍

1.1 引言

1.2 方法

1.2.1 配准

1.2.2 半监督GAN

1.3 实验

1.4 结论

2.配准

3.整理数据

※说明:整理数据过程很是繁琐,由于该代码最初并非本人所写,因此里面很多流程都需要大家自己去更改代码的路径,也需要自己去建文件夹或改名,本教程也只能给大家一个大概的指引,望大家谅解。

3.1 将HE和IHC的WSI切图

首先要知道,我们拿到的图片都是sdpc这种格式的WSI,也就是说,这种格式在一开始就必须通过一些特殊的软件去访问,我们采用的是深圳市生强科技有限公司的扫片软件,先通过这个阅片软件把数据从sdpc转为svs文件,目录的组织结构是这样的,总的目录下,有35个文件夹,一个文件夹代表着一个患者,每个患者里头有1个HE.svs和1个HSP70.svs。这些原始的的svs被放置在/data112/lizx/data/svs1路径下。如图3.1.1所示:

图3.1.1

之后,这些svs将被切图,使用的是create_patches_HE.py和create_patches_IHC.py,这两个脚本的作用只是将svs的图片切出来,并变成h5格式的文件。这一步操作过后,数据被存储在了/data112/lizx/SSPRVS/origin_data路径下,组织形式如图3.1.2所示。这里要注意,一开始IHCdata和HEdata文件夹下面不是1-35这样的子文件夹,而是患者的病历号,也就是大家在图3.1.1里看到的一长串数字,这都需要我们在后期命名的时候再改,或者也可以通过脚本处理一下,但是要记住序号1-35和原病历号的对应关系。

图3.1.2

真正把这一整个h5文件分离成多个png的,还是得靠h5topng.py,经过这么一处理,数据的组织形式就变成了这种形式。如图3.1.3所示,HEdata文件夹内每一个患者的子文件夹里的HE文件夹内会存放切出来的patch,而IHCdata文件夹内每一个患者的子文件夹里的HSP-70文件夹内会存放切出来的patch。

图3.1.3
到这一步,我们的切图工作就算完成了。

※注意,在整张图里,可能会存在一个对照区,医生根据这个对照区来诊断病例,这个对照区是一定要切下去的,否则会严重影响我们的配准工作。生成的patch里,这一部分对照区当然也不能存在,此外,应删除部分完全空白的patch,可以根据文件大小来判断,凡是文件小于30kb的,我们都可以认为这是空白并加以删除。

※【1】如果你第一次复现的时候和我一样很不幸地没有删除,无关对照区已经生成出来了,那就使用我提供的0_remove_irrelative_images.ipynb去删除吧,因为对照区一般都在右边,而patch对的命名中,用下划线_将文件名字符串split,倒数第二位就是横坐标,倒数第一位就是纵坐标,你可以测量一下对照区在右侧的宽度占图片总宽度的比例,用该比例乘最大的横坐标,就知道横坐标大于某个数值的patch应当被删去,这个横坐标临界值就是0_remove_irrelative_images.ipynb脚本里img_id这个变量存储的内容,当你print所有命令之后,把所有命令移动到shell脚本里,运行shell脚本就可以快速删除图片啦。另外,除了patch之外,mask也需要把对照区裁掉,如果使用画图,画图会强行为你加一个通道,也就是透明度通道,会造成麻烦,可以使用我提供的脚本transfer_4channels_to_3channels.py把4通道转换为3通道。

※【2】同理,删除空白的patch则是使用2_delete_white.ipynb这个文件,至于为什么会有i>100000这条判断语句,因为如果一下子删掉的图片太多,服务器很可能会崩掉,所以最好一批一批删,而且在删除HE的时候最好把IHC的部分注释掉,删除IHC的时候则注释掉HE,不然实在会很麻烦。

3.2 配准

接下来我们就要进行配准工作的预处理。

首先,/data112/lizx/SSPRVS/prepare_data.py这个文件是专门用来整理出最初配准所需要的数据的,该脚本是把之前IHCdata/患者序号/mask里的png图片存放到一个统一的Registration_data文件夹内,如图3.2.1所示。同时,一定别忘了使用to_csv.py在Registration_data下生成一个csv文件,用于存储图片路径的信息。

图3.2.1

注意到/data112/lizx/SSPRVS/DeepHistReg文件夹下有一个path.py,事实上这是专门用于存储数据路径的地址。然后采用parse_to_mha.py将原有的WSI进行下采样缩小尺寸,因为原来的图片太大了。本脚本还会完成png格式的文件转化为mha的工作。转换之后的图片被存入MHAdata这个文件夹里,数据组织形式如图3.2.2所示。

图3.2.2
然后是利用prepare_datasets_linyy.py和prepare_RGB_datasets.py分别去获取单通道的MHA和RGB三通道的MHA,分别被我保存在了One_channel_data_preparation和RGB_channel_data_preparation这两个文件夹里,这两个文件夹的目录结构也很类似,所以只放前者作为参照,如图3.2.3所示。

图3,2.3
之后启用main.py,就执行了配准操作。我们配准的目的是,因为对于每个patch,我们只知道IHC的阴阳性,不知道HE的阴阳性,我们配准之后就可以知道HE的阴阳性,但是IHC和HE的图片不可能完全一致,所以我们才会用配准让二者的形式尽可能吻合,这就是我们的思路。最后使用mha2png.py把配准完成之后的mha转化为png格式。

配准结束后数据的组织形式是这样的,如图3.2.4所示。其中的source是原图片,target是目标图片,而transformed_target是转换出来的。
图3.2.4

至此配准部分完成!

3.3 生成标签

我们需要的只是这个图中的transformed_target,这就是配准后的IHC,用它去生成mask,作为HE的mask。我们看到SSGAN根目录底下有一个HE_mask.py就是专门实现这个功能的。不过他要求所有的数据必须都位于一个文件夹内,现在我们就要进行一些改动了。这将分为重命名、移动位置、打标记3个部分。

重命名部分

3_change_filename.ipynb是用来对文件进行批量重命名的,在重命名部分,一张图片必须包含这是来自哪一位患者,比如说我们看下面这张图3.3.1是改名之后的/data112/lizx/SSPRVS/origin_data/HEdata/1/HE,文件1_HE_1616_45456当中,1就是患者序号,HE是patch类型,1616和45456是坐标,所有文件都被这么命名。

图3.3.1
移动位置部分

4_copy_the_data.ipynb用于移动patch数据,可以看到,被移动后的数据组织如图3.3.2所示。一共35位患者,1-27号每个人取3000张HE和3000张IHC,这些数据被分别放置在HE_train和IHC_train里,而test则是从28-35号病人中选择每人3000张HE和IHC放入对应的HE_test和IHC_test里,这四个文件夹里没有其他子文件夹,直接就是所有的patch。为了便于显示,我们从28-35号病人的IHC中选择15张强阴性和15张强阳性放在IHC_test_simple里,然后挑选位置接近的HE的切片放入HE_test_simple里,这就组建了简明版测试集。

另一方面,我们为了打标记,还得把所有的mask给移过来才行。我们首先在SSGAN的data里建立一个文件夹叫origin1,这个文件夹里存储的就是为了生成mask而汇聚的数据。然后编写脚本1_data_organization.ipynb,具体内容可以参见后面我的github,然后把这个地方的代码运行,输出结果粘贴到shell脚本1_data_organization.sh中,就可以坐到批量运行许多代码了。复制结果也就因此完成,这些复制出来的图片皆被保存在origin1里。具体而言,路径就在/data112/lizx/SSPRVS/SSGAN/data/HE2IHC这里。如图3.3.2所示。

图3.3.2

打标签部分

接下来我们运行mask.py,这个mask结果会被保存在与origin1同级的IHC_mask文件夹里。

现在mask有了,到了打标签的时候了。这里要用到的是HE_label.py这个脚本,那么这个地方,我们要对数据进行重新整理。首先要用到刚刚的mask,这里的maskdir就是刚刚我们存储mask的地方,datadir自然就是datadir = “/data112/lizx/SSPRVS/SSGAN/data/HE2IHC/HE_train”。另外的IHC_label.py也是同理,只不过是针对IHC进行标记。好了现在标签也打完了,你发现了么,就在图片名称的末尾哦。

4.主试验部分

这一部分主要使用main.py这个脚本,里面要注意更改保存模型和可视化结果的位置。训练过程中终端显示是这样的,如图4.1所示:

图4.1
源代码理解起来难度不大,每隔20代,模型会输出一次生成器损失和判别器损失,每隔2000代,可以看一次可视化结果,展示如下,如图4.2所示:

图4.2

第一行是原始HE,第二行是生成的IHC,第三行是重建的HE,第四行是原始IHC,第五行是生成的HE,第六行则是重建的IHC。对比第四行,你可以知道第一行是阴性还是阳性,因为第一行是在第四行附近的地方取得的,那么你就可以看到第二行染色效果如何了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲤鱼王的成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值