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

Введение

Коронавирус (COVID-19) — это инфекционное заболевание, вызываемое родственными РНК-содержащими вирусами, которые поражают млекопитающих и птиц. После того, как в декабре 2019 года в Ухане (Китай) был зарегистрирован первый случай заболевания, коронавирус превратился в глобальную пандемию, унесшую жизни около 3,8 миллиона человек (по состоянию на 18 июня) по всему миру. Один из методов диагностики того, страдает ли пациент Covid-19, заключается в изучении его рентгенографии грудной клетки, чтобы найти доказательства вероятной инфекции, а затем назначить необходимое лечение, чтобы вылечить его от болезни.

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

Постановка задачи

Разработать классификатор рентгенографии грудной клетки, который надлежащим образом анализирует рентгеновский снимок и определяет, положительный или отрицательный результат на Covid-19 у пациента.

Рабочий процесс

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

Читатели, заинтересованные в реализации проекта классификатора рентгенографии грудной клетки, могут загрузить набор данных по следующей ссылке.

Предварительная обработка данных и увеличение данных

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

К счастью, у меня был способ преодолеть оба вышеупомянутых недостатка в моем наборе данных с помощью одной процедуры. Я использовал библиотеку ImageDataGenerator от Keras для выполнения увеличения данных. В то же время я импортировал preprocess_input из пакета ResNet50 в Keras. Preprocess_input помогает преобразовать изображения в формат, который модель ResNet50 принимает в качестве входных данных. Затем я передал этот пакет в качестве входных данных для параметра «preprocess_function», который присутствует в пакете ImageDataGenerator.

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

Окончательный подсчет, которого я добился, составил 7800 изображений для обучающего набора, 1008 изображений для проверочного набора и 800 изображений для тестового набора. Всего в моем наборе данных 9608 изображений.

Обучение модели и оценка модели

Шаг 1. Обучение модели глубокого обучения.

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

Для этого я сначала загрузил модель глубокого обучения ResNet50 из Keras, после чего добавил Flatten layer и Dense Layer. Кроме того, я убедился, что верхние слои модели ResNet50 не извлекаются при загрузке всей модели, и решил установить для параметра layer.trainable значение false.

Затем я использовал еще два пакета, предоставленных Keras: EarlyStopping и ModelCheckpoint. Ранняя остановка использовалась, чтобы гарантировать, что я не переобучаю модель, и обучение останавливается, когда точность проверки не повышается. Принимая во внимание, что ModelCheckPoint использовался для немедленного сохранения модели при повышении точности проверки в конце эпохи.

Наконец, при компиляции модели перед началом процесса обучения я установил скорость обучения для оптимизатора Adam на 1e-1. Причина в том, что скорость обучения 1e-1 дала мне оптимальный результат с точки зрения точности, четкости и отзыва. Я решил обучить модель на 30 эпох, но процесс обучения остановился после 13-й эпохи, так как точность валидации не увеличилась. Это гарантировало, что я не переустраиваю свою модель глубокого обучения.

Шаг 2. Оцените производительность модели с помощью тестовых данных.

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

Во-первых, я решил рассчитать точность обученной модели. Метод оценить помог мне оценить точность модели, которая составила 91,25 %.

Затем я решил рассчитать точность, а также отзыв для моей обученной модели. В соответствии с вариантом использования я решил уделить больше внимания отзыву, поскольку моя модель не должна классифицировать рентген пациента, страдающего от ковида, как нормальный. Это означало бы, что у пациента будет неверная информация, которая может стоить ему/ей жизни. Я решил использовать classification_report из пакета sklearn и рассчитал точность, а также баллы отзыва для обученной модели.

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

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

Наконец, я построил кривую ROC и рассчитал показатель AUC, чтобы убедиться, что точность модели не является ложным показателем производительности модели. Я хотел убедиться, что модель глубокого обучения, обученная на обучающих данных, не является какой-то глупой моделью, которая предсказывает, что у каждого пациента положительный результат на ковид. Во-первых, я рассчитал показатель AUC, который оказался равным 0,903, а затем построил кривую ROC, которая подтвердила тот факт, что наша модель глубокого обучения действительно была хорошей моделью, которая классифицирует на основе точек обучения, которые она захватила на этапе обучения.

Вывод

Уже работая над двумя проектами НЛП, я подумал о том, чтобы принять новый вызов и поработать над проектом, который включает данные, состоящие из изображений. Классификатор грудной клетки для обнаружения Covid-19 дал мне эту возможность и помог мне работать с предварительно обученной моделью (ResNet50), а также узнать о ее основном функционировании. Кроме того, это помогло мне опробовать различные методы, которые используются для определения производительности моделей, и заставило меня осознать важность каждого теста производительности модели.

Следующим шагом в этом проекте является развертывание модели глубокого обучения в качестве серверной части веб-приложения, которое классифицирует X-Ray, относящийся к классу Covid или Normal. Подробное пошаговое руководство по всем шагам, необходимым для развертывания модели глубокого обучения в службе Google Cloud Platform App Engine, можно найти во второй части этого блога. Обязательно проверьте и это.

Рабочий процесс, которому я следовал в этом проекте, можно найти на моей странице Github. Надеюсь, вам понравилось читать мой блог.