Esta é uma implementação do modelo usado para a classificação do câncer de mama, conforme descrito em nossas redes neurais profundas de papel, melhorando o desempenho dos radiologistas na triagem do câncer de mama. A implementação permite que os usuários obtenham previsões de câncer de mama aplicando um de nossos modelos pré-treinados: um modelo que leva imagens como entrada ( somente de imagem ) e um modelo que leva imagens e mapas de calor como entrada ( imagem e calor ).
left_benign , right_benign , left_malignant e right_malignant . Ambos os modelos atuam nos exames de mamografia de triagem com quatro vistas padrão (L-CC, R-CC, L-MLO, R-MLO). Como parte deste repositório, fornecemos 4 exames de amostra (no diretório de sample_data/images e na lista de exames armazenados em sample_data/exam_list_before_cropping.pkl ). O modelo de geração de mapa de calor e os modelos de classificação de câncer são implementados em Pytorch.
Atualização (2019/10/26) : Nosso artigo será publicado nas transações do IEEE em imagens médicas!
Atualização (2019/08/26) : Adicionamos uma implementação do TensorFlow do nosso modelo de imagem .
Atualização (2019/06/21) : Incluímos o modelo de imagem, conforme descrito no artigo que gera previsões com base em uma única imagem de mamografia. Esse modelo é um pouco abaixo do modelo de visualização usado acima, mas pode ser usado em imagens de mamografia única, em oposição aos exames completos.
ATUALIZAÇÃO (2019/05/15) : Corrigido um bug menor que fez com que as colunas de quadro de dados de saída ( left_malignant , right_benign ) fossem trocadas. Observe que isso não afeta a operação do modelo.
Este repositório é licenciado nos termos da licença GNU AGPLV3.
Aqui, descrevemos como obter previsões do modelo de visualização , que é o nosso modelo de melhor desempenho. Este modelo tira 4 imagens de cada visualização como previsões de entrada e saída para cada exame.
bash run.shExecutará automaticamente o pipeline inteiro e salvará os resultados da previsão no CSV.
Recomendamos a execução do código com uma GPU (definida por padrão). Para executar o código somente com CPU, altere DEVICE_TYPE em run.sh para 'CPU'.
Se executar os scripts Python individuais, inclua o caminho para este repositório no seu PYTHONPATH .
Você deve obter as seguintes saídas para os exames de amostra fornecidos no repositório.
Previsões usando o modelo somente de imagem (encontrado em sample_output/image_predictions.csv por padrão):
| índice | esquerd_benign | Right_benign | esquerd_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 |
Previsões usando o modelo de imagem e aquecimento (encontrado em sample_output/imageheatmap_predictions.csv por padrão):
| índice | esquerd_benign | Right_benign | esquerd_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 |
Aqui também enviamos o modelo de imagem , que é diferente e tem um desempenho pior do que o modelo de exibição descrito acima. A saída CSV do modelo de exibição será diferente da do modelo de imagem nesta seção. Como esse modelo tem o benefício de criar previsões para cada imagem separadamente, tornamos esse modelo público para facilitar o aprendizado de transferência.
Para usar o modelo de imagem , execute um comando como o seguinte:
bash run_single.sh " sample_data/images/0_L_CC.png " " L-CC "Onde o primeiro argumento é o caminho para uma imagem de mamografia, e o segundo argumento é a visão correspondente a essa imagem.
Você deve obter a seguinte saída com base no comando de exemplo acima:
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}
Incluímos um notebook de amostra que contém código para executar os classificadores com e sem mapas de calor (exclui o pré -processamento).
Para usar um dos modelos pré-tenhados, a entrada é necessária para consistir em pelo menos quatro imagens, pelo menos uma para cada visualização (L-CC, L-MLO, R-CC, R-MLO).
As mamografias originais de 12 bits são salvas como imagens redimensionadas de 16 bits para preservar a granularidade das intensidades de pixel, enquanto ainda são exibidas corretamente nos espectadores de imagem.
sample_data/exam_list_before_cropping.pkl contém uma lista de informações do exame antes de pré -processamento. Cada exame é representado como um dicionário com o seguinte 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 as imagens das vistas L-CC e L-MLO estejam voltadas para a direção certa, e as imagens das vistas R-CC e R-MLO estão voltadas para a direção esquerda. horizontal_flip indica se todas as imagens no exame são invertidas horizontalmente do esperado. Os valores para L-CC , R-CC , L-MLO e R-MLO são listas de nomes de arquivos de imagem sem nome de extensão e diretório.
Informações adicionais para cada imagem são incluídas como dicionário. Esse dicionário tem todas as 4 visualizações como chaves, e os valores são as informações adicionais para a chave correspondente. Por exemplo, window_location , que indica as bordas superior, inferior, esquerda e direita da janela de corte, é um dicionário que possui 4 teclas e possui 4 listas como valores que contêm as informações correspondentes para as imagens. Além disso, rightmost_pixels , bottommost_pixels , distance_from_starting_side e best_center são adicionados após o pré -processamento. Descrição para esses atributos pode ser encontrada na seção de pré -processamento. A seguir, é apresentado um exemplo de informações sobre exames após o corte e extrair centros ideais:
{
'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 )]
}
}Os rótulos para os exames incluídos são os seguintes:
| índice | esquerd_benign | Right_benign | esquerd_malignant | Right_malignant |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 1 |
| 2 | 1 | 0 | 0 | 0 |
| 3 | 1 | 1 | 1 | 1 |
O oleoduto consiste em quatro etapas.
As seguintes variáveis definidas no run.sh podem ser modificadas conforme necessário:
NUM_PROCESSES : O número de processos a serem usados no pré -processamento ( src/cropping/crop_mammogram.py e src/optimal_centers/get_optimal_centers.py ). Padrão: 10.
DEVICE_TYPE : Tipo de dispositivo a ser usado na geração e classificadores de mapa de calor, 'CPU' ou 'GPU'. Padrão: 'GPU'
NUM_EPOCHS : o número de épocas a ser calculado na saída da saída dos classificadores. Padrão: 10.
HEATMAP_BATCH_SIZE : o tamanho do lote a ser usado na geração de mapa de calor. Padrão: 100.
GPU_NUMBER : Especifique qual das GPUs a serem usadas quando várias GPUs estão disponíveis. Padrão: 0.
DATA_FOLDER : o diretório em que a mamografia é armazenada.
INITIAL_EXAM_LIST_PATH : o caminho em que a lista de exames inicial sem qualquer metadado é armazenada.
PATCH_MODEL_PATH : o caminho em que os pesos salvos para o classificador de patch são salvos.
IMAGE_MODEL_PATH : o caminho em que os pesos salvos para o modelo somente de imagem são salvos.
IMAGEHEATMAPS_MODEL_PATH : o caminho em que os pesos salvos para o modelo de imagem e aquecimento são salvos.
CROPPED_IMAGE_PATH : o diretório para salvar mamografias cortadas.
CROPPED_EXAM_LIST_PATH : o caminho para salvar a nova lista de exames com metadados de corte.
EXAM_LIST_PATH : o caminho para salvar a nova lista de exames com os melhores metadados centrais.
HEATMAPS_PATH : o diretório para salvar mapas de calor.
IMAGE_PREDICTIONS_PATH : o caminho para salvar previsões do modelo somente de imagem .
IMAGEHEATMAPS_PREDICTIONS_PATH : o caminho para salvar previsões do modelo de imagem e aquecimento .
Execute os seguintes comandos para cortar mamografias e calcular informações sobre as janelas 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 saia a mamografia ao redor da mama e descarta o fundo, a fim de melhorar a imagem de carregamento da imagem e a hora para executar o algoritmo de segmentação e salvar cada imagem cortada em $PATH_TO_SAVE_CROPPED_IMAGES/short_file_path.png usando h5py. Além disso, adiciona informações adicionais para cada imagem e cria uma nova lista de imagens para $CROPPED_IMAGE_LIST_PATH ao descartar imagens que ela não coloca. Opcional -Argumento de Verbose imprime informações sobre cada imagem. As informações adicionais incluem o seguinte:
window_location : Localização da janela Cropping Wrt Original Dicom Image para que o mapa de segmentação possa ser cortada da mesma maneira para o treinamento.rightmost_points : os pixels da direita mais à direita depois de serem invertidos corretamente.bottommost_points : BottomMost Pixels diferentes de zero depois de ser invertido corretamente.distance_from_starting_side : registros se o espaço de valor zero entre a borda da imagem e a mama for encontrado no lado onde a mama começar a aparecer e, portanto, não deveria ter sido lacuna. Dependendo do conjunto de dados, esse valor pode ser usado para determinar o valor errado do 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 produz uma nova lista de exames com metadados adicionais para $EXAM_LIST_PATH . As informações adicionais incluem o seguinte:
best_center : ponto central ideal da janela para cada imagem. As janelas de aumento desenhadas com best_center como ponto central exato podem sair do limite da imagem. Isso geralmente acontece quando a imagem cortada é menor que o tamanho da janela. Nesse caso, acessamos a imagem e mudamos a janela para estar dentro da imagem acolchoada no aumento. Consulte o relatório de dados para obter mais detalhes.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 gera mapas de calor combinando previsões para patches de imagens e salva como formato HDF5 em $HEATMAPS_PATH usando o dispositivo $DEVICE_TYPE . $DEVICE_TYPE pode ser 'gpu' ou 'cpu'. $HEATMAP_BATCH_SIZE deve ser ajustado dependendo do tamanho da memória disponível. Um argumento opcional --gpu-number pode ser usado para especificar qual GPU usar.
src/modeling/run_model.py pode fornecer previsões usando imagens cortadas com ou sem mapas de calor. Ao usar mapas de calor, use o sinalizador --use-heatmaps e forneça os argumentos --model-path e --heatmaps-path . Dependendo da memória disponível, o argumento opcional --batch-size pode ser fornecido. Outro argumento opcional --gpu-number pode ser usado para especificar qual 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 faz previsões apenas usando imagens para as épocas $NUM_EPOCHS com aumento aleatório e saídas previsões médias por exame para $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 faz previsões usando imagens e mapas de calor para épocas $NUM_EPOCHS com aumento aleatório e saídas previsões médias por exame para $IMAGEHEATMAPS_PREDICTIONS_PATH .
Os arquivos DICOM podem ser convertidos em arquivos PNG com a seguinte função, que podem ser usados pelo código em nosso repositório (Pypng 0.0.19 e Pydicom 1.2.2 são necessárias bibliotecas).
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 ())Se você achou esse código útil, cite nosso artigo:
Redes neurais profundas melhoram o desempenho dos radiologistas na triagem de 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 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 Transações em imagem médica
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}
}