TensorFlow tf.data.Dataset API для медицинской визуализации

1

Я студент в области медицинской визуализации. Я должен построить нейронную сеть для сегментации изображения. У меня есть набор данных из 285 субъектов, каждый из которых имеет 4 модальности (T1, T2, T1ce, FLAIR) + их истинная основа сегментации. Все в 3D с разрешением 240x240x155 вокселей (это набор данных BraTS).

Как мы знаем, я не могу ввести все изображение на GPU по причинам памяти. Я должен предварительно обработать изображения и разбить их на перекрывающиеся 3D-фрагменты (вложенные тома 40x40x40), которые я делаю с scikit-image view_as_windows, а затем сериализовать окна в файле TFRecords. Поскольку каждый патч перекрывается 10 вокселями в каждом направлении, эти суммы составляют 5292 патча на том. Проблема в том, что при использовании только одной модальности я получаю размеры 800 ГБ на файл TFRecords. Кроме того, я должен вычислить их соответствующую карту веса сегментации и сохранить ее как патчи. Сегментация также сохраняется как патчи в том же файле.

И мне в конечном итоге придется включить все другие модальности, которые занимают не меньше, чем терабайты памяти. Я также должен помнить, что я должен также выбрать эквивалентное количество патчей между фоном и передним планом (балансировка классов).

Итак, я предполагаю, что мне нужно делать все этапы предварительной обработки на лету, перед каждым этапом тренировки (в надежде также не замедлять процесс обучения). Я не могу использовать tf.data.Dataset.from_tensors() так как не могу загрузить все в ОЗУ. Я не могу использовать tf.data.Dataset.from_tfrecords() так как предварительная обработка всего этого прежде занимает много памяти, и я в конечном итоге закончу.

Вопрос в том, что мне оставалось, если бы я сделал это аккуратно с возможностью перезагрузить модель после тренировки для вывода изображений?

Большое спасибо и не стесняйтесь спрашивать любые другие детали.

Pierre-Luc

Теги:
tensorflow

2 ответа

1
Лучший ответ

Наконец, я нашел способ решить мою проблему.

Сначала я обрезаю изображение объекта без применения фактической обрезки. Я измеряю только те кусочки, которые мне нужны, чтобы обрезать объем только до мозга. Затем я сериализовал все изображения набора данных в один файл TFRecord, каждый обучающий пример представлял собой модальность изображения, исходную форму изображения и фрагменты (сохраненные как функция Int64).

Я декодирую TFRecords позже. Каждый обучающий образец преобразуется в форму, содержащуюся в элементе. Я укладываю все модальности изображения в стек, используя tf.stack(). Я обрезаю стопку, используя ранее извлеченные фрагменты (обрезка затем применяется ко всем изображениям в стопке). Наконец, я получил несколько случайных патчей, используя tf.random_crop() который позволяет мне произвольно обрезать 4-D массив (высота, ширина, глубина, канал).

Единственное, что я до сих пор не понял, это увеличение данных. Поскольку все это происходит в формате Tensors, я не могу использовать обычный Python и NumPy для вращения, сдвига, переворачивания 4-D массива. Мне нужно было бы сделать это в tf.Session(), но я бы предпочел избежать этого и напрямую ввести дескриптор обучения.

Для оценки я сериализирую в файле TFRecords только одного субъекта теста на файл. Испытуемый также содержит все модальности, но поскольку нет методов TensorFLow для извлечения исправлений в 4-D, изображение предварительно обрабатывается небольшими исправлениями с использованием метода Scikit-Learn extract_patches(). Я сериализовал эти патчи в TFRecords.

Таким образом, обучение TFRecords намного меньше. Я могу оценить тестовые данные, используя прогнозирование партии.

Спасибо за чтение и не стесняйтесь комментировать!

0

Для решения проблемы, упомянутой в ответе Пьера, вы можете использовать multidim-image-augmentation для увеличения данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню