Giter Club home page Giter Club logo

slfcd's Introduction

SLFCD

Supervised Learning Framework for Cancer Detection.

基于监督学习的癌症检测框架 , 该框架在根据全幻灯片癌症病理图像(Whole slide images, WSI)作为输入数据,实现了癌区域定位,以及基于WSI的图像分类。论文地址 如果本项目对您有所帮助,请给个star. ^.^

Read-only, 不做类似的项目了,仅仅做一个参考

基本概述

这个仓库主要包含了基于深度学习的癌症检测的源代码框架,开发用于从全幻灯片癌症病理图像(WSI)中识别癌转移。该框架成功应用于Camelyon‘16 grand challenge的数据集。我开发本项目主要是提供一个关于WSI检测的解决方案。

Notes

  • extras/CNNRF 是使用keras训练的相近项目
  • Debug camelyon16
    • extract_feature_probsmap.py
    • wsi_classification.py
  • Debug extras/CNNRF

Requisetes

  • Python (3.6)
  • Numpy
  • PyTorch
  • Openslide 3.4.1
  • etc.

数据

全幻灯片图像 (Whole slide images)

数据主要是来自Camelyon16挑战赛的*.tif格式的全幻灯片图像 (WSI)。您可以在Camelyon16上下载免费数据,不过建议您应当在获得官方批准之后再使用该数据。注意,一张全幻灯片图像通常在0级为~100k×100k像素,在磁盘上有1GB+的储存量。比赛数据一共有700张WSI,总计约700GB+数据,所以要确保有足够的磁盘空间。用于训练的肿瘤WSI命名为Tumor_×××.tif,其中xxx的范围是001到110。用于训练的正常WSI名为Normal_xxx.tif,其中xxx的范围是从001到160。用于测试的WSI名为Test_xxx.tif,其中xxx的范围从001到130。

标注 (Annotations)

Camelyon16组织官方还以xml的格式为每张肿瘤WSI提供肿瘤区域的注释。在本阶段,我已经将它转换成一些更简单的json格式。每个注释都是多边形列表,其中每个多边形都由其顶点表示。特别是阳性多边形表示肿瘤区域,阴性多边形表示正常区域。可是使用如下命令将xml格式转换为json格式。

python CAMELYON16/camelyon16/bin/camelyon16xml2json.py Tumor_001.xml Tumor_001.json

补丁图像 (Patch images)

虽然最初的400张WSI文件包含了所有必要的信息,但是由于高水平分辨率较高引起机器内存不足以及多分辨率的问题,它们并不适用于直接训练一个深度卷积神经网络 (CNN)。因此,我们必须采样更小的补丁图像,例如256×256,使得典型的CNN能够处理。**有效的采样信息和代表性的补丁图像是实现良好肿瘤检测性能的关键部分之一。**为了简化这个过程,本项目并为采用硬挖掘的信息挖掘技术进行提升模型性能。补丁图像的获取应当包含三个部分,掩码的生成、补丁图像中心坐标的筛选和补丁的获取。

  1. 使用python CAMELYON16/camelyon16/bin/tissue_mask.py Tumor_001.tif Tumor_001_tissue.npy 6获得Tumor_001.tif在level_6下的组织掩码Tumor_001_tissue.npy;

  2. 使用python CAMELYON16/camelyon16/bin/tumor_mask.py Tumor_001.json Tumor_001.tif Tumor_001_tumor.npy 6获得癌症掩码;

  3. 使用python CAMELYON16/camelyon16/bin/non_tumor_mask.py Tumor_001_tumor.npy Tumor_001_tissue.npy Tumor_001_normal.npy 6获得癌症WSI中除去背景正常区域的掩码;

  4. python python CAMELYON16/camelyon16/bin/sampled_spot_gen.py Turmor_001_tumor.npy train_spot.txt 1000 6获取随机的癌症区域中的坐标点。

  5. 获取补丁数据集

    python CAMELYON16/camelyon16/bin/patch_gen.py /WSI_TRAIN/ tumor_train.txt /PATCHES_TUMOR_TRAIN/
    python CAMELYON16/camelyon16/bin/patch_gen.py /WSI_TRAIN/ normal_train.txt /PATCHES_NORMAL_TRAIN/
    python CAMELYON16/camelyon16/bin/patch_gen.py /WSI_TRAIN/ umor_valid.txt /PATCHES_TUMOR_VALID/
    python CAMELYON16/camelyon16/bin/patch_gen.py /WSI_TRAIN/ normal_valid.txt /PATCHES_NORMAL_VALID/

    其中/WSI_TRAIN/是存放所有用于训练的WSI文件目录路径,/PATCHES_TUMOR_TRAIN/是存储生成的用于培训的肿瘤补丁的目录的路径。同样的命名也适用于/PATCHES_NORMAL_TRAIN//PATCHES_TUMOR_VALID//PATCHES_NORMAL_VALID/

模型 (Model)

框架主要包含两部分,一是基于CNN的补丁图像分类(肿瘤定位),另外一个是基于机器学习,比如SVM, 贝叶斯分类器等算法的WSI分类。本部分讲解概述性内容,具体问题请参考代码。

CNN

使用Inception_v3、ResNet、以及DenseNet模型作为特征提取器,改写模型最后一层全连接层,成为(1000-2)。建立补丁两分类预测模型,使得模型能够识别补丁为癌(1)的概率,输出为0-1。

WSI分类

本阶段主要通过各个热力图谱中提取的特征指标作为判断WSI是否是癌图像的依据,因此利用作为输入特征,通过机器学习方法,包括但不限于XGBoost、SVM、贝叶斯等作为WSI的分类器。

训练 (Training)

  1. CNN

利用生成的补丁图像,我们现在可以使用下面的命令训练CNN模型用来识别补丁图像;

python CAMELYON16/camelyon16/bin/train.py /cnn_path/cnn.json /SAVE_PATH/

其中/cnn_path/cnn.json包含了训练所需要的配置文件,/SCVE_PATH是您保存训练结果的文件夹。

  1. WSI分类

为了训练WSI分类器,首先需要将所有的训练集通过CNN模型得到概率热力图谱,[如下操作](#概率热力图谱-(Probability map));

然后在概率热力图中使用以下命令提取的特征:

python CAMELYON16/camelyon16/bin/extract_feature_robsmap.py probs_map_path wsi_path, feature_path

其中,probs_map_path为热力图路径, wsi_path为与热力图相对于的WSI路径,feature_path为需要保存的包好features的csv文件。

最终使用特征训练模型得到WSI分类器,以及对分类器进行ROC评价,都是使用下面的命令进行的:

python CAMELYON16/camelyon16/bin/wsi_classification.py probs_map_features_train.cvs probs_map_features_test.cvs TEST_CSV_GT

其中,probs_map_features_train.cvs为训练集, probs_map_features_test.cvs为测试集,TEST_CSV_GT为测试集WSI的label。

测试 (Testing)

组织掩码

经过训练的模型对WSI分析的主要测试结果是表示模型认为WSI上的肿瘤区域的概率图。当然,我们可以使用一种滑动窗口的方式来预测所有补丁为肿瘤的概率。但是由于WSI的大部分实际上是白色背景区域,所以这种滑动窗口的方式浪费了大量的计算。取而代之的是,我们首先计算一个二元组织掩模,表示每个patch是组织或背景,然后只对组织区域进行肿瘤预测。如下所示

获取给定输入WSI的组织掩码图像,请使用下面的命令行

python CAMELYON16/camelyon16/bin/tissue_mask.py Tumor_001.tif Tumor_001_tissue.npy 6

概率热力图谱 (Probability map)

使用生成的组织掩码,利用训练好的CNN模型获得概率热力图:

python CAMELYON16/camelyon16/bin/probs_map.py /WSI_PATH/Test_001.tif /CKPT_PATH/best.ckpt /cnn_path/cnn.json /MASK_PATH/Test_001.npy /PROBS_MAP_PATH/Test_001.npy

利用该模型生成癌区域热力图谱,如下所示:

肿瘤定位 (Tumor localization)

我们使用非最大抑制(nms)算法,在给定概率图的情况下,获得每个检测到的肿瘤区域在level 0 级的坐标。

python CAMELYON16/camelyon16/bin/nms.py /PROBS_MAP_PATH/Test_001.npy /COORD_PATH/Test_001.csv

其中/PROBS_MAP_PATH/是您保存生成的概率图的位置,/COORD_PATH/是您希望将每个肿瘤区域生成的坐标以csv格式保存为0级的位置。有一个可选的命令——level,默认值为6,并确保它与对应的组织掩模和概率图使用的级别一致。

FROC 评价 (FROC evalution)

利用每个检测WSI的肿瘤区域坐标,我们最终可以评估肿瘤定位的平均FROC评分。

python CAMELYON16/camelyon16/bin/Evaluation_FROC.py /TEST_MASK/ /COORD_PATH/

/TEST_MASK/是放置测试集的ground truth tif掩码文件的位置,/COORD_PATH/是保存生成的肿瘤坐标的位置。Evaluation_FROC.py基于Camelyon16组织者提供的评估代码,只做了少量修改。注意,正如Camelyon16组织者指出的,Test_049和Test_114被排除在评估之外。

贡献

slfcd's People

Contributors

dependabot[bot] avatar lvguofeng1303 avatar momopark8 avatar wilmerwang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

slfcd's Issues

关于train_normal.txt来源

作者您好,请问train_normal.txt是通过正常切片获取的还是通过Tumor_001_normal.npy这类文件生成的呢?

关于数据预处理-补丁图像获取的问题

您好,我想请问一下,按照您的说明进行获取补丁图像的第2步,源数据文件及路径都没错,但是运行tumor_mask.py时总报错(第1步,tissue_mask.py可正常运行处理),请问这可能是什么原因造成的,需要怎样处理解决?image

WSI分类器的训练与评价的问题

你好 非常感谢你的工作以及开源代码。我刚进入病理图像领域,正在练习你分享的代码。
遇到一些代码上的问题,想请教以下你:
1、 训练WSI分类器的时候只用训练集可以吗?训练集安排如下:
'''
training/
├─normal/
│ └─normal_0001.csv
| └─normal_0002.csv
└─tumor/
│ └─tumor_0001.png
| └─tumor_0002.png
'''
2、 你前面的代码都定义了文件的输入参数:像这样。在wsi_classification.py中并没有。照理这儿是训练模型,评价。应该是输入一个训练集,为什么你这儿写的是输入一个一个的.csv文件。请问这里怎么输入参数啊?是将所有的.csv合并到一个文件中吗?
parser = argparse.ArgumentParser(description='Get the probability map of tumor' ' patch predictions given a WSI') parser.add_argument('wsi_path', default=None, metavar='WSI_PATH', type=str, help='Path to the input WSI file') parser.add_argument('ckpt_path', default=None, metavar='CKPT_PATH', type=str, help='Path to the saved ckpt file of a pytorch model') parser.add_argument('cnn_path', default=None, metavar='CNN_PATH', type=str, help='Path to the config file in json format related to' ' the ckpt file')
python CAMELYON16/camelyon16/bin/wsi_classification.py probs_map_features_train.cvs probs_map_features_test.cvs TEST_CSV_GT
3、 在评价的时候,输入的TEST_CSV_GT是label文件,请问是什么形式的啊?.txt OR .csv

关于代码中的一些理解问题

您好,通过阅读您的代码,有一些小问题想请教。
1.wsi_classification.py中,使用的是tumor和normal进行分类。但是我看原挑战中的描述为:
First Evaluation: Participants need to provide a single CSV file, with the first column corresponding to the name of the image and the second column containing the probability of that image to contain metastasis.
我理解是要预测是否包含转移,请问为什么直接按照tumor和normal进行分类呢?
2.Evaluation_FROC.py中,ground truth tif文件是怎么获取的呢?
3.热力图是怎么生成的呢?这部分代码请问有没有共享呢?

GPU memory and time

Hello, I have just started my research on Camelyon17, and I would like to ask you about the GPU memory and time you need to train the whole data set.
Thank you very much!

如何生成tumor_train.txt 和 normal_train.txt?

您好,请问下面的tumor_train.txt 和 normal_train.txt是怎么生成的呢?前面的步骤中只有train_spot.txt,多谢您的解答。

获取补丁数据集

python CAMELYON16/camelyon16/bin/patch_gen.py /WSI_TRAIN/ tumor_train.txt /PATCHES_TUMOR_TRAIN/
python CAMELYON16/camelyon16/bin/patch_gen.py /WSI_TRAIN/ normal_train.txt /PATCHES_NORMAL_TRAIN/
python CAMELYON16/camelyon16/bin/patch_gen.py /WSI_TRAIN/ umor_valid.txt /PATCHES_TUMOR_VALID/
python CAMELYON16/camelyon16/bin/patch_gen.py /WSI_TRAIN/ normal_valid.txt /PATCHES_NORMAL_VALID/

KFB2TiforSVS 问题

1.KFB转TIF会出现错误TIF图片无法显示
2.KFB转SVS
level 0: downsample: 1.00000,width:166000,height 93184
,level 1: downsample: 8.00000,width:20750,height 11648
,level 2: downsample: 32.0015,width:5187,height 2912
,level 3: downsample: 128.043,width:1296,height 728
,level 4: downsample: 512.173,width:324,height 182
,level 5: downsample: 2060.07

downsample 能否调整为 1 2 4 8 16 32 64 这样 以此类推
是否有相关源码能提供出来进行修改的

模型保存问题

你好,在您的代码中,保存的是val_loss最小的best_model,但是在您的代码中并没有缩进,还是我理解错误了。

训练时代码如何区分normal_patch/和tumor_patch目录

您好,我train前生成了3个Patch目录,分别是:
normal.tif生成的normal_patch/;
tumor.tif生成的tumor_patch/;
tumor.tif生成的non_tumor_patch/;
一起放在/home/zbs/camelyon16_data/training/目录下,
我在cnn.json中给出的 "data_path_train": "/home/zbs/camelyon16_data/training/",
我的问题是:train.py代码中是如何区分training/下的不同patch目录的,谢谢。

热力图生成问题

兄弟,问个问题,在生成热力图阶段,如果对于测试集的每一个图片的每一个像素都提取patch然后分类patch,那么应该是对这个patch的中心像素有一个0-1之间的值,如果想对每个WSI图像的所有像素都预测,那会花费非常的时间,一个WSI图像大概有10万*10万像素呀,这是怎么解决的呢

文件路径怎样设置?

您好,我想问下文件的路径怎样设置?
parser.add_argument('xml_path', default=None, metavar='XML_PATH', type=str,
help='Path to the input Camelyon16 xml annotation')
我发现只能将default值改为某个文件的路径,比如../Camelyon16/training/lesion_annotations/tumor_001.xml,只能一个一个图片进行处理?请问应该怎样设置可以自动顺序处理同一文件目录下所有特定类型的文件?

咨询

兄弟能留一下你的qq吗,我也是西工大的,有点详细的问题想咨询一下,或者留个邮箱啥的也行

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.