Il s'agit d'une mise en œuvre du modèle utilisé pour la classification du cancer du sein, comme décrit dans notre article, les réseaux de neurones profonds améliorent les performances des radiologues dans le dépistage du cancer du sein. L'implémentation permet aux utilisateurs d'obtenir des prévisions de cancer du sein en appliquant l'un de nos modèles pré-entraînés: un modèle qui prend des images en entrée ( image uniquement ) et un modèle qui prend des images et des cartes thermiques en entrée ( image-et-chauffage ).
left_benign , right_benign , left_malignant et right_malignant . Les deux modèles agissent sur le dépistage des examens de mammographie avec quatre vues standard (L-CC, R-CC, L-MLO, R-MLO). Dans le cadre de ce référentiel, nous fournissons 4 exemples d'examens (dans le répertoire sample_data/images et la liste d'examens stockés dans sample_data/exam_list_before_cropping.pkl ). Le modèle de génération de la carte thermique et les modèles de classification du cancer sont mis en œuvre dans Pytorch.
Mise à jour (2019/10/26) : Notre article sera publié dans les transactions IEEE sur l'imagerie médicale!
Mise à jour (2019/08/26) : Nous avons ajouté une implémentation TensorFlow de notre modèle par image .
Mise à jour (2019/06/21) : Nous avons inclus le modèle par image comme décrit dans l'article qui génère des prédictions basées sur une seule image de mammographie. Ce modèle sous-performe légèrement le modèle de vue utilisé ci-dessus, mais peut être utilisé sur des images de mammographie uniques par opposition aux examens complets.
Mise à jour (2019/05/15) : Correction d'un bogue mineur qui a provoqué l'échange des colonnes DataFrame de sortie ( left_malignant , right_benign ). Notez que cela n'affecte pas le fonctionnement du modèle.
Ce référentiel est concédé sous licence de la licence GNU AGPLV3.
Ici, nous décrivons comment obtenir des prédictions à partir du modèle View-Sage , qui est notre modèle le plus performant. Ce modèle prend 4 images de chaque vue comme des prédictions d'entrée et de sortie pour chaque examen.
bash run.shExécutera automatiquement l'intégralité du pipeline et enregistrera les résultats de prédiction en CSV.
Nous vous recommandons d'exécuter le code avec un GPU (défini par défaut). Pour exécuter le code avec CPU uniquement, veuillez modifier DEVICE_TYPE dans run.sh vers «CPU».
Si l'exécution des scripts Python individuels, veuillez inclure le chemin d'accès à ce référentiel dans votre PYTHONPATH .
Vous devez obtenir les sorties suivantes pour les exemples d'examens fournis dans le référentiel.
Prédictions à l'aide du modèle d'image uniquement (trouvé dans sample_output/image_predictions.csv par défaut):
| indice | Left_Benign | Right_Benign | Left_malignant | droite_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 |
Prédictions à l'aide du modèle d'image et de mats (trouvé dans sample_output/imageheatmap_predictions.csv par défaut):
| indice | Left_Benign | Right_Benign | Left_malignant | droite_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 |
Ici, nous téléchargeons également le modèle par image , qui est différent et fonctionne moins que le modèle de vue décrit ci-dessus. La sortie CSV du modèle View-Wise sera différente de celle du modèle par image dans cette section. Étant donné que ce modèle a l'avantage de créer des prédictions pour chaque image séparément, nous rendons ce modèle public pour faciliter l'apprentissage du transfert.
Pour utiliser le modèle d'image , exécutez une commande telle que celle suivante:
bash run_single.sh " sample_data/images/0_L_CC.png " " L-CC "où le premier argument est le chemin d'accès à une image de mammographie, et le deuxième argument est la vue correspondant à cette image.
Vous devez obtenir la sortie suivante en fonction de l'exemple de commande ci-dessus:
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}
Nous avons inclus un exemple de cahier qui contient du code pour l'exécution des classificateurs avec et sans thermaps (exclut le prétraitement).
Pour utiliser l'un des modèles pré-entraînés, l'entrée doit être composée d'au moins quatre images, au moins une pour chaque vue (L-CC, L-MLO, R-CC, R-MLO).
Les mammographies 12 bits d'origine sont enregistrées sous forme d'images 16 bits redimensionnées pour préserver la granularité des intensités de pixels, tout en étant correctement affichée dans les spectateurs d'images.
sample_data/exam_list_before_cropping.pkl contient une liste des informations d'examen avant le prétraitement. Chaque examen est représenté comme un dictionnaire avec le format suivant:
{
'horizontal_flip' : 'NO' ,
'L-CC' : [ '0_L_CC' ],
'R-CC' : [ '0_R_CC' ],
'L-MLO' : [ '0_L_MLO' ],
'R-MLO' : [ '0_R_MLO' ],
} Nous nous attendons à ce que les images des vues L-CC et L-MLO soient confrontées à la direction droite, et les images des vues R-CC et R-MLO sont confrontées à la direction gauche. horizontal_flip indique si toutes les images de l'examen sont inversées horizontalement à partir de l'attendu. Les valeurs pour L-CC , R-CC , L-MLO et R-MLO sont la liste des noms de fichiers d'image sans extension et nom de répertoire.
Des informations supplémentaires pour chaque image sont incluses comme dictionnaire. Un tel dictionnaire a les 4 vues comme des clés, et les valeurs sont les informations supplémentaires pour la clé correspondante. Par exemple, window_location , qui indique les bords supérieurs, bas, gauche et droite de la fenêtre de recadrage, est un dictionnaire qui a 4 clés et a 4 listes comme valeurs qui contiennent les informations correspondantes pour les images. De plus, rightmost_pixels , bottommost_pixels , distance_from_starting_side et best_center sont ajoutés après le prétraitement. La description de ces attributs peut être trouvée dans la section de prétraitement. Ce qui suit est un exemple d'informations sur l'examen après la culture et l'extraction des centres optimaux:
{
'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 )]
}
}Les étiquettes des examens inclus sont les suivants:
| indice | Left_Benign | Right_Benign | Left_malignant | droite_malignant |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 1 |
| 2 | 1 | 0 | 0 | 0 |
| 3 | 1 | 1 | 1 | 1 |
Le pipeline se compose de quatre étapes.
Les variables suivantes définies dans run.sh peuvent être modifiées au besoin:
NUM_PROCESSES : Le nombre de processus à utiliser dans le prétraitement ( src/cropping/crop_mammogram.py et src/optimal_centers/get_optimal_centers.py ). Par défaut: 10.
DEVICE_TYPE : type de périphérique à utiliser dans la génération et les classificateurs HeatMap, «CPU» ou «GPU». Par défaut: 'GPU'
NUM_EPOCHS : Le nombre d'époques à être moyenné dans la sortie des classificateurs. Par défaut: 10.
HEATMAP_BATCH_SIZE : la taille du lot à utiliser dans la génération HeatMap. Par défaut: 100.
GPU_NUMBER : Spécifiez lequel des GPU à utiliser lorsque plusieurs GPU sont disponibles. Par défaut: 0.
DATA_FOLDER : Le répertoire où la mammographie est stockée.
INITIAL_EXAM_LIST_PATH : le chemin où la liste des examens initiale sans métadonnées est stockée.
PATCH_MODEL_PATH : le chemin où les poids enregistrés pour le classificateur de patch sont enregistrés.
IMAGE_MODEL_PATH : le chemin où les poids enregistrés pour le modèle d'image uniquement sont enregistrés.
IMAGEHEATMAPS_MODEL_PATH : Le chemin où les poids enregistrés pour le modèle d'image et de chauffage sont enregistrés.
CROPPED_IMAGE_PATH : Le répertoire pour sauver les mammographies recadrées.
CROPPED_EXAM_LIST_PATH : le chemin pour sauver la nouvelle liste d'examens avec des métadonnées de recadrage.
EXAM_LIST_PATH : le chemin pour enregistrer la nouvelle liste d'examens avec les meilleures métadonnées centrales.
HEATMAPS_PATH : Le répertoire pour sauver les thermaps.
IMAGE_PREDICTIONS_PATH : le chemin pour enregistrer les prédictions du modèle d'image uniquement .
IMAGEHEATMAPS_PREDICTIONS_PATH : le chemin pour enregistrer les prédictions du modèle d'image et de mèches .
Exécutez les commandes suivantes pour recadrer les mammographies et calculer des informations sur les fenêtres d'augmentation.
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 COPES La mammographie autour du sein et rejette l'arrière-plan afin d'améliorer le chargement et le temps de chargement de l'image pour exécuter l'algorithme de segmentation et enregistre chaque image recadrée à $PATH_TO_SAVE_CROPPED_IMAGES/short_file_path.png en utilisant h5py. De plus, il ajoute des informations supplémentaires pour chaque image et crée une nouvelle liste d'images à $CROPPED_IMAGE_LIST_PATH tout en jetant des images qu'il ne craque pas. L'argument facultatif --verbose imprime des informations sur chaque image. Les informations supplémentaires comprennent les éléments suivants:
window_location : Emplacement de la fenêtre de recadrage WRT Image originale de DICOM afin que la carte de segmentation puisse être recadrée de la même manière pour la formation.rightmost_points : pixels non nul les plus à droite après avoir été correctement retourné.bottommost_points : Pixels non zéro Bottomost après avoir été correctement retourné.distance_from_starting_side : enregistre si un espace de valeur zéro entre le bord de l'image et le sein se trouve dans le côté où le sein commence à apparaître et n'aurait donc pas dû être un espace. Selon l'ensemble de données, cette valeur peut être utilisée pour déterminer la mauvaise valeur 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 publie une nouvelle liste d'examen avec des métadonnées supplémentaires à $EXAM_LIST_PATH . Les informations supplémentaires comprennent les éléments suivants:
best_center : point central optimal de la fenêtre pour chaque image. Les fenêtres d'augmentation dessinées avec best_center en tant que point central exact peuvent sortir de la limite de l'image. Cela se produit généralement lorsque l'image recadrée est plus petite que la taille de la fenêtre. Dans ce cas, nous remplissons l'image et déplacons la fenêtre pour être à l'intérieur de l'image rembourrée en augmentation. Reportez-vous au rapport de données pour plus de détails.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 génère des thermaps en combinant des prédictions pour des correctifs d'images et les enregistre sous forme de format HDF5 dans $HEATMAPS_PATH à l'aide $DEVICE_TYPE device_type. $DEVICE_TYPE peut être «GPU» ou «CPU». $HEATMAP_BATCH_SIZE doit être ajusté en fonction de la taille de la mémoire disponible. Un argument facultatif --gpu-number peut être utilisé pour spécifier le GPU à utiliser.
src/modeling/run_model.py peut fournir des prédictions à l'aide d'images recadrées avec ou sans cartouches thermiques. Lorsque vous utilisez des thermaps, veuillez utiliser l'indicateur --use-heatmaps et fournir les arguments appropriés --model-path et --heatmaps-path . Selon la mémoire disponible, l'argument optionnel --batch-size peut être fourni. Un autre argument facultatif --gpu-number peut être utilisé pour spécifier le GPU à utiliser.
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 Cette commande fait des prédictions uniquement à l'aide d'images pour $NUM_EPOCHS époques avec augmentation aléatoire et sorties de prédictions moyennées par examen à $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 Cette commande fait des prédictions à l'aide d'images et de cartes de chaleur pour les époques $NUM_EPOCHS avec augmentation aléatoire et sorties de prédictions moyennées par examen à $IMAGEHEATMAPS_PREDICTIONS_PATH .
Les fichiers DICOM peuvent être convertis en fichiers PNG avec la fonction suivante, qui peut ensuite être utilisée par le code dans notre référentiel (PYPNG 0.0.19 et Pydicom 1.2.2 Les bibliothèques sont nécessaires).
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 vous avez trouvé ce code utile, veuillez citer notre article:
Les réseaux de neurones profonds améliorent les performances des radiologues dans le dépistage du cancer du sein
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. 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 Healszt, Linda Moy, Kyunghyh
Transactions IEEE sur l'imagerie médicale
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}
}