HoVer-Net: 多组织病理图像中核的同步分割与分类
一个多分支网络,可在单个网络中同时执行细胞核实例分割和分类。该网络利用核像素到其质心的水平和垂直距离来分离聚集的细胞。专用的上采样分支用于对每个分割实例的核类型进行分类。
医学图像分析论文链接。
这是HoVer-Net的官方PyTorch实现。原始TensorFlow版本的代码请参考此分支。该存储库可用于训练HoVer-Net并处理图像块或全幻灯片图像。作为此存储库的一部分,我们提供了在以下数据集上训练的模型权重:
检查点的链接可以在下面的推理描述中找到。
设置环境
conda env create -f environment.yml
conda activate hovernet
pip install torch==1.6.0 torchvision==0.7.0
上面我们安装了PyTorch 1.6版本和CUDA 10.2。
存储库结构
以下是存储库中的主要目录:
dataloader/
: 数据加载器和增强管道docs/
: 存储库中使用的图片/GIFmetrics/
: 指标计算脚本misc/
: 实用工具models/
: 模型定义,以及主要运行步骤和超参数设置run_utils/
: 定义训练/验证循环和回调
以下是存储库中的主要可执行脚本:
config.py
: 配置文件dataset.py
: 定义数据集类extract_patches.py
: 从原始图像中提取patchescompute_stats.py
: 主要指标计算脚本run_train.py
: 主要训练脚本run_infer.py
: 用于图块和WSI处理的主要推理脚本convert_chkpt_tf2pytorch
: 将原始存储库中训练的tensorflow.npz
模型转换为pytorch支持的.tar
格式。
运行代码
训练
数据格式
对于训练,必须使用extract_patches.py
提取patches。对于实例分割,patches存储为4维numpy数组,通道为[RGB, inst]。这里,inst是实例分割的ground truth。即像素范围从0到N,其中0是背景,N是该特定图像的细胞核实例数量。
对于同时进行实例分割和分类,patches存储为5维numpy数组,通道为[RGB, inst, type]。这里,type是细胞核类型的ground truth。即每个像素范围从0-K,其中0是背景,K是类别数。
在训练之前:
- 在
config.py
中设置数据目录的路径 - 在
config.py
中设置检查点保存路径 - 在
models/hovernet/opt.py
中设置预训练的Preact-ResNet50权重路径。在这里下载权重。 - 在
models/hovernet/opt.py
中修改超参数,包括epoch数和学习率。
用法和选项
用法:
python run_train.py [--gpu=<id>] [--view=<dset>]
python run_train.py (-h | --help)
python run_train.py --version
选项:
-h --help 显示此字符串。
--version 显示版本。
--gpu=<id> 逗号分隔的GPU列表。
--view=<dset> 在增强后可视化图像。选择'train'或'valid'。
示例:
要在训练前可视化训练数据集作为健全性检查,请使用:
python run_train.py --view='train'
要使用GPU 0和1初始化训练脚本,命令是:
python run_train.py --gpu='0,1'
推理
数据格式
输入:
- 标准图像文件,包括
png
、jpg
和tiff
。 - OpenSlide支持的WSI,包括
svs
、tif
、ndpi
和mrxs
。
输出:
- 图像块和全幻灯片图像都输出一个
json
文件,包含以下键:- 'bbox': 每个细胞核的边界框坐标
- 'centroid': 每个细胞核的质心坐标
- 'contour': 每个细胞核的轮廓坐标
- 'type_prob': 每个细胞核的每类概率(默认配置不输出)
- 'type': 每个细胞核的类别预测
- 图像块输出一个
mat
文件,包含以下键:- 'raw': 网络的原始输出(默认配置不输出)
- 'inst_map': 包含0到N的值的实例图,其中N是细胞核数量
- 'inst_type': 长度为N的列表,包含每个细胞核的预测
- 图像块输出一个
png
文件,显示原始RGB图像上的细胞核边界叠加
模型权重
可以提供按照上述说明训练HoVer-Net得到的模型权重来处理输入图像/WSI。或者,可以使用以下任何预训练模型权重来处理数据。这些检查点最初使用TensorFlow训练,并使用convert_chkpt_tf2pytorch.py
进行转换。提供的检查点要么只训练用于分割,要么用于同时分割和分类。注意,我们不提供CPM17和Kumar的分割和分类模型,因为没有分类标签。
重要: CoNSeP、Kumar和CPM17检查点使用原始模型模式,而PanNuke和MoNuSAC使用快速模型模式。有关更多信息,请参阅下面的推理说明。
分割和分类:
仅分割:
访问完整的检查点目录及文件名描述README,请点击这里。
如果使用上述任何检查点,请确保引用相应的论文。
用法和选项
用法:
run_infer.py [选项] [--help] <命令> [<参数>...]
run_infer.py --version
run_infer.py (-h | --help)
选项:
-h --help 显示此字符串。
--version 显示版本。
--gpu=<id> GPU列表。[默认: 0]
--nr_types=<n> 要预测的细胞核类型数量。[默认: 0]
--type_info_path=<path> 定义类型id、类型名称和预期叠加颜色之间映射的json路径。[默认: '']
--model_path=<path> 已保存检查点的路径。
--model_mode=<mode> 原始HoVer-Net或PanNuke / MoNuSAC中使用的简化版本,'original'或'fast'。[默认: fast]
--nr_inference_workers=<n> 推理期间的工作进程数。[默认: 8]
--nr_post_proc_workers=<n> 后处理期间的工作进程数。[默认: 16]
--batch_size=<n> 批量大小。[默认: 128]
图块处理选项:
--input_dir=<path> 输入数据目录的路径。假设文件不嵌套在目录中。
--output_dir=<path> 输出目录的路径。
--draw_dot 在叠加层上绘制细胞核质心。[默认: False]
--save_qupath 可选择输出与QuPath v0.2.3兼容的格式。[默认: False]
--save_raw_map 是否保存原始预测。[默认: False]
WSI处理选项:
--input_dir=<path> 输入数据目录的路径。假设文件不嵌套在目录中。
--output_dir=<path> 输出目录的路径。
--cache_path=<path> 缓存路径。应放置在至少100GB的SSD上。[默认: cache]
--mask_dir=<path> 包含组织掩码的目录路径。
应与相应的WSI具有相同的名称。[默认: '']
--proc_mag=<n> 用于WSI处理的放大倍数(物镜倍率)。[默认: 40]
--ambiguous_size=<int> 定义沿分割网格的模糊区域以进行重新后处理。[默认: 128]
--chunk_shape=<n> 处理的块形状。[默认: 10000]
--tile_shape=<n> 处理的图块形状。[默认: 2048]
--save_thumb 保存缩略图。[默认: False]
--save_mask 保存掩码。[默认: False]
上述命令可以从命令行使用或通过可执行脚本使用。我们提供了两个示例可执行脚本:一个用于图块处理,一个用于WSI处理。要运行这些脚本,首先使用chmod +x run_tile.sh
和chmod +x run_tile.sh
使它们可执行。然后使用./run_tile.sh
和./run_wsi.sh
运行。
中间结果存储在缓存中。因此,请确保指定的缓存位置有足够的空间!最好确保缓存位置是SSD。
请注意,在运行推理时选择正确的模型模式很重要。"原始"模型模式指的是原始医学图像分析论文中描述的方法,使用270x270补丁输入和80x80补丁输出。"快速"模型模式使用256x256补丁输入和164x164补丁输出。在Kumar、CPM17和CoNSeP上训练的模型检查点来自我们的原始发表,因此必须使用"原始"模式。对于PanNuke和MoNuSAC,必须选择"快速"模式。我们提供的每个检查点的模型模式都在文件名中给出。此外,如果使用仅针对分割训练的模型,必须将nr_types
设置为0。
type_info.json
用于指定叠加层中使用的RGB颜色。请确保为不同的数据集修改此文件,并且如果您想要通常控制叠加边界颜色。
作为我们瓦片处理实现的一部分,我们添加了一个选项,以兼容QuPath的形式保存输出。
请查看examples/usage.ipynb
了解如何使用输出。
叠加分割和分类预测
在CoNSeP数据集上训练的HoVer-Net的叠加结果。细胞核边界的颜色表示细胞核的类型。
蓝色:上皮
红色:炎症
绿色:纺锤形
青色:其他
数据集
从此链接下载我们论文中使用的CoNSeP数据集。
从此链接下载Kumar、CPM-15、CPM-17和TNBC数据集。
下载
真实标注文件采用.mat
格式,有关更多信息,请参阅数据集附带的README。
与原始TensorFlow实现的比较
以下我们报告了使用此存储库(PyTorch)训练的分割结果与原始手稿(TensorFlow)报告的结果之间的差异。
Kumar数据集上的分割结果:
平台 | DICE | PQ | AJI |
---|---|---|---|
TensorFlow | 0.8258 | 0.5971 | 0.6412 |
PyTorch | 0.8211 | 0.5904 | 0.6321 |
CoNSeP数据集上的分割结果:
平台 | DICE | PQ | AJI |
---|---|---|---|
TensorFlow | 0.8525 | 0.5477 | 0.5995 |
PyTorch | 0.8504 | 0.5464 | 0.6009 |
可以在此处找到复现上述结果的检查点。
CoNSeP数据集上的同时分割和分类结果:
平台 | F1d | F1e | F1i | F1s | F1m |
---|---|---|---|---|---|
TensorFlow | 0.748 | 0.635 | 0.631 | 0.566 | 0.426 |
PyTorch | 0.756 | 0.636 | 0.559 | 0.557 | 0.348 |
引用
如果使用了此代码的任何部分,请适当引用我们的论文。
BibTex条目:
@article{graham2019hover,
title={Hover-net: Simultaneous segmentation and classification of nuclei in multi-tissue histology images},
author={Graham, Simon and Vu, Quoc Dang and Raza, Shan E Ahmed and Azam, Ayesha and Tsang, Yee Wah and Kwak, Jin Tae and Rajpoot, Nasir},
journal={Medical Image Analysis},
pages={101563},
year={2019},
publisher={Elsevier}
}
作者
许可证
该项目根据MIT许可证授权 - 详见LICENSE文件。
请注意,PanNuke数据集根据Attribution-NonCommercial-ShareAlike 4.0 International许可,因此HoVer-Net的派生权重也根据相同许可共享。请考虑在该许可下使用权重对您的工作及其许可的影响。