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

Начать применять глубокое обучение к изображениям магнитного резонанса (МРТ) или компьютерной томографии (КТ) непросто; поиск подходящих наборов данных, предварительная обработка данных и создание структур загрузчика данных, необходимых для выполнения работы, является сложной задачей. В этом посте я надеюсь облегчить эту боль новичкам. Для этого я свяжусь с несколькими свободно доступными наборами данных, рассмотрю некоторые общие / необходимые методы предварительной обработки, характерные для МРТ и КТ, и покажу, как использовать библиотеку fastai для загрузки (структурных) МР-изображений и обучения глубоких нейронных сетей. сеть для задачи синтеза.

Обзор изображений МРТ и КТ

Прежде чем мы перейдем к сути этого поста, будет полезно сделать краткий обзор медицинских изображений, о которых мы будем говорить, и некоторых особенностей обсуждаемых типов изображений. Я буду говорить только о структурных МР-изображениях и (в меньшей степени) изображениях компьютерной томографии (КТ). Оба этих типа методов визуализации используются для просмотра структуры ткани; это противоположно функциональным МР-изображениям (фМРТ) или позитронно-эмиссионной томографии (ПЭТ), которые отображают активность кровотока и метаболическую активность, соответственно.

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

Я не буду вдаваться в подробности тонкостей структурной МРТ. Хорошее место для начала для более глубоких подробностей MR - это этот веб-сайт, на котором подробно рассматривается любая тема, которая интересует практикующего ML, работающего с MR. Замечу, что есть много различных типов МРТ-изображений, которые может создавать МРТ-сканер. Например, среди прочих есть T1-взвешенное, T2-взвешенное, PD-взвешенное, восстановление с инверсией с ослаблением жидкости (FLAIR). Чтобы усложнить ситуацию, существуют подтипы этих типов изображений (например, изображения, взвешенные по T1, бывают разных видов: MPRAGE, SPGR и т. Д.). В зависимости от вашей задачи эта информация может быть чрезвычайно полезной из-за уникальных характеристик каждого из этих типов и подтипов изображений. Причина всех этих разных типов изображений в том, что МРТ-сканеры - это гибкие машины, которые можно запрограммировать для сбора различной информации в соответствии с различными импульсными последовательностями. В результате все эти изображения не просто лишняя информация; они содержат полезную и уникальную информацию о клинических маркерах, о которых заботятся радиологи (или мы, как обработчики изображений). Опять же, я расскажу больше об уникальных аспектах MR в разделе предварительной обработки.

Несмотря на то, что существует контрастная и неконтрастная компьютерная томография, существует не так много разновидностей изображений, которые можно создать с помощью компьютерного томографа. Смутно, компьютерный томограф стреляет через вас фотонами высокой энергии, энергия которых рассчитывается с помощью детектора на другой стороне вашего тела, куда попадают фотоны. Когда подобные изображения снимаются под разными углами, мы можем использовать наши знания о геометрии, с которой были получены изображения, для преобразования изображения в трехмерный объем. Физическое представление энергии позволяет нам сопоставить найденные значения интенсивности со стандартной шкалой, которая также упрощает нашу жизнь и более подробно обсуждается в разделе предварительной обработки. Я должен отметить, что хотя МРТ хороша для контрастирования мягких тканей (например, способность различать серое и белое вещество в головном мозге), КТ имеет несколько плохой контраст мягких тканей. См. В качестве примера изображения головы, полученные с помощью МРТ и компьютерной томографии, где в качестве примера можно увидеть контраст между серым веществом (вдоль внешней стороны мозга) и белым веществом (более яркая ткань внутри серого вещества). как общий уровень шума в мозгу для обоих изображений.

Некоторые из причин, по которым МРТ не всегда используются: 1) некоторые люди не могут этого сделать по разным причинам (например, отсутствие доступа, определенные типы металлических имплантатов и т. Д.), 2) МРТ-сканирование занимает относительно много времени. время по сравнению с компьютерной томографией и 3) радиологи интересуются конкретными измерениями, которые может обеспечить компьютерная томография (например, изучением структуры кости). Теперь, когда у нас есть базовое представление о данных и некоторых тонкостях методов построения изображений, давайте обсудим некоторые наборы данных.

Наборы данных

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

  • Brainweb: моделирование нормального мозга и мозга с рассеянным склерозом с сегментацией ткани / поражения (MINC).
  • Кирби 21: Набор из 21 здорового пациента, сканированный дважды (НИфТИ).
  • Набор данных IXI: набор из 600 сканированных изображений здоровых людей (НИФТИ)
  • Qure.ai данные компьютерной томографии головы: набор из 491 компьютерной томографии головы с патологией [без сегментации, но с радиологическим отчетом] (DICOM)

Вот список непростых для загрузки (но очень полезных) наборов данных.

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

Еще одно место для поиска наборов данных - OpenNeuro, который представляет собой хранилище для исследователей, в котором размещаются наборы данных изображений мозга; Насколько я могу судить, он в основном состоит из фМРТ. Если ваша страсть кроется не в изображениях МРТ и КТ мозга, то я, к сожалению, не лучший ресурс. Моим первым предположением было бы взглянуть на большие проблемы, перечисленные здесь, и посмотреть, возможно ли получить доступ к данным.

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

Предварительная обработка

Объем обработки и предварительной обработки данных, необходимых для работы с MR и CT, может быть значительным. Ниже я расскажу о самом необходимом.

В первую очередь следует подумать о том, как загрузить изображения в Python. Самый простой способ - использовать нибабель. Тогда вы можете просто использовать

import nibabel as nib
data = nib.load('mydata.nii.gz').get_data()

чтобы получить массив numpy, содержащий данные внутри файла mydata.nii.gz. Обратите внимание, что я буду называть индексы этого трехмерного объема вокселем, который является трехмерным эквивалентом пикселя для двухмерного изображения. По крайней мере, для работы с изображениями мозга я бы рекомендовал всегда конвертировать файлы в формат NIfTI (который соответствует расширению .nii или .nii.gz). Я считаю, что преобразование всего в NIfTI в первую очередь облегчает мою жизнь, поскольку я могу предположить, что все входные изображения относятся к типу NIfTI. Вот инструмент для преобразования DICOM в NIfTI, вот скрипт для преобразования MHA в NIfTI и вот скрипт для преобразования файлов PAR / REC в NIfTI. Есть и другие форматы файлов, с которыми вам, вероятно, придется работать, и вы можете использовать некоторые из этих скриптов в качестве вдохновения для преобразования этих типов файлов.

Сначала мы рассмотрим повторную выборку, коррекцию поля смещения и регистрацию, которые являются основными элементами любого анализа медицинских изображений. Для этих шагов предварительной обработки я бы порекомендовал ANT и, в частности, разновидность ANTsPy (при условии, что вы работаете с фоном Python). ANT активно поддерживается и имеет надежные инструменты для решения всех этих (и многих других) проблем. К сожалению, ANTsPy не всегда легко установить, но я считаю, что над ним ведется работа для решения некоторых проблем, и как только вы начнете работать с ним, вы сможете получить доступ к большинству инструментов, которые ANT предлагает изначально из python. В частности, он поддерживает этапы передискретизации, коррекции поля смещения и предварительной обработки регистрации, о которых я расскажу позже.

Как и в случае с естественными изображениями, изображения МРТ и КТ не имеют стандартного разрешения или стандартного размера изображения. Я бы сказал, что этот факт более важен для MR и CT и должен учитываться для оптимальной производительности ML. Рассмотрим следующее: вы обучаете трехмерную сверточную нейронную сеть с данными, полученными с разрешением 1x1x3 мм³, а затем вводите изображение в сеть с размером 1x1x1 мм³. Я ожидал, что результат будет неоптимальным, поскольку сверточные ядра не будут использовать одну и ту же пространственную информацию. Это спорно, и я не исследовал проблему подробно, но нестандартное решение - это то, что нужно иметь в виду, если вы столкнетесь с проблемами во время тестирования. Мы можем наивно решить проблему нестандартного разрешения, передискретив изображение до желаемого стандартного разрешения (конечно, с кубическими B-сплайнами для наилучшего качества).

Для многих приложений и МРТ, и КТ часто требуется процесс, называемый регистрацией, чтобы выровнять объекты по набору изображений для прямого сравнения. Зачем нам это нужно? Допустим, вы хотите изучить функцию, которая берет МРТ-изображение и выводит оценку того, как будет выглядеть КТ-изображение. Если у вас есть парные данные (то есть изображение МРТ и КТ от одного и того же пациента), то простой способ решения этой проблемы - изучить воксельную карту между интенсивностями изображения. Однако, если анатомия не выровнена в пространстве изображения, мы не сможем изучить эту карту контролируемым способом. Мы решаем эту проблему путем регистрации изображений и, собственно, исследуем эту проблему в разделе экспериментов.

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

Еще одна проблема МРТ - это несоответствие интенсивности тканей на разных МРТ сканерах. Если КТ-изображения имеют стандартную шкалу интенсивности (см. Единицы Хаунсфилда), то с МР-изображениями нам не так повезло. МРТ-изображения абсолютно не имеют стандартный масштаб, и влияние на производительность алгоритма может быть довольно большим, если не учтено в предварительной обработке. См. Изображения ниже для примера, где мы строим гистограммы набора T1-взвешенных МРТ изображений без применения какой-либо нормализации интенсивности (см. Изображение с Raw в заголовке). Это изменение связано с эффектами, вызванными сканером, а не с биологией, о которой мы обычно заботимся.

Существует множество методов нормализации интенсивности, которые пытаются удалить этот вариант сканера (некоторые из них я собрал в этом репозитории под названием intensity-normalization). Методы варьируются от очень простых (например, простая стандартизация, которую я буду называть нормализацией z-показателя) до довольно технических (например, RAVEL). Для нейровизуализации хорошее сочетание скорости и качества можно найти в методе нормализации нечетких C-средних (FCM), который создает грубую сегментацию класса тканей между белым веществом (WM), серым веществом и спинномозговой жидкостью на основе Т1-взвешенное изображение. Затем маска сегментации WM используется для вычисления среднего значения WM в изображении, которое устанавливается на некоторую определяемую пользователем константу. Этот метод нормализации, кажется, почти всегда дает желаемый результат в изображениях мозга. Если вы не работаете с изображениями головного мозга, то вы можете воспользоваться методом Нюля и Удупа или простой нормализацией z-показателя. Все эти методы нормализации доступны в виде интерфейсов командной строки (или импортируемых модулей) в репозитории intensity-normalization.

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

Поскольку изображения МРТ и КТ не являются стандартными, как JPEG, на вашем компьютере нет встроенного способа их отображения. Если вы хотите визуализировать свои данные, обратите внимание на MIPAV для изображений, не относящихся к DICOM (например, NIfTI) и Horos для изображений DICOM. Всегда полезно посмотреть на свои данные, особенно после предварительной обработки, чтобы мы могли убедиться, что все выглядит разумно. Например, возможно, регистрация не удалась (это часто происходит) или, возможно, не удалось удалить череп (опять же, это часто происходит). Если вы передадите свои дрянные данные в свой алгоритм машинного обучения, вы, вероятно, получите дрянной вывод и потратите много времени на ненужную отладку. Так что будьте добры к себе и изучите данные.

Обучение глубокой сети для приложений МРТ или КТ

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

Если вы решите, что 2D-сеть - это лучший вариант для вашего приложения (разумный выбор), вам нужно будет придумать / спроектировать загрузчик данных, чтобы справиться с этим. После возни со сложными загрузчиками данных, которые переводят трехмерное изображение в патч или фрагмент двухмерного изображения, я понял, что все это было ненужным бременем, которое затрудняло использование встроенных средств загрузки / увеличения данных, которые помогают в обучение. Поэтому я рекомендую решение этой проблемы просто преобразовать трехмерные объемы в двухмерные изображения. Поскольку исходные тома представляют собой числа с плавающей запятой, я выбрал формат изображения TIFF, который поддерживает такие типы. Вот сценарий командной строки, который берет каталог изображений NIfTI и создает каталог соответствующих изображений 2D TIFF (с некоторыми параметрами для создания срезов на основе оси и для создания срезов только из части изображения, чтобы избежать фоновые срезы).

В следующем разделе я построю глубокую нейронную сеть со сверточными трехмерными слоями. Я делаю это в отличие от использования сверточных 2D-слоев, потому что после преобразования 3D-объема в 2D-изображения, такие как TIFF, вы можете просто использовать любую 2D-архитектуру, которая у вас есть, заменяя голову для соответствующего приложения. Поскольку к трехмерной задаче подойти немного сложнее, я раскрою ее ниже.

Эксперимент

*** Если вы только что читаете это сообщение в блоге (после 05.07.20), обратите внимание, что пакет fastai значительно изменился, и приведенный ниже код может работать не так, как ожидалось. Однако приведенные ниже примеры кода и общая экспериментальная установка по-прежнему могут быть полезны в учебных целях. Как бы то ни было, я бы порекомендовал использовать PyTorch вместо fastai для будущих проектов глубокого обучения. Если вам нужна поддержка NIfTI в PyTorch, у меня есть активно поддерживаемый пакет, в котором есть примеры рабочего кода и импортируемые функции здесь. ***

В этом разделе я опишу шаги, необходимые для обучения трехмерной сверточной нейронной сети для задачи синтеза MR-to-MR с использованием pytorch и fastai. Если вы просто хотите взглянуть на код, то здесь есть блокнот, который содержит большую часть эксперимента (за исключением предварительной обработки).

Настройка выглядит следующим образом: мы обучим очень маленькую resnet взять весь трехмерный объем из одного МР-контраста в другой МР-контраст; мы будем изучать преобразование для сопоставления изображений, взвешенных по T1, с изображениями FLAIR. Эта задача называется синтезом МР-изображений, и мы будем называть сеть сетью синтеза. Существует множество применений для этого типа синтеза, но мотивация для этой проблемы в основном заключается в следующем: время МРТ-сканирования ограничено, поэтому не все контрасты могут быть собраны. Но мы хотим съесть свой торт и съесть его, и иногда нам нужны эти несобранные контрасты для обработки изображений. Таким образом, мы создаем некоторые поддельные данные, используя данные, которые были фактически собраны, причем поддельные данные будут результатом нашей сети синтеза.

В этом эксперименте я буду использовать 11 и 7 изображений для обучения и проверки, соответственно, из набора данных Kirby 21. Все изображения были преобразованы в формат 1x1x1 мм³, поле смещения скорректировано с помощью N4, а изображения FLAIR были (аффинны) зарегистрированы в изображениях, взвешенных по T1, с помощью ANTsPy. Посмотрите здесь и здесь, чтобы увидеть фактический код, который я использовал для предварительной обработки (оба доступны как интерфейсы командной строки, когда пакет интенсивность-нормализация установлен вместе с ANTsPy). Наконец, все изображения были индивидуально нормализованы по z-баллу с использованием всего изображения.

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

Здесь нет ничего особенного, за исключением того, что, как только вы разберетесь, как настроить эти типы структур, они станут довольно удобными (см. Учебное пособие по ItemList для более подробной информации). Обратите внимание, что не все функции поддерживаются текущей настройкой - я урезал ее, чтобы сделать ее максимально простой - но она выполнит свою работу. Ниже я покажу, как это создает загрузчики данных для обучения и проверки. Во-первых, давайте определим преобразование предварительной обработки:

Почему я определяю эту странную функцию обрезки? Причина двоякая. Первая причина заключается в том, что шея отсутствует на изображениях FLAIR, но присутствует на изображениях, взвешенных по T1. Я не хочу, чтобы сеть научилась сводить ткань к нулю, поэтому я удаляю эту часть данных, используя только данные в диапазоне 20–80 процентов вдоль оси, соответствующей осевой плоскости. Вторая причина заключается в том, что я могу вместить в партию вдвое больше образцов (это означает, что размер партии равен 2). Причина небольшого размера пакета в том, что, как я уже упоминал ранее, 3D-сети с большими изображениями требуют большого объема памяти. Почему нет другого увеличения данных? К сожалению, 3D-преобразования изначально не поддерживаются pytorch или fastai, поэтому мне пришлось бы включить свои собственные, и я не делаю этого для простоты. Теперь давайте воспользуемся API-интерфейсом data_block от fastai для создания загрузчиков данных для обучения и проверки:

Вы можете увидеть записную книжку для более подробной информации, но, по сути, у меня есть изображения, взвешенные по T1, в одном каталоге с train, valid, test подкаталогами и в параллельном каталоге с изображениями FLAIR. Функция get_y_fn захватывает изображение FLAIR, соответствующее исходному T1-взвешенному изображению. Посмотрите здесь для более подробного объяснения остальных команд. Обратите внимание, что (tfms,tfms) означает, что я применяю ранее определенный урожай как для обучающего, так и для проверочного набора. Применение этого преобразования к набору проверки не идеально, но необходимо из-за ограничений памяти. Теперь давайте создадим несколько трехмерных сверточных и остаточных блочных слоев, которые мы будем использовать для определения нашей модели:

Я внимательно слежу за определением 2D сверточных и остаточных блочных слоев, как это определено в репозитории fastai. В качестве примечания, я оставил процедуры спектральной нормализации и нормализации веса в определении conv3d, но, к сожалению, получил худшие результаты с этими методами, чем при использовании пакетной нормы (и я до сих пор не уверен, применяется ли пакетная норма до или после активации. ). Теперь давайте определим нашу модель, используя указанные выше слои:

Здесь я только что определил очень маленькую модель resnet. Почему так мало слоев? Я использую сеть настолько большой, насколько мой графический процессор может содержать в памяти. Создание множества каналов со всем трехмерным объемом и остаточными связями ложится тяжелым бременем на память графического процессора. Единственная возможная интрига заключается в том, что я использую в конце ядро ​​1x1x1, которое эмпирически создает более четкие изображения (и я думаю, что это довольно стандартно). В качестве примечания, я понимаю, что мне следовало удалить активацию с последнего слоя; однако это не проблема, потому что я нормализую z-оценку (т.е. среднее вычитание и деление на стандартное отклонение) изображений с их фоном. Фон, размер которого приблизительно равен нулю, занимает большую часть объема изображения. Таким образом, нормализация z-показателя по существу ставит фон (соответствующий среднему) на ноль, что делает интенсивность головы больше нуля. Прекрасный результат для ReLU. Теперь давайте обучим эту сеть:

Снова довольно нормально. Среднеквадратичная ошибка используется, потому что мы хотим, чтобы каждая интенсивность вокселей в нашем исходном T1-взвешенном изображении соответствовала интенсивности вокселей соответствующего целевого изображения FLAIR. Мы используем lr_find, чтобы помочь нам выбрать более высокую скорость обучения (как описано здесь) для более быстрого обучения, в дополнение к использованию политики одного цикла. Я всегда собираю данные для обучения и проверки в файл CSV, чтобы посмотреть, как конвергенция сети, особенно на машинах, на которых запуск ноутбука jupyter затруднен. Я выбрал 100 эпох, потому что я запускал это пару раз и не заметил большого прироста производительности с увеличением количества эпох.

После завершения обучения мы вводим в сеть все изображение (не видимое ни при обучении, ни при проверке). Пример показан на рисунке ниже, где результатом синтеза является крайнее правое изображение (с заголовком «Syn»).

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

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

Заключение

Надеюсь, этот пост предоставил вам отправную точку для применения глубокого обучения к изображениям МРТ и КТ с помощью fastai. Как и в случае с большинством задач машинного обучения, для начала работы требуется значительный объем специфичных для предметной области знаний, обработки данных и предварительной обработки, но как только у вас это будет под рукой, довольно легко приступить к работе с обучение сети с pytorch и fastai. Куда пойти отсюда? Я скачал набор данных по одной из ссылок, которые я разместил в разделе «Наборы данных», и попытался бы сделать что-то похожее на то, что я показал выше, или даже попытался бы воссоздать то, что сделал я. Если вы дойдете до этой стадии, вам будет удобно применять глубокое обучение к другим задачам МРТ и КТ.

Я должен отметить, что ведется работа по созданию стандартных кодовых баз, на основе которых вы можете применять глубокое обучение к изображениям МРТ и КТ. Два, о которых я знаю, это NiftyNet и медицинский фонарик. NiftyNet абстрагирует большую часть проектирования нейронной сети и обработки данных, так что пользователю нужно только вызвать некоторые интерфейсы командной строки, с помощью которых можно загрузить предварительно обученную сеть, настроить ее и сделать что угодно. Так что, если этого достаточно для ваших нужд, продолжайте; это кажется отличным инструментом, и в нем есть несколько предварительно обученных сетей. medicaltorch предоставляет некоторые загрузчики данных и общие модели глубокого обучения с медицинскими изображениями в pytorch. Я также не тестировал всесторонне, поэтому не могу комментировать их полезность.

Если вам не нравится питон, то есть нейропроводник в R или пакеты NIfTI.jl и Flux.jl в Julia, которые могут читать изображения NIfTI и строить нейронные сети соответственно. Существует бесчисленное множество других программных пакетов, но это те, которые приходят мне в голову в первую очередь, и с которыми я работал.

В заключение, если вам повезло создать красивое приложение для МРТ или КТ, не забудьте поделиться своей работой! Напишите статью / сообщение в блоге, разместите на форуме, поделитесь весами сети. Было бы здорово, если бы больше людей применяли методы глубокого обучения в этой области и расширяли границы области, где это возможно. Удачи.