Сегментация UNet для позвоночника

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

Позвоночник является важной частью опорно-двигательного аппарата, поддерживая тело и структуру его органов, играя важную роль в нашей подвижности и переносе нагрузки. Он также защищает спинной мозг от травм и механических ударов из-за ударов.

В автоматизированном конвейере обработки позвоночника маркировка и сегментация позвонков являются двумя фундаментальными задачами. Ожидается, что надежная и точная обработка изображений позвоночника принесет пользу системам поддержки принятия клинических решений для диагностики, планирования операции и популяционного анализа здоровья позвоночника и костей. Разработка автоматизированных алгоритмов для обработки позвоночника является сложной задачей в основном из-за значительных различий в анатомии и протоколах получения данных, а также из-за острой нехватки общедоступных данных.

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

Сегментация позвоночника или позвонков является важным шагом во всех приложениях, касающихся автоматизированного количественного определения морфологии и патологии позвоночника. С появлением глубокого обучения для такой задачи на компьютерной томографии (КТ) большие и разнообразные данные становятся основным востребованным ресурсом. Однако крупномасштабный общедоступный набор данных в настоящее время недоступен. VerSe — это крупномасштабный набор данных КТ позвоночника с несколькими детекторами и несколькими участками, состоящий из 374 сканирований 355 пациентов. Есть наборы данных как за 2019, так и за 2020 год. Для этого блога я объединил оба набора данных в один набор данных, чтобы получить больше данных.



GitHub — anjany/verse: Все о «Вызове крупномасштабной сегментации позвонков @ MICCAI…
Внимательно посмотрите на позвоночник в поисках причины болезни — примеры Гиппократа VerSe. Обратите внимание на изменчивость данных…github.com»



The data is provided under the CC BY-SA 4.0 License, making it fully open-sourced.

NIfTI (Neuroimaging Informatics Technology Initiative) – это тип формата файла для нейровизуализации. Файлы NIfTI очень часто используются в информатике изображений для нейробиологии и даже нейрорадиологических исследований. Каждый файл NIfTI содержит метаданные и воксел до 7 измерений и поддерживает различные типы данных. Первые три измерения зарезервированы для определения трех пространственных измерений x, y, и z, а четвертое измерение зарезервировано для определения времени. точек t. Остальные измерения, с пятого по седьмое, предназначены для других целей. Пятое измерение, однако, все еще может иметь некоторые предопределенные области применения, например, для хранения параметров распределения, специфичных для вокселей, или для хранения векторных данных. Набор данных VerSe содержит zip-файлы файлов NIfTI.

ITK-SNAP — это программное приложение, используемое для сегментации структур на трехмерных медицинских изображениях. Это программное обеспечение с открытым исходным кодом, которое можно установить на разные платформы. Я использовал его, чтобы иметь возможность визуализировать файлы NifTi в 3D-виде, а также загружать и накладывать 3D-маски на необработанные изображения. Я настоятельно рекомендую использовать его для этой задачи.

Компьютерная томография (КТ) — это процедура визуализации рентгеновских лучей, при которой узкий пучок рентгеновских лучей направлен на пациента, быстро вращаясь вокруг тела. Сигналы, собранные машиной, будут храниться в компьютере для создания изображений поперечного сечения, также известных как «срезы» тела. Эти срезы называются томографическими изображениями и содержат более подробную информацию, чем обычные рентгеновские снимки. Серии срезов могут быть сложены вместе в цифровом виде для формирования трехмерного изображения пациента, что упрощает идентификацию и определение местоположения основных структур, а также возможных опухолей или аномалий.

Этапы действий следующие. Я начал со скачивания наборов данных за 2019 и 2020 годы. Затем я объединил оба набора данных в их папку для обучения, проверки и тестирования. Следующим шагом является чтение изображений компьютерной томографии и преобразование каждого фрагмента изображения компьютерной томографии в серию необработанных изображений PNG и масок. Позже я использовал модель UNet из этого репозитория Github и обучил модель сегментации.

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

После загрузки набора данных VerSe я смог открыть один файл .nii.gz с помощью библиотеки NiBabel (описано ниже). Прочитав один файл и посмотрев на один конкретный срез изображения КТ, я смог запустить функцию транспонирования Numpy для просмотра одного среза в трех разных проекциях: аксиальном, сагиттальном и коронарном.

После того, как я поближе познакомился с необработанными изображениями и смог вырезать один срез из необработанного 3D-изображения, пришло время взглянуть на файл маски для того же среза. Как вы можете видеть на изображении ниже, я смог наложить фрагмент маски на фрагмент необработанного изображения. Причина, по которой мы видим здесь градиентный цвет, заключается в том, что файлы маски представляют собой не только определенные области каждого существующего позвонка, но и имеют разные метки (показаны разными цветами) вместе с ними, которые являются номером или меткой каждого позвонка. Чтобы лучше понять маркировку позвоночника, вы можете обратиться к этой странице.

Подготовка данных. Задача подготовки данных заключается в создании срезов изображений из каждого файла 3D-КТ как из необработанных изображений, так и из файлов масок. Он начинается с чтения необработанных изображений и изображений маски в формате “.zip” с использованием библиотеки NiBabel и преобразования их в массив Numpy. Затем просматривая каждое 3D-изображение, проверяя угол обзора каждого изображения и пытаясь преобразовать большинство из них в сагиттальный вид. Затем я сгенерировал файлы PNG из каждого фрагмента и сохранил их в формате «L», который представляет собой значение в градациях серого. В этом случае нам не нужно было генерировать изображения RGB, поскольку каждый срез КТ имеет только одномерные значения.

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

Я также использовал Pytorch и Pytorchvision для этой задачи. Как я уже упоминал, в этом репозитории есть хорошая реализация UNet с использованием PyTorch, и я использовал некоторые коды из него.

Поскольку я работаю с файлами NIfTI и могу читать эти файлы на python, я буду использовать библиотеку NiBabel. NiBabel — это библиотека Python для чтения и записи некоторых распространенных форматов файлов для медицины и нейровизуализации, таких как файлы NIfTI.

Оценка в кости. Чтобы оценить, как наша модель справляется с задачей семантической сегментации, мы можем использовать оценку в кости. Коэффициент Dice равен 2 * площадь перекрытия (между прогнозируемой замаскированной областью и истинной замаскированной областью), деленная на общее количество пикселей в обоих изображениях.

Обучение. Сначала я определил класс UNet, а затем определил класс набора данных PyTorch, который включает чтение и предварительную обработку изображений. Задача предварительной обработки включает в себя загрузку файлов PNG, изменение их размера до одного размера (в данном случае 250x250) и преобразование их всех в массив NumPy, а затем в тензоры PyTorch. Вызывая класс набора данных (VerSeDataset), мы можем подготовить наши данные в пределах пакетов, которые я определил. Чтобы убедиться, что сопоставление между необработанным изображением и изображением маски является правильным, я однажды вызвал next(iter(valid_dataloader)), чтобы получить следующий элемент в пакете и визуализировать его.

Позже я определяю модель как model = UNet(n_channels=1, n_classes=1). Количество каналов равно 1, так как у меня есть изображение в градациях серого, а не RGB, если ваше изображение представляет собой изображение RGB, вы можете изменить количество каналов на 3. Количество классов равно 1, поскольку у меня есть только один класс того, является ли один пиксель является частью позвонка или нет. Если ваша проблема заключается в многоклассовой сегментации, вы можете установить количество классов равным количеству классов, которое у вас есть. Позже я тренировал модель в течение некоторого количества эпох. Для каждой партии я сначала вычислил значение потерь, обновил параметры, выполнив обратное распространение. Позже я снова просмотрел все партии и только рассчитал потери для набора данных проверки и сохранил значения потерь. Затем я визуально просмотрел значения потерь как для обучения, так и для проверки и отследил производительность нашей модели.

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

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

Вы можете найти весь код здесь:

Будущие работы: эту задачу также можно выполнить с помощью 3D UNet, и это может быть лучшим подходом к изучению структуры позвонка. Поскольку у нас есть метки для каждой области маски каждого позвонка, мы можем дополнительно выполнить сегментацию мультиклассовой маски. Кроме того, производительность модели лучше всего, когда вид изображения является сагиттальным, поэтому, возможно, преобразование всех срезов в сагиттальный будет лучшей моделью.

Спасибо за прочтение!