Недавно я наткнулся на интересный набор данных, когда искал идеи для своего проекта по компьютерным наукам в конце семестра. Он содержит 20 подробных снимков легких в полном разрешении пациентов, у которых был диагностирован SARS-COV-2, а также сегментацию легких и инфекции, сделанную медицинскими экспертами.

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

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

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

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

Мы начинаем с импорта необходимых библиотек и загрузки всего набора данных в выбранную нами среду. (Я использую платформу Google Colab из-за дополнительных преимуществ оперативной памяти и графического процессора)

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

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

После просмотра данных первым важным шагом, который нам нужен в каждой проблеме ML/DL, является их анализ и адекватная предварительная обработка, которая поможет нам уменьшить распространенные проблемы, такие как предвзятость, сложность кода, время обучения и тому подобное. Основные шаги, которые я выполнил на этапе предварительной обработки:

1. Удаление неполных и ошибочных изображений

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

2. Отдельная модель для предсказания пустой маски

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

3. Использование алгоритмов улучшения для повышения общей производительности

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

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

4. Обрезка интересующей области (ROI) с помощью бинаризации Оцу и других методов

На изображениях много черного пространства, не содержащего части инфекции, и части, которые нас не интересуют, например, диафрагма под легкими. Они будут занимать ценное пространство ОЗУ и ненужную вычислительную мощность. Возможное решение — обрезать срезы так, чтобы они содержали только ROI в соответствии с постановкой задачи и вариантом использования. После кадрирования мы используем метод пороговой обработки Otsu, чтобы избежать необходимости выбирать дискретные значения, которые динамически назначаются алгоритмом для возврата инфекции и/или масок легких.

5. Расширение данных

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

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

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

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

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

После подгонки теперь мы можем посмотреть на предсказанные маски заражения нашей модели при сканировании тестовых данных.

Дополнительную информацию можно получить при постобработке, проанализировав оценки DICE и IOU с использованием метрик, которые мы определили ранее.

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

Как вы можете видеть, наша модель работает на удивление хорошо при относительно небольшом количестве сканирований благодаря нашему вниманию к качеству сканов во время предварительной обработки и дополнению наших существующих данных, чтобы позволить модели быть обученной для большего разнообразия изображений из меньший набор данных. В этот подход к сегментации КТ можно внести дальнейшие улучшения, используя новые методы улучшения изображений и создавая еще больший расширенный набор данных изображений за счет увеличения количества копий, создаваемых для каждого среза, и/или добавления дополнительных функций преобразования в конвейер расширения. Кроме того, необходима работа по созданию модели UNet++ для классификации КТ, показывающей, есть ли у пациента COVID-19 или какой-либо другой легочный дефект, с использованием масок заражения, предсказанных нашим кодом, определенным здесь (задачи 2 и 3 всего нашего проекта). Наконец, все должно быть связано с веб-фреймворком Python, таким как Streamlit или Flask, для создания пользовательского интерфейса, легко используемого всеми в качестве служебного приложения. Вы также можете попробовать подход к переносному обучению, используя несколько моделей для задачи классификации этой проблемы, что позволит вам улучшить каждую последующую модель, перенаправляя ошибки, допущенные последним поколением.

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

Набор данных, использованный в этой статье, можно найти по адресу: