Рубрики
Без рубрики

3D сегментация мозга с UNET (BRATS19)

Ссылка на проект: https: //github.com/ierolsen/brain-tumor-segmation-brats-2019/blob/main/subset_brats1 … Tagged with Unet, машинное обучение, глубокое обучение, Python.

Ссылка проекта: https://github.com/ierolsen/brain-tumor-segmation-brats-2019/blob/main/subset_brats19_colab.ipynb

В этом проекте я стремлюсь работать с 3D -изображениями и моделями UNET. Прежде чем у меня не было никакого шанса поработать с ними, я не имею никакого представления, что они есть. Но этот проект будет таким образовательным для меня. Кроме того, я стремлюсь создать практику в алгоритмах.

Ссылка на набор данных: https://ipp.cbica.upenn.edu/categories/brats2020

Чтобы загрузить набор данных, во -первых, вы должны зарегистрироваться. После регистрации ваша учетная запись будет рассмотрена в течение 3 дней. Затем вы можете отправить запрос на загрузку данных, после этого шага вы получите электронное письмо (если я не ошибаюсь), которое содержит Registration_status.txt Анкет В этом файле TXT вы можете найти ссылки на набора данных поезда и валидации.

Сначала я начал с загрузки данных, используя глобус , Glob – одна из удивительных библиотек Python. Используя это, я могу получить пути. Но определение глобус , Я использовал рекурсивный = Верно что означает достижение подфилов.

После прочтения данных, теперь мне нужно преобразовать в массив Анкет Для этого я буду использовать skimage.io Но сначала он должен быть установлен, таким образом:

pip install skimage

Теперь я могу прочитать данные, но сначала я пойду на шаг за шагом. Я имел в виду, что покажу PIC шаг за шагом, в конце концов, я определю функцию для чтения данных. Я импортирую skimage.io Но я буду использовать его как io Как бы то ни было, используя io.imread () Я могу легко прочитать фото. Но эта функция содержит действительно важный параметр, называемый плагин Это означает, что читают фотографии, я бы предпочел выбрать simpleitk Из -за работы над медицинскими изображениями. Это simpleitk используется для медицинских изображений. Но сначала мне нужно установить это, используя это короткое волшебное слово:

pip install SimpleITK

После установки я читаю картинку:

Как видите, изображение 3D, это здорово, потому что я впервые работаю над 3D -изображениями.

Теперь я визуализирую эти 3D-оси изображения, используя традиционным способом (с помощью matplotlib)

Изображение, которое было рассмотрено, не сегментировано. На этот раз я буду читать и визуализировать сегментированное изображение. Для этого я буду использовать skimage.io очередной раз.

Прочитав свои данные, теперь я визуализирую этот сегментированный IMG как 3 оси:

Мне нужно преобразовать все изображения в массив. Для этого я определю функцию, а затем объясню, что это такое.

Эта функция заставляет вас думать. Но не беспокойтесь, я объясню сейчас. Вероятно, второй петлей заставляет вас думать, поэтому я начну там.

Диапазон (60, 130): В данных нет существенных изображений до 60 и после 130. Все важные изображения находятся от 60 до 130, поэтому я заставляю их содержать только 60 и 130. Кроме того, вы можете найти несколько изображений до 60 и после 130:

Как вы можете видеть выше, опухоль не уверена. Таким образом, нет никакого значения, чтобы сдержать все данные. Также, если все изображения содержатся, это делает мой компьютер силой. К сожалению, у моего компьютера недостаточно места. Так или иначе…

Кроме того, я хочу объяснить, что np.expand_dims () работает. Я работаю над 3D-изображениями, поэтому мне нужно работать с U-Net. Если вы работаете с U-Net, мне нужны 3 входных измерения, которые имеют ширину, высоту и канал. Но изображения 3D, а также нет канала.

Но используя np.expand_dims () Я могу добавить еще один размер в

Как видите, теперь на изображении есть канал.

Если я дам короткое резюме,

  • Сначала я определяю функцию
  • Я определяю пустой список, называемый img_list, который будет использоваться для добавления изображений в конце.
  • Используя глобус Я достигаю мест
  • Затем, используя случайную библиотеку, я их перетасовал
  • Я определяю цикл из -за открытых изображений.
  • После открытия изображений сделали стандартизацию и преобразовать их float32
  • Затем я создал другой для цикла из -за работы на ограниченных изображениях.
  • В Осевая (поперечная) плоскость Полностью 155 изображений доступны. Но я хотел работать только с 60 до 130. Теперь есть 70 изображений.
  • Я применил np.expand_dims () Deu, чтобы добавить еще один размер, который называется каналом.
  • И, наконец, я добавил их к списку изображений, который был определен ранее, а затем он возвращается как np.array () !

Это все…

1 – Неуничивая опухоль

2 – Отек

4 – Увеличение опухоли

Чтобы ясно понять, я буду визуализировать пошаговые области опухоли. Но сначала я снова покажу вам сегментированное изображение.

На изображении выше вы можете увидеть слой по слою невыполнительной опухоли, отека и усиления опухоли.

Сначала я начну со всех опухолей площади, для этого я равновлю все значения 1, которые не равны 0. Таким образом, только все области опухоли появятся четко.

После этого я продолжу с невыполнительной опухолью, которая отмечена 1. Чтобы он появился, я равновлюсь всей области 0, за исключением тех, которые равны 1.

И теперь я могу визуализировать отек, чтобы сделать это, мне нужно покрыть (равное ноль) Неуничивая опухоль (1) и усиление опухоли (4). Для этого, если значения равны 1 и 4, я равновлю их 0. Но если другие значения не равны нулю, я равновлю их 1. Это то, что я ожидаю.

Затем, наконец, я могу визуализировать усиление опухоли для этого, только я расскажу о тех, которые не равны 4. Я имел в виду, что я буду показывать только значения, которые не равны 4.

Теперь пришло время определить функцию, которая превращает изображения в массив.

Кроме того, нам нужно исходное сегментированное изображение, и я назвал его 0. Это исходное сегментированное изображение будет использоваться для сравнительный Анкет

Но также я не могу использовать эти функции из -за пустого размера моего компьютера. Когда я попробую, я получил ошибку памяти. Может быть, на следующий день, я могу понять это. Я надеюсь, что это так.

ОТЛИЧНЫЕ НОВОСТИ:

Наконец, я понял это! Вместо записной книжки Jupyter я использую Google Colab. Это лучший способ на самом деле, даже вероятно, я буду использовать его в своих всех проектах:)

В любом случае, я хочу поговорить о том, как загрузить данные в Колаб и т. Д.

Во -первых, вы должны подключить свою учетную запись Gmail и перейти к разделу диска. После этого шага вы должны загрузить свои данные в диск. Это все! Затем откройте ноутбук Colab и начните код! Я не знаю, есть ли другой способ, на самом деле я не искал этого, потому что меня раздражало свой компьютер.

Но на этот раз я сталкиваюсь с другой проблемой. Когда я запускаю код, который преобразуется в массивные изображения поезда, файл Google Colab дает ошибку времени выполнения. Но когда я запускаю код, который преобразуется в массив для набора данных сегментации, нет проблем, он работает, и я не сталкивается с ошибкой.

Кроме того, я исправил эти ошибки:) То, что я сделал, Изменение размера Все изображения. Их размеры составляли 240 240, после изменения размера у них 120 120 размеров.

Перед определением модели я определю Flair , T2 и SEG картинки. Также во время обучения я буду использовать FLAIR + T2 Анкет Дело Талант и T2 будет добавлен каждый я. Причина, по которой я добавлю два изображения под названием Flair и T2 это то, что эти два изображения завершают свой недостаток. Например, мы можем ясно видеть отек в Flair, но в T2 мы можем четко увидеть центр опухоли.

Объяснения

K.set_image_data_format('channels_first')

Форма изображений такая: (2, 120, 120),

Если изображения такие: (120, 120, 2), тогда я бы использовал этот код

K.set_image_data_format('channels_last')

Коэффициент костей

Когда мы используем точность в моделях U-Net, мы не можем понять, что модель была обучена или нет. Таким образом, мы используем коэффициент костей. Когда мы ставим изображения друг на друга, коэффициент костей дает различия пикселей. В моделях U-Net вход и вывод картинки !! Поэтому мы должны проанализировать разницу пикселей.

НОВОСТИ:

К сожалению для 2 дней, я пытался решить некоторые ошибки UNET.

Первый из них был о версии TensorFlow. В моей среде я использую версию 1.13.1 TF с 2017 года. Тогда мое решение было, используя Colab очередной раз. Потому что Colab использует 2.4.1 TF версия.

Еще одна и последняя ошибка была:

ValueError: A Concatenate Слой требует входов с соответствующими формами, за исключением оси CONCAT. Получил входные формы: [(Нет, 512, 14, 14), (нет, 512, 15, 15)]

Когда я погуглил это, то, что я нашел, было связано с размером изображений. Я узнал, что когда вы работаете с нейронными сетями, размеры ваших изображений должны быть разделены на 32. Затем я изменил размеры как (128,128)

Затем используя графический процессор Colab Я обучил свою модель в 15 -й эпохи.

Чтобы проверить мою модель, я случайным образом выберу изображение, а затем сделаю его предсказанным моделью. Но Сначала мне нужно расширить размер моего изображения. Потому что во время обучения модель работала с 4 измерениями, поэтому я буду использовать np.expand_dims () очередной раз. Во -первых, его размер был (2, 128, 128) после расширения, его размер составляет (1, 2, 128, 128)

На самом деле, все эти части были легкой частью. Теперь пришло время переключиться на тяжелую часть! Теперь я узнаю решение для сегментирования отдельно усиления опухоли и центра опухоли.

На приведенных выше изображениях, как вы можете видеть, не повышающая опухоль, и усиление изображений опухоли кажутся действительно меньше на картинках. Так что моя цель – обрезать бесполезные области этих изображений.

Для этого я применю эти шаги:

  • Я получу координаты Опухолевые центры не повышающей опухоль и усиления опухоли с использованием Numpy

  • Тогда я буду обрезать изображения, используя эти координаты в качестве центральной точки.

  • Эти этапы обрезки, все обрезанные изображения будут вводиться для модели UNET для обучения.

  • В конце концов, я добавлю новый вывод в исходное изображение, используя координату обрезанного изображения.

Итак, как я могу найти центральную точку опухолей? Ответ в том, что использование по np. где () NP. где дает координаты в качестве списка для 2 оси (x, y)

Согласно этим результатам, когда я рассчитываю центральную точку, мне нужно сделать это (min_value + max_value)/2 дает мне центральную точку для 2 оси.

Теперь я могу обрезать это Но сначала я создам матрицу, которая имеет (64,64) размеры. После этой матрицы, которая имеет только нули, я добавлю T1ce изображение. Но важный момент – когда я добавляю их, я должен добавить 64/2 А также я должен вычесть 64/2 Эти операции предусматривают, что изображение будет средним от матрицы.

После T1ce изображение , Я сделаю это те же шаги для изображения сегментации.

Чтобы объяснить мои шаги, я случился со всеми этими шагами только с одним изображением, которое составляет 280 изображений набора данных.

Пришло время определить функцию, которая применяет все эти шаги для всех изображений!

Как вы можете видеть на изображении выше, я определил свою функцию. Кроме того, я не думаю, что мне нужно объяснить, что они есть, потому что я верю, что я упомянул их хорошим образом!

После применения этих функций вы можете понять, что все изображения становятся больше, и они более ясны.

На следующем шаге все изображения будут превращены в np.array для петли.

Но К сожалению, когда я использую этот цикл для всех изображений, я снова получаю ошибку, я тщательно проверил ее Но тогда я понял, что в коде нет ошибок. Потому что, чтобы проверить это, я создал подмножество, в котором около 217 изображений (36 файлов HGG), и когда я использую их, код работает! Это означает, что в коде нет ошибок, проблема на изображениях. Но я не знаю почему. В следующие несколько дней, вероятно, я могу работать над этим, почему.

Ошибка:

После использования подмножества (часть всего набора данных HGG -изображений)

Как видите, в коде нет никаких изменений, но он работает для изображений, которые находятся в подмножеством.

После этого цикла все изображения сегментации будут в центре кадра, а также они выглядят больше, ясно!

Теперь я снова буду тренировать модель для обрезанных изображений

Модель не получает хорошие результаты из -за того, что я работал с подмножеством (меньше наборов данных), но в следующие дни, если я решу ошибку, я загрузил это снова.

В этом великом проекте я узнал тонны полезных знаний об алгоритмах, компьютерном зрении и, прежде всего, трехмерных изображениях и моделей UNET. Другая важная вещь, которую я узнал, – это абсолютно исправление ошибки:) Они заняли несколько дней Но я решил их все! Эти проекты – лучший способ улучшить себя, столкнуться с новыми ошибками и решать их.

Но на самом деле, я не могу сказать, что этот проект заканчивается здесь, потому что у меня есть какое -то представление о том, что я должен обновить этот проект Но я не могу из -за своих экзаменов. К сожалению, мои экзамены приближаются, поэтому мне нужно учиться.

Некоторые идеи, которые я должен добавить к этому проекту:

  • Улучшение урожай функция Я определил размер как (64, 64), но если опухоль больше, чем этот размер, что произойдет? Опухоль не может вписаться в кадр. Поэтому я должен определить новую функцию, которая содержит некоторые простые условия в соответствии с размером опухоли.

В любом случае, может быть, я тоже смогу улучшить эту функцию.

Ссылка GitHub: https://github.com/ierolsen/brain-tumor-segmation-brats-2019/blob/main/subset_brats19_colab.ipynb

Оригинал: “https://dev.to/erol/3d-brain-segmentation-with-unet-brats19-4cmj”