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

Неудивительно, что эта задача быстро привлекла внимание специалистов по компьютерному зрению. В результате за последние годы мы стали свидетелями запуска двух открытых конкурсов по выявлению рака: Luna-Competition и Kaggle-Data Science Bowl 2017.

Оказывается, data-science Сообществу есть что предложить радиологам. Несмотря на это, отсутствовала гибкая и настраиваемая структура для исследований рака легких. Новая библиотека с открытым исходным кодом RadIO пытается восполнить этот пробел. Включая набор операций предварительной обработки и дополнения, а также зоопарк проверенных моделей нейронных сетей, он позволяет создавать алгоритмы глубокого обучения для обнаружения рака за короткий промежуток времени. чистый, легко читаемый, воспроизводимый и быстрый код Python, вот так:

К концу этой статьи вы получите рабочее представление о приведенном выше коде и сможете самостоятельно построить систему обнаружения рака.

Как все это работает?

Набор данных: индексирование сканирований на диске

Прежде всего, вы должны настроить Dataset - структуру, которая индексирует набор данных CT-сканов на диске:

С Dataset вам не нужно писать шаблонный код для разделения набора данных на обучающие / тестовые части:

в то время как пакетная генерация занимает одну строку кода:

Конвейеры и действия

В RadIO настройка конвейера предшествует любым вычислениям. Конвейер - это всего лишь план того, что будет происходить с данными. Проще говоря, конвейер - это последовательность действий. Каждое действие в RadIO реализует конкретную
операцию с данными
. Например, загрузка сканов с диска в память осуществляется действием load. Другой пример - действие unify_spacing, которое служит двум целям:

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

Эффект от unify_spacing будет намного яснее, если вы сравните два предыдущих сканирования.

и после действия:

RadIO реализует множество операций предварительной обработки, включая загрузку данных с диска, изменение размера сканированных изображений в другую форму, дамп предварительно обработанные данные на диск (см. полный список). Важно отметить, что действия RadIO выполняются довольно быстро. Для более глубокого понимания того, как код Python может быть быстрым, ознакомьтесь с статьей о предварительной обработке в RadIO (спойлер: ключевые слова numba, parallelization , асинхронность).

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

Шести упомянутых ранее действий достаточно, чтобы построить полноценный конвейер предварительной обработки:

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

Дополнение и обучение нейронной сети: еще один конвейер

Увеличение объема данных - еще один важный шаг в разработке решения для компьютерного зрения. Простой конвейер расширения включает вырезание интересных (и небольших) частей сканов с помощью sample_nodules, вращение сканов на случайный угол и случайное масштабирование с unify_spacing:

Наконец, мы настраиваем конвейер, который выполняет инициализацию и обучение модели типа V-Net из RadIO model zoo. Для начала нужно настроить модель: определить форму ее входов и функцию потерь:

Теперь вы можете прикрепить модель к конвейеру и запланировать тренировочное действие:

Собираем все вместе

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

и применим рабочий процесс к набору данных luna (что важно, реальные вычисления начинаются только сейчас):

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

Весь тренировочный процесс может занять до нескольких дней. Однако даже после нескольких эпох (нескольких часов тренировок) вы можете наслаждаться уменьшением потерь:

и приятная динамика прогнозов:

Заключительные замечания

Как видите, создание системы обнаружения рака с помощью RadIO сводится к настройке конвейера - плана последующих вычислений. В свою очередь, этот план можно разделить на три отдельных рабочих процесса: предварительная обработка, дополнение и обучение модели.

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

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