#python #tensorflow #tf.keras #medical-imaging
#python #tensorflow #tf.keras #медицинская визуализация
Вопрос:
Я пытаюсь прочитать файлы DICOM (.dcm), которые находятся в папке:
/rsna-pneumonia-обнаружение-вызов/stage_2_train_images/
Файлы доступны для чтения и могут отображаться с помощью библиотеки pidicom. Однако, когда я использую Keras ImageDataGenerator для чтения файлов для обучающих конвейеров, он выдает следующую ошибку:
«Ошибка UnidentifiedImageError: не удается идентифицировать файл изображения <_io.BytesIO объект в 0x7f90a47e3b80>»
Как я понимаю из подробной ошибки, Python PIL (Pillow) не может определить формат файла «.dcm».
Мне нужны две идеи:
-
Можно ли использовать Keras ImageDataGenerator для чтения файлов DICOM для обучающего конвейера без необходимости сначала конвертировать эти файлы в какой-либо другой формат, например «.png»? Я прочитал следующий блог в «https://medium.com/@rragundez/medical-images-now-supported-by-keras-imagedatagenerator-e67d1c2a1103 » но это удивительно использует «.PNG» в качестве примера.
-
Возможно ли написать пользовательский генератор, который сначала извлекает информацию о пикселях из файлов DICOM и отправляет пакет в обучающий конвейер?
Любая помощь будет высоко оценена.
Мой код и сообщение об ошибке приведены ниже.
import pandas as pd
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras import regularizers, optimizers
traindf=pd.read_csv(‘/rsna-pneumonia-detection-challenge/stage_2_train_labels.csv',dtype=str)
classdf=pd.read_csv('/rsna-pneumonia-detection-challenge/stage_2_detailed_class_info.csv',dtype=str)
tr100df = traindf[0:100] # take first 100 samples
tr100df.loc[:,'path'] = tr100df.patientId '.dcm'
datagen=ImageDataGenerator(rescale=1./255.,validation_split=0.25)
train_generator=datagen.flow_from_dataframe(
dataframe=tr100df,
directory="/rsna-pneumonia-detection-challenge/stage_2_train_images",
x_col="path",
y_col="Target",
subset="training",
batch_size=32,
seed=42,
shuffle=True,
class_mode="binary",
target_size=(32,32),mode='grayscale',validate_filenames=False)
for image_batch, labels_batch in train_generator:
print(image_batch.shape)
print(labels_batch.shape)
image_np = image_batch.numpy()
label_np = labels_batch.numpy()
break
Ошибка:
UnidentifiedImageError Traceback (most recent call last)
<ipython-input-66-9af954b10f7c> in <module>
----> 1 for image_batch, labels_batch in train_generator:
2 print(image_batch.shape)
3 print(labels_batch.shape)
4 image_np = image_batch.numpy()
5 label_np = labels_batch.numpy()
~/opt/anaconda3/lib/python3.8/site-packages/keras_preprocessing/image/iterator.py in __next__(self, *args, **kwargs)
102
103 def __next__(self, *args, **kwargs):
--> 104 return self.next(*args, **kwargs)
105
106 def next(self):
~/opt/anaconda3/lib/python3.8/site-packages/keras_preprocessing/image/iterator.py in next(self)
114 # The transformation of images is not under thread lock
115 # so it can be done in parallel
--> 116 return self._get_batches_of_transformed_samples(index_array)
117
118 def _get_batches_of_transformed_samples(self, index_array):
~/opt/anaconda3/lib/python3.8/site-packages/keras_preprocessing/image/iterator.py in _get_batches_of_transformed_samples(self, index_array)
225 filepaths = self.filepaths
226 for i, j in enumerate(index_array):
--> 227 img = load_img(filepaths[j],
228 color_mode=self.color_mode,
229 target_size=self.target_size,
~/opt/anaconda3/lib/python3.8/site-packages/keras_preprocessing/image/utils.py in load_img(path, grayscale, color_mode, target_size, interpolation)
112 'The use of `load_img` requires PIL.')
113 with open(path, 'rb') as f:
--> 114 img = pil_image.open(io.BytesIO(f.read()))
115 if color_mode == 'grayscale':
116 # if image is not already an 8-bit, 16-bit or 32-bit grayscale image
~/opt/anaconda3/lib/python3.8/site-packages/PIL/Image.py in open(fp, mode)
2928 for message in accept_warnings:
2929 warnings.warn(message)
-> 2930 raise UnidentifiedImageError(
2931 "cannot identify image file %r" % (filename if filename else fp)
2932 )
UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x7f90a47e3b80>
Комментарии:
1. Вчера я столкнулся с аналогичной проблемой, хотя image_data_generator не находит ни одного допустимого изображения. Я, к сожалению, склоняюсь к созданию параллельного набора PNG :(..