Как обнаружить коронавирус с помощью глубокого обучения

Автоматическое определение Covid-19 на рентгеновских изображениях с использованием Python и методов глубокого обучения

Фото Fusion Medical Animation на Unsplash

В настоящее время мы все знаем о существовании Covid-19, более известного как коронавирус.

Это инфекционное заболевание, вызванное тяжелым острым респираторным синдромом коронавирус 2 (SARS-CoV-2). Впервые эта болезнь была выявлена ​​в 2019 году в Ухане, Китай, и с тех пор распространилась по всему миру, что привело к пандемии коронавируса в 2019-20 годах. Общие симптомы включают жар, кашель и одышку (Википедия).

Но сегодня мы не будем говорить о самой болезни. Скорее, мы увидим, как создать модель глубокого обучения в Python с использованием TensorFlow, Keras и OpenCV, которая классифицирует Covid-19-позитивные или Covid-19-негативные рентгенологические изображения грудной клетки.

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

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

Настройте среду разработки

Фото DL на Unsplash

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

В Python для создания виртуальной среды мы используем пакет virtualenv.

Установите привязку Python для virtualenv:

pip install virtualenv

Затем мы создаем среду с помощью следующей команды:

виртуальный проект

Это создаст папку проекта. Затем мы активируем виртуальную среду:

В UNIX (Mac и Linux): исходный проект / bin / activ

В Windows: проект \ env \ Scripts \ activ.Bat

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

  • TensorFlow (это может занять несколько минут): pip install tenorflow
  • scikit-learn: pip install sklearn
  • Imutils: установить pip imutils
  • Matplotlib: pip установить matplotlib
  • OpenCV: pip установить opencv-python

После установки всех этих пакетов вы готовы перейти к следующему шагу.

Что мы собираемся делать в учебнике

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

Вот как устроена статья:

  • Скачать набор данных
  • Создайте сверточную нейронную сеть для автоматического обнаружения Covid-19 на рентгеновских снимках
  • Ограничения модели
  • Вывод

Набор данных

Набор данных рентгеновских изображений Covid-19, который мы будем использовать в этом уроке, был подготовлен доктором Джозефом Коэном, докторантом в университете Монреаля.

Вы можете скачать набор данных из Dropbox.

Как только вы загрузили zip-файл, распакуйте его. Вы должны увидеть в папке загрузок папку / dataset. Переместите его в каталог, который вы будете использовать во время этого проекта.

Например, вот как настроен мой каталог:

Папка моего проекта

Структура набора данных

Как вы можете видеть на предыдущем изображении, наш набор данных разделен на две папки: / covid и / normal. Каталог / covid содержит 25 рентгеновских изображений Covid-позитивных сундуков, в то время как папка / normal содержит 25 рентгеновских изображений Covid-негативных сундуков.

Модель CNN

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

Импорт и аргументы

Создайте файл train_covid19.py и вставьте следующий код:

Скрипт, который мы создадим, использует библиотеки TensorFlow, Keras, scikit-learn и OpenCV.

Мы будем использовать:

  • TensorFlow и Keras для работы со всем, что касается нашей CNN (сверточная нейронная сеть)
  • scikit-научиться работать с предварительной обработкой данных и оценкой модели
  • OpenCV для загрузки и обработки изображений
  • Matplotlib, чтобы построить результаты модели

После импорта необходимых модулей мы анализируем аргументы командной строки и инициализируем гиперпараметры (параметры, которые будут использоваться для построения CNN):

Строки 2–9 определяют наши аргументы командной строки:

  • –Dataset - путь к набору данных.
  • –Plot - необязательный путь к выходному графику истории обучения. По умолчанию это plot.png.
  • –Model - необязательный путь к нашей выходной модели Covid-19; по умолчанию он будет называться covid19.model.

Строки 13–15 определяют начальную скорость обучения, количество тренировочных эпох и размер партии.

Загрузка и обработка данных

Теперь мы готовы загрузить и предварительно обработать наши рентгеновские данные:

Чтобы загрузить наши данные, мы берем все пути к изображениям в каталоге набора данных (строка 3). Затем для каждого imagePath мы:

  • Извлеките метку класса (Covid или Normal) из пути (строка 11).
  • Загрузите изображение, предварительно обработайте его путем преобразования в порядок каналов RGB и измените его размер до 224 × 224 пикселей, чтобы оно было готово для нашей сверточной нейронной сети (строки 15–17).
  • Обновите наши данные и списки этикеток соответственно (строки 20 и 21).

Строки 25–27: преобразование данных и меток в массивы NumPy.

Теперь мы можем закодировать наши метки с помощью быстрого кодирования (строки 2–4) и разделить набор данных на поезд и проверить:

Горячее кодирование означает, что наши данные будут отображаться в следующем формате:

[[0. 1.] [0. 1.] [0. 1.]… [1. 0.] [1. 0.] [1. 0.]]

Каждая закодированная метка состоит из двухэлементного массива, один из элементов которого «горячий» (1) или «нет» (0). Мы используем его по мере необходимости для классификации положительных или отрицательных случаев; то есть мы выполняем двоичную классификацию.

В строке 9 размер теста 0,20 означает, что мы разбили набор данных, оставив 20% его для тестирования и оставшиеся 80% для обучения.

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

Построить модель

После обработки всех данных мы можем инициализировать нашу модель. Мы будем использовать модель VGG16.

Строки 2–3 создают сеть VGG16 с весами, предварительно обученными в ImageNet.

В строках 6–11 мы строим верхние слои, а в строке 14 добавляем их в модель.

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

Обучите CNN

Теперь мы готовы скомпилировать и обучить нашу модель глубокого обучения Covid-19 (коронавирус):

Строки 3–4: Здесь мы компилируем CNN с оптимизатором Адама. Учитывая, что это проблема двух классов, мы используем потерю binary_crossentropy, а не категориальную кроссцентропию.

Строки 9–14: мы вызываем метод Keras 'fit_generator, одновременно передавая наши рентгеновские данные грудной клетки через наш объект дополнения данных.

Оценить модель

После обучения модели мы оцениваем ее:

Строки 3–6: мы делаем прогнозы на тестовом наборе и получаем индексы прогноза.

Строки 9–10: здесь мы генерируем и распечатываем классификационный отчет, используя вспомогательную утилиту scikit-learn.

Далее мы вычисляем матрицу путаницы для дальнейшей статистической оценки:

Строка 2: Генерация матрицы путаницы.

Строки 4–6: используйте матрицу путаницы для определения точности, чувствительности и специфичности и распечатайте их (Строки 9–12).

Исторический учебный сюжет и модель сериализации

Мы по крайней мере закончили наш коронавирусный (Covid-19) детектор CNN. Но мы также хотим посмотреть историю тренировок детектора и, в конце концов, сохранить модель в файл.

Строки 2–12: нанесите на график точность обучения модели / потери.

Строка 13: сохранить график в изображении plot.png, которое мы определили в наших аргументах.

Строки 16–17. Сохранение модели в файле .model.

Выполнено!

Вот полный код train_covid19.py:

Фото Кристиана Болта на Unsplash

Тестовое задание

Теперь мы проверяем нашу CNN. Но перед этим мы сделаем небольшое резюме того, что мы сделали:

  1. Создал виртуальную среду и установил TensorFlow, scikit-learn, Imutils, Matplotlib и OpenCV
  2. Скачал набор данных и рассказал о его структуре
  3. Создал train_covid19.py
  4. Импортированы необходимые модули
  5. Загружен и предварительно обработан набор данных
  6. Построить модель и ее слои
  7. Обучил его и сохранил его точность
  8. График точности / потери модели на графике в изображении plot.png
  9. Сохранение модели в файле covid19.model

Теперь давайте посмотрим на папку нашего проекта:

Как видите, файл train_covid19.py, который мы создали ранее, находится в том же каталоге, что и папка / dataset. Это ключевой момент, так как скрипт ищет папку набора данных в папке / covid-19_x_rays_detect.

Как только ваш каталог настроен, как было показано ранее, мы можем выполнить файл train_covid19.py:

python3 train_covid19.py –dataset набор данных

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

Здесь train_covid19.py:

  1. Прочитать и предварительно обработать набор данных
  2. Скачал вес модели VGG16
  3. Обучал модель за 25 эпох
  4. Оценили производительность CNN
  5. Распечатал это

Теперь, просматривая ваш каталог, вы должны увидеть новый файл plot.png:

Читая историю обучения модели, мы можем получить следующее:

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

Ограничения модели

Фото Людовика Шарле на Unsplash

Мы создали красивую и отлично подогнанную сверточную нейронную сеть, которая обнаруживает Covid-19. С другой стороны, наш CNN не очень точен; точность 80%, но почему?

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

Вывод

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