Esta es una implementación del modelo utilizado para la clasificación del cáncer de mama como se describe en nuestro artículo, las redes neuronales profundas mejoran el rendimiento de los radiólogos en la detección del cáncer de mama. La implementación permite a los usuarios obtener predicciones de cáncer de mama mediante la aplicación de uno de nuestros modelos previos a la aparición: un modelo que toma imágenes como entrada ( solo de imagen ) y un modelo que toma imágenes y mapas de calor como entrada ( imagen y mapas de calor ).
left_benign , right_benign , left_malignant y right_malignant . Ambos modelos actúan sobre los exámenes de mamografía de detección con cuatro vistas estándar (L-CC, R-CC, L-MLO, R-MLO). Como parte de este repositorio, proporcionamos 4 exámenes de muestra (en el directorio de sample_data/images y la lista de exámenes almacenados en sample_data/exam_list_before_cropping.pkl ). El modelo de generación de mapas de calor y los modelos de clasificación de cáncer se implementan en Pytorch.
Actualización (2019/10/26) : ¡Nuestro artículo se publicará en las transacciones IEEE en imágenes médicas!
Actualización (2019/08/26) : hemos agregado una implementación de TensorFlow de nuestro modelo de imagen .
Actualización (2019/06/21) : hemos incluido el modelo de imagen de imagen como se describe en el documento que genera predicciones basadas en una sola imagen de mamografía. Este modelo tiene un rendimiento ligeramente inferior al modelo de visualización utilizado anteriormente, pero puede usarse en imágenes de mamografía única en lugar de los exámenes completos.
Actualización (2019/05/15) : se corrigió un error menor que causaba que las columnas de marcado de datos de salida ( left_malignant , right_benign ) se intercambiaran. Tenga en cuenta que esto no afecta la operación del modelo.
Este repositorio tiene licencia bajo los términos de la licencia GNU AGPLV3.
Aquí describimos cómo obtener predicciones del modelo de visualización , que es nuestro modelo de mejor rendimiento. Este modelo toma 4 imágenes de cada vista como predicciones de entrada y salida para cada examen.
bash run.shejecutará automáticamente toda la tubería y guardará los resultados de predicción en CSV.
Recomendamos ejecutar el código con una GPU (establecida por defecto). Para ejecutar el código solo con CPU, cambie DEVICE_TYPE en run.sh a 'CPU'.
Si ejecuta los scripts individuales de Python, incluya la ruta a este repositorio en su PYTHONPATH .
Debe obtener las siguientes salidas para los exámenes de muestra proporcionados en el repositorio.
Predicciones que utilizan el modelo solo de imagen (que se encuentra en sample_output/image_predictions.csv de forma predeterminada):
| índice | 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 |
Predicciones utilizando el modelo de imagen y calor (que se encuentra en sample_output/imageheatmap_predictions.csv de forma predeterminada):
| índice | 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 |
Aquí también cargamos el modelo en cuanto a imágenes , que es diferente y funciona peor que el modelo de visualización descrito anteriormente. La salida CSV del modelo de visualización será diferente de la del modelo de imagen de imagen en esta sección. Debido a que este modelo tiene el beneficio de crear predicciones para cada imagen por separado, hacemos que este modelo sea público para facilitar el aprendizaje de transferencia.
Para usar el modelo en cuanto a imagen , ejecute un comando como el siguiente:
bash run_single.sh " sample_data/images/0_L_CC.png " " L-CC "donde el primer argumento es la ruta a una imagen de mamografía, y el segundo argumento es la vista correspondiente a esa imagen.
Debe obtener la siguiente salida en función del comando de ejemplo anterior:
Stage 1: Crop Mammograms
Stage 2: Extract Centers
Stage 3: Generate Heatmaps
Stage 4a: Run Classifier (Image)
{"benign": 0.040191903710365295, "malignant": 0.008045293390750885}
Stage 4b: Run Classifier (Image+Heatmaps)
{"benign": 0.052365876734256744, "malignant": 0.005510155577212572}
Hemos incluido un cuaderno de muestra que contiene código para ejecutar los clasificadores con y sin mapas de calor (excluye el preprocesamiento).
Para usar uno de los modelos previos a la aparición, se requiere la entrada para consistir en al menos cuatro imágenes, al menos una para cada vista (L-CC, L-MLO, R-CC, R-MLO).
Las mamografías originales de 12 bits se guardan como imágenes reescaladas de 16 bits para preservar la granularidad de las intensidades de píxeles, mientras que se muestran correctamente en los espectadores de imágenes.
sample_data/exam_list_before_cropping.pkl contiene una lista de información del examen antes del preprocesamiento. Cada examen se representa como un diccionario con el siguiente formato:
{
'horizontal_flip' : 'NO' ,
'L-CC' : [ '0_L_CC' ],
'R-CC' : [ '0_R_CC' ],
'L-MLO' : [ '0_L_MLO' ],
'R-MLO' : [ '0_R_MLO' ],
} Esperamos que las imágenes de las vistas L-CC y L-MLO estén mirando a la derecha, y las imágenes de las vistas R-CC y R-MLO se encuentran en dirección izquierda. horizontal_flip indica si todas las imágenes en el examen se voltean horizontalmente desde el esperado. Los valores para L-CC , R-CC , L-MLO y R-MLO son una lista de nombres de archivos de imagen sin extensión y nombre del directorio.
La información adicional para cada imagen se incluye como diccionario. Dicho diccionario tiene las 4 vistas como claves, y los valores son la información adicional para la clave correspondiente. Por ejemplo, window_location , que indica los bordes superior, inferior, izquierdo y derecho de la ventana de cultivo, es un diccionario que tiene 4 claves y tiene 4 listas como valores que contienen la información correspondiente para las imágenes. Además, rightmost_pixels , bottommost_pixels , distance_from_starting_side y best_center se agregan después del preprocesamiento. La descripción de estos atributos se puede encontrar en la sección de preprocesamiento. El siguiente es un ejemplo de información del examen después de recortar y extraer centros óptimos:
{
'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 )]
}
}Las etiquetas para los exámenes incluidos son las siguientes:
| índice | 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 |
La tubería consta de cuatro etapas.
Las siguientes variables definidas en run.sh se pueden modificar según sea necesario:
NUM_PROCESSES : el número de procesos que se utilizarán en el preprocesamiento ( src/cropping/crop_mammogram.py y src/optimal_centers/get_optimal_centers.py ). Valor predeterminado: 10.
DEVICE_TYPE : Tipo de dispositivo para usar en la generación y clasificadores de mapas de calor, ya sea 'CPU' o 'GPU'. Valor predeterminado: 'GPU'
NUM_EPOCHS : el número de épocas que se promediarán en la salida de los clasificadores. Valor predeterminado: 10.
HEATMAP_BATCH_SIZE : el tamaño de lotes para usar en la generación de mapas de calor. Valor predeterminado: 100.
GPU_NUMBER : especifique cuál de las GPU usar cuando están disponibles múltiples GPU. Valor predeterminado: 0.
DATA_FOLDER : el directorio donde se almacena la mamografía.
INITIAL_EXAM_LIST_PATH : la ruta donde se almacena la lista de exámenes inicial sin ningún metadato.
PATCH_MODEL_PATH : la ruta donde se guarda los pesos guardados para el clasificador de parche.
IMAGE_MODEL_PATH : la ruta donde se guarda los pesos guardados para el modelo de solo imagen .
IMAGEHEATMAPS_MODEL_PATH : se guarda la ruta donde se guarda los pesos guardados para el modelo Image-and-HeatMaps .
CROPPED_IMAGE_PATH : el directorio para guardar mamografías recortadas.
CROPPED_EXAM_LIST_PATH : la ruta para guardar la nueva lista de exámenes con metadatos de cultivo.
EXAM_LIST_PATH : la ruta para guardar la nueva lista de exámenes con los mejores metadatos centrales.
HEATMAPS_PATH : el directorio para guardar mapas de calor.
IMAGE_PREDICTIONS_PATH : la ruta para guardar las predicciones del modelo solo de imagen .
IMAGEHEATMAPS_PREDICTIONS_PATH : la ruta para guardar las predicciones del modelo de imagen y calor .
Ejecute los siguientes comandos para recortar mamografías y calcule la información sobre las ventanas de aumento.
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 cultiva la mamografía alrededor de la pecho y descarta el fondo para mejorar el tiempo de carga de imágenes y el tiempo para ejecutar el algoritmo de segmentación y guarda cada imagen recortada a $PATH_TO_SAVE_CROPPED_IMAGES/short_file_path.png usando H5py. Además, agrega información adicional para cada imagen y crea una nueva lista de imágenes a $CROPPED_IMAGE_LIST_PATH mientras descarta imágenes que no puede recortar. Opcional: el argumento verboso imprime información sobre cada imagen. La información adicional incluye lo siguiente:
window_location : ubicación de la ventana de cultivo WRT Imagen original DICOM para que el mapa de segmentación se pueda recortar de la misma manera para el entrenamiento.rightmost_points : los píxeles distintos de cero de la derecha después de ser volcado correctamente.bottommost_points : Bottommost no cero píxeles después de ser volcado correctamente.distance_from_starting_side : registros si se encuentra la brecha de valor cero entre el borde de la imagen y el seno en el lado donde el seno comienza a aparecer y, por lo tanto, no debería haber sido la brecha. Dependiendo del conjunto de datos, este valor se puede usar para determinar el valor incorrecto de 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 emite una nueva lista de exámenes con metadatos adicionales a $EXAM_LIST_PATH . La información adicional incluye lo siguiente:
best_center : punto central óptimo de la ventana para cada imagen. Las ventanas de aumento dibujadas con best_center como punto central exacto podrían salir del límite de la imagen. Esto generalmente sucede cuando la imagen recortada es más pequeña que el tamaño de la ventana. En este caso, rellenamos la imagen y cambiamos la ventana para estar dentro de la imagen acolchada en el aumento. Consulte el informe de datos para obtener más detalles.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 genera mapas de calor combinando predicciones para parches de imágenes y los guarda como formato HDF5 en $HEATMAPS_PATH usando $DEVICE_TYPE dispositivo. $DEVICE_TYPE puede ser 'GPU' o 'CPU'. $HEATMAP_BATCH_SIZE debe ajustarse según el tamaño de la memoria disponible. Se puede usar un argumento opcional --gpu-number para especificar qué GPU usar.
src/modeling/run_model.py puede proporcionar predicciones utilizando imágenes recortadas con o sin mapas de calor. Cuando use mapas de calor, use el indicador --use-heatmaps y proporcione argumentos apropiados --model-path y --heatmaps-path . Dependiendo de la memoria disponible, se puede proporcionar el argumento opcional: se puede proporcionar --batch-size . Otro argumento opcional --gpu-number se puede usar para especificar qué GPU usar.
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 Este comando hace predicciones solo usando imágenes para épocas $NUM_EPOCHS con aumento aleatorio y salidas predicciones promedio por examen a $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 Este comando hace predicciones usando imágenes y mapas de calor para épocas $NUM_EPOCHS con aumento aleatorio y salidas predicciones promedio por examen a $IMAGEHEATMAPS_PREDICTIONS_PATH .
Los archivos DICOM se pueden convertir en archivos PNG con la siguiente función, que luego puede ser utilizada por el código en nuestro repositorio (se requieren bibliotecas Pypng 0.0.19 y Pydicom 1.2.2).
import png
import pydicom
def save_dicom_image_as_png ( dicom_filename , png_filename , bitdepth = 12 ):
"""
Save 12-bit mammogram from dicom as rescaled 16-bit png file.
:param dicom_filename: path to input dicom file.
:param png_filename: path to output png file.
:param bitdepth: bit depth of the input image. Set it to 12 for 12-bit mammograms.
"""
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 ())Si encontró este código útil, cite nuestro documento:
Las redes neuronales profundas mejoran el rendimiento de los radiólogos en la detección del cáncer de mama
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 Len, Keara, Joshuhu, Joshwein D. Wein. 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, Krzystof
Transacciones IEEE en imágenes médicas
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 Stanisl{}aw Jastrzk{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}
}