免责声明:这款模型在纽约大学朗格尼健康中心并未被临床使用。因为它是在2019年创建的,其准确性远远落后于我们自那时以来训练的最强模型。如果您有兴趣讨论我们最近的模型,请发送邮件至 Krzysztof J. Geras。
深度神经网络提高放射科医生在乳腺癌筛查中的表现
简介
这是一种用于乳腺癌分类的模型实现,详细信息请参阅我们的论文深度神经网络提高放射科医生在乳腺癌筛查中的表现。该实现允许用户通过应用我们预训练的模型获取乳腺癌预测:一个以图像为输入的模型(仅图像模型)和一个以图像和热图为输入的模型(图像和热图模型)。
- 输入图像:2张CC视图乳腺X光图像,尺寸为2677x1942,以及2张MLO视图乳腺X光图像,尺寸为2974x1748。每张图像以16位png文件保存,在输入模型前分别进行标准化处理。
- 输入热图:与对应乳腺X光图像大小相同的补丁分类器输出。每个乳腺X光图像生成两个热图,一个用于良性类别,一个用于恶性类别。这两个热图中的每个像素值都在0和1之间。
- 输出:每个乳房的2个预测,即良性和恶性发现的概率:
left_benign
、right_benign
、left_malignant
和right_malignant
。
这两个模型都作用于具有四个标准视图(L-CC、R-CC、L-MLO、R-MLO)的筛查乳腺X光检查。作为该代码库的一部分,我们提供4个样本检查(位于sample_data/images
目录中,有检查列表存储在sample_data/exam_list_before_cropping.pkl
中)。热图生成模型和癌症分类模型是用PyTorch实现的。
更新(2019/10/26):我们的论文将发表在IEEE医学影像学交易期刊上!
更新(2019/08/26):我们添加了一个TensorFlow实现的仅图像模型。
更新(2019/06/21):我们包含了论文中描述的仅图像模型,该模型基于单个乳腺X光图像生成预测。该模型的性能略低于上文提到的视图模型,但可用于单个乳腺X光图像,而不是完整的检查。
更新(2019/05/15):修复了一个导致输出数据框列(left_malignant
、right_benign
)交换的小错误。请注意,这不影响模型的操作。
先决条件
- Python (3.6)
- PyTorch (0.4.1)
- torchvision (0.2.0)
- NumPy (1.14.3)
- SciPy (1.0.0)
- H5py (2.7.1)
- imageio (2.4.1)
- pandas (0.22.0)
- tqdm (4.19.8)
- opencv-python (3.4.2)
许可证
本代码库依据GNU AGPLv3许可证进行许可。
如何运行代码
体检级别
这里我们描述如何从视图模型获取预测,这是我们性能最好的模型。此模型以每个视图的4张图像为输入,并输出每次检查的预测。
bash run.sh
将自动运行整个管道,并将预测结果保存为csv文件。
我们建议使用GPU运行代码(默认为默认设置)。要仅使用CPU运行代码,请将run.sh
中的DEVICE_TYPE
更改为'cpu'。
如果运行单独的Python脚本,请在您的PYTHONPATH
中包含该代码库的路径。
对于代码库中提供的样本检查,您应获得以下输出:
使用仅图像模型的预测(默认为sample_output/image_predictions.csv
):
序号 | left_benign | right_benign | left_malignant | right_malignant |
---|---|---|---|---|
0 | 0.0580 | 0.0754 | 0.0091 | 0.0179 |
1 | 0.0646 | 0.9536 | 0.0012 | 0.7258 |
2 | 0.4388 | 0.3526 | 0.2325 | 0.1061 |
3 | 0.3765 | 0.6483 | 0.0909 | 0.2579 |
使用图像和热图模型的预测(默认为sample_output/imageheatmap_predictions.csv
):
序号 | left_benign | right_benign | left_malignant | right_malignant |
---|---|---|---|---|
0 | 0.0612 | 0.0555 | 0.0099 | 0.0063 |
1 | 0.0507 | 0.8025 | 0.0009 | 0.9000 |
2 | 0.2877 | 0.2286 | 0.2524 | 0.0461 |
3 | 0.4181 | 0.3172 | 0.3174 | 0.0485 |
单张图像
这里我们还上传了仅图像模型,这与上面描述的视图模型不同,性能也不如视图模型。视图模型的csv输出将与本节所述的仅图像模型的输出不同。由于该模型具有分别为每张图像创建预测的优点,我们公开该模型以促进迁移学习。
要使用仅图像模型,请运行类似以下的命令:
bash run_single.sh "sample_data/images/0_L_CC.png" "L-CC"
其中,第一个参数是乳腺X光图像的路径,第二个参数是与该图像对应的视图。
基于上述示例命令,您应获得以下输出:
第1阶段:裁剪乳腺X光图像
第2阶段:提取中心
第3阶段:生成热图
第4a阶段:运行分类器(图像)
{"benign": 0.040191903710365295, "malignant": 0.008045293390750885}
第4b阶段:运行分类器(图像+热图)
{"benign": 0.052365876734256744, "malignant": 0.005510155577212572}
图像级笔记本
我们包含了一个示例笔记本,其中包含运行分类器(带和不带热图)的代码(不包括预处理)。
数据
要使用预训练模型之一,输入需要至少包含四张图像,每个视图(L-CC、L-MLO、R-CC、R-MLO)至少一张。
原始12位乳腺X光图像保存为重新缩放的16位图像,以保留像素强度的粒度,同时仍能在图像查看器中正确显示。
sample_data/exam_list_before_cropping.pkl
包含预处理前的检查信息列表。每个检查表示为以下格式的字典:
{
'horizontal_flip': 'NO',
'L-CC': ['0_L_CC'],
'R-CC': ['0_R_CC'],
'L-MLO': ['0_L_MLO'],
'R-MLO': ['0_R_MLO'],
}
我们期望L-CC和L-MLO视图中的图像朝右,R-CC和R-MLO视图中的图像朝左。horizontal_flip
指示所有检查图像是否从预期方向水平翻转。L-CC
、R-CC
、L-MLO
和R-MLO
的值是图像文件名的列表,不包含扩展名和目录名。
每张图像的附加信息以字典形式包含。这样的字典包含所有4个视图作为键,值为对应键的附加信息。例如,window_location
指示裁剪窗口的顶部、底部、左侧和右侧边缘,是一个具有4个键和4个列表作为值的字典,这些值包含相应图像的信息。此外,在预处理后添加了rightmost_pixels
、bottommost_pixels
、distance_from_starting_side
和best_center
。
这些属性的描述可以在预处理部分找到。
以下是裁剪和提取最佳中心后的检查信息示例:
{
'horizontal_flip': 'NO',
'L-CC': ['0_L_CC'],
'R-CC': ['0_R_CC'],
'L-MLO': ['0_L_MLO'],
'R-MLO': ['0_R_MLO'],
'window_location': {
'L-CC': [(353, 4009, 0, 2440)],
'R-CC': [(71, 3771, 952, 3328)],
'L-MLO': [(0, 3818, 0, 2607)],
'R-MLO': [(0, 3724, 848, 3328)]
},
'rightmost_points': {
'L-CC': [((1879, 1958), 2389)],
'R-CC': [((2207, 2287), 2326)],
'L-MLO': [((2493, 2548), 2556)],
'R-MLO': [((2492, 2523), 2430)]
},
'bottommost_points': {
'L-CC': [(3605, (100, 100))],
'R-CC': [(3649, (101, 106))],
'L-MLO': [(3767, (1456, 1524))],
'R-MLO': [(3673, (1164, 1184))]
},
'distance_from_starting_side': {
'L-CC': [0],
'R-CC': [0],
'L-MLO': [0],
'R-MLO': [0]
},
'best_center': {
'L-CC': [(1850, 1417)],
'R-CC': [(2173, 1354)],
'L-MLO': [(2279, 1681)],
'R-MLO': [(2185, 1555)]
}
}
所包含检查的标签如下:
序号 | left_benign | right_benign | left_malignant | right_malignant |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 1 |
2 | 1 | 0 | 0 | 0 |
3 | 1 | 1 | 1 | 1 |
管道
该管道由四个阶段组成。
- 裁剪乳腺X光图像
- 计算最佳中心
- 生成热图
- 运行分类器
可以根据需要修改run.sh
中定义的以下变量:
-
NUM_PROCESSES
:用于预处理中(src/cropping/crop_mammogram.py
和src/optimal_centers/get_optimal_centers.py
)的进程数。默认值:10。 -
DEVICE_TYPE
:热图生成和分类器中使用的设备类型,'cpu'或'gpu'。默认值:'gpu' -
NUM_EPOCHS
:分类器输出的平均周期数。默认值:10。 -
HEATMAP_BATCH_SIZE
:热图生成中的批处理大小。默认值:100。 -
GPU_NUMBER
:当有多个GPU可用时指定要使用的GPU编号。默认值:0。 -
DATA_FOLDER
:存储乳腺X光图像的目录。 -
INITIAL_EXAM_LIST_PATH
:存储初始检查列表(无任何元数据)的路径。 -
PATCH_MODEL_PATH
:保存补丁分类器权重的路径。 -
IMAGE_MODEL_PATH
:保存仅图像模型权重的路径。 -
IMAGEHEATMAPS_MODEL_PATH
:保存图像和热图模型权重的路径。 -
CROPPED_IMAGE_PATH
:保存裁剪后的乳腺X光图像的目录。 -
CROPPED_EXAM_LIST_PATH
:保存包含裁剪元数据的新检查列表的路径。 -
EXAM_LIST_PATH
:保存包含最佳中心元数据的新检查列表的路径。 -
HEATMAPS_PATH
:保存热图的目录。 -
IMAGE_PREDICTIONS_PATH
:保存仅图像模型预测的路径。 -
IMAGEHEATMAPS_PREDICTIONS_PATH
:保存图像和热图模型预测的路径。
预处理
运行以下命令以裁剪乳腺X光图像并计算关于增强窗口的信息。
裁剪乳房X光片
python3 src/cropping/crop_mammogram.py \
--input-data-folder $DATA_FOLDER \
--output-data-folder $CROPPED_IMAGE_PATH \
--exam-list-path $INITIAL_EXAM_LIST_PATH \
--cropped-exam-list-path $CROPPED_EXAM_LIST_PATH \
--num-processes $NUM_PROCESSES
src/import_data/crop_mammogram.py
程序通过裁剪乳房部分的乳房X光片来去除背景,从而提高图像加载时间和分割算法的运行时间,并使用h5py将每个裁剪后的图像保存到 $PATH_TO_SAVE_CROPPED_IMAGES/short_file_path.png
。此外,该程序为每个图像添加额外的信息,并创建一个新的图像列表保存到 $CROPPED_IMAGE_LIST_PATH
,同时丢弃那些无法裁剪的图像。可选参数 --verbose
可以打印每个图像的信息。额外的信息包括以下内容:
window_location
: 裁剪窗口相对于原始dicom图像的位置,以便在训练时同样方式裁剪分割图。rightmost_points
: 正确翻转后最右边的非零像素。bottommost_points
: 正确翻转后最下面的非零像素。distance_from_starting_side
: 记录图像边缘与乳房开始出现的边之间是否存在零值间隔,并应无间隔。根据数据集,此值可用于确定horizontal_flip
的错误值。
计算最佳中心点
python3 src/optimal_centers/get_optimal_centers.py \
--cropped-exam-list-path $CROPPED_EXAM_LIST_PATH \
--data-prefix $CROPPED_IMAGE_PATH \
--output-exam-list-path $EXAM_LIST_PATH \
--num-processes $NUM_PROCESSES
src/optimal_centers/get_optimal_centers.py
生成包含额外元数据的新检查列表,并保存到 $EXAM_LIST_PATH
。额外的信息包括以下内容:
best_center
: 每个图像的最佳窗口中心点。绘制拟合窗口的增强窗口可能会超出图像的边界。这种情况通常发生在裁剪后的图像小于窗口尺寸时。在此情况下,我们会在增强处理中填充图像并将窗口移至填充后的图像内部。更多详情请参考数据报告。
热图生成
python3 src/heatmaps/run_producer.py \
--model-path $PATCH_MODEL_PATH \
--data-path $EXAM_LIST_PATH \
--image-path $CROPPED_IMAGE_PATH \
--batch-size $HEATMAP_BATCH_SIZE \
--output-heatmap-path $HEATMAPS_PATH \
--device-type $DEVICE_TYPE \
--gpu-number $GPU_NUMBER
src/heatmaps/run_producer.py
通过组合图像块的预测生成热图,并使用 $DEVICE_TYPE
设备将其保存为hdf5格式到 $HEATMAPS_PATH
。$DEVICE_TYPE
可以是 'GPU' 或 'CPU'。 $HEATMAP_BATCH_SIZE
应根据可用内存大小进行调整。可选参数 --gpu-number
可以指定使用哪个GPU。
运行模型
src/modeling/run_model.py
可以使用裁剪后的图像(带有或不带热图)进行预测。使用热图时,请使用 --use-heatmaps
标志并提供适当的 --model-path
和 --heatmaps-path
参数。根据可用内存,可选参数 --batch-size
也可以提供。另一个可选参数 --gpu-number
可以指定使用哪个GPU。
仅运行图像模型
python3 src/modeling/run_model.py \
--model-path $IMAGE_MODEL_PATH \
--data-path $EXAM_LIST_PATH \
--image-path $CROPPED_IMAGE_PATH \
--output-path $IMAGE_PREDICTIONS_PATH \
--use-augmentation \
--num-epochs $NUM_EPOCHS \
--device-type $DEVICE_TYPE \
--gpu-number $GPU_NUMBER
此命令在 $NUM_EPOCHS
个周期内仅使用图像进行预测并随机增强,并将每次检查的平均预测结果输出到 $IMAGE_PREDICTIONS_PATH
。
运行图像+热图模型
python3 src/modeling/run_model.py \
--model-path $IMAGEHEATMAPS_MODEL_PATH \
--data-path $EXAM_LIST_PATH \
--image-path $CROPPED_IMAGE_PATH \
--output-path $IMAGEHEATMAPS_PREDICTIONS_PATH \
--use-heatmaps \
--heatmaps-path $HEATMAPS_PATH \
--use-augmentation \
--num-epochs $NUM_EPOCHS \
--device-type $DEVICE_TYPE \
--gpu-number $GPU_NUMBER
此命令在 $NUM_EPOCHS
个周期内使用图像和热图进行预测并随机增强,并将每次检查的平均预测结果输出到 $IMAGEHEATMAPS_PREDICTIONS_PATH
。
从dicom文件获取图像并保存为16位png文件
可以使用以下函数将dicom文件转换为png文件,然后可以由我们的代码库使用(需要pypng 0.0.19 和 pydicom 1.2.2 库)。
import png
import pydicom
def save_dicom_image_as_png(dicom_filename, png_filename, bitdepth=12):
"""
将dicom中12位的乳房X光片保存为重新缩放的16位png文件。
:param dicom_filename: 输入dicom文件的路径。
:param png_filename: 输出png文件的路径。
:param bitdepth: 输入图像的位深度。对于12位的乳房X光片设置为12。
"""
image = pydicom.read_file(dicom_filename).pixel_array
with open(png_filename, 'wb') as f:
writer = png.Writer(height=image.shape[0], width=image.shape[1], bitdepth=bitdepth, greyscale=True)
writer.write(f, image.tolist())
参考文献
如果你觉得这段代码有用,请引用我们的论文:
深度神经网络提高了放射科医生在乳腺癌筛查中的表现
Nan Wu, Jason Phang, Jungkyu Park, Yiqiu Shen, Zhe Huang, Masha Zorin, Stanisław Jastrzębski, Thibault Févry, Joe Katsnelson, Eric Kim, Stacey Wolfson, Ujas Parikh, Sushma Gaddam, Leng Leng Young Lin, Kara Ho, Joshua D. Weinstein, Beatriu Reig, Yiming Gao, Hildegard Toth, Kristine Pysarenko, Alana Lewin, Jiyon Lee, Krystal Airola, Eralda Mema, Stephanie Chung, Esther Hwang, Naziya Samreen, S. Gene Kim, Laura Heacock, Linda Moy, Kyunghyun Cho, Krzysztof J. Geras
IEEE Transactions on Medical Imaging
2019
@article{wu2019breastcancer,
title = {Deep Neural Networks Improve Radiologists' Performance in Breast Cancer Screening},
author = {Nan Wu and Jason Phang and Jungkyu Park and Yiqiu Shen and Zhe Huang and Masha Zorin and Stanis\l{}aw Jastrz\k{e}bski and Thibault F\'{e}vry and Joe Katsnelson and Eric Kim and Stacey Wolfson and Ujas Parikh and Sushma Gaddam and Leng Leng Young Lin and Kara Ho and Joshua D. Weinstein and Beatriu Reig and Yiming Gao and Hildegard Toth and Kristine Pysarenko and Alana Lewin and Jiyon Lee and Krystal Airola and Eralda Mema and Stephanie Chung and Esther Hwang and Naziya Samreen and S. Gene Kim and Laura Heacock and Linda Moy and Kyunghyun Cho and Krzysztof J. Geras},
journal = {IEEE Transactions on Medical Imaging},
year = {2019}
}