Классификация изображений с помощью сверточной нейронной сети ResNet50 (CNN) на рентгенографии Covid-19

Использование CNN с FastAI для начинающих

В последний год обучения в университете они предложили на выбор три предмета: обработка изображений, AR / VR и цифровая криминалистика. Я так старался отличаться от других и выбрал цифровую криминалистику, мое худшее решение. Это было так сложно и без какого-либо интереса к полю, я даже не понял (выжил в CS 101). В любом случае, урок для меня (и, вероятно, для вас): просто будьте реалистами.

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

В этой статье я использовал набор данных Kaggle с рентгеновскими снимками, которые классифицируют COVID-19, вирусную пневмонию и нормальную грудную клетку. Есть 219 положительных изображений COVID-19, 1341 нормальных изображений и 1345 изображений вирусной пневмонии.

Как всегда, зайдите в мой Github за кодом❤️

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

Классификация изображений

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

В этой статье используется классификация контролируемых изображений с тремя классами.

CNN

Как я упоминал ранее, я использую слои Resnet50, которые являются одной из архитектур CNN. Чтобы узнать больше о CNN, эта статья так ясно объяснила CNN. Подводя итог, поток CNN:

  1. Слой свертки (функция извлечения с фильтрацией)
  2. Шаги (смещение пикселей по входной матрице)
  3. Обивка
  4. Выпрямленный линейный блок (RelU) (привносит нелинейность в сеть)
  5. Слой заполнения (уменьшить количество параметров)
  6. Полностью связанный слой (сведите матрицу в вектор и передайте ее на полностью связанный слой нейронной сети.)

Существует несколько архитектур CNN (некоторые из наиболее распространенных - ResNet, VGGNet), но в этом посте я буду использовать ResNet50.

ResNet или Residual Network использует остаточное обучение вместо того, чтобы пытаться изучить некоторые функции. Остаточное значение можно просто понять как вычитание объекта, полученного при вводе этого слоя. Есть несколько вариантов ResNet, кроме ResNet50. Основная идея ResNet - введение ярлыка соединения, которое пропускает один или несколько уровней.

ResNet50 имеет 50 уровней, ниже представлена ​​архитектура ResNet50 с 34 остаточными уровнями. Вот документ сети, и вот почему ResNet - хорошая архитектура CNN для использования.

Данные

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

Если вы хотите получить доступ к данным из Kaggle, вы можете просто загрузить JSON API своей учетной записи Kaggle, загрузить в файлы Colab, а затем загрузить и разархивировать данные изображения в среду Colab.

! pip install -q kaggle
! mkdir ~/.kaggle
! cp kaggle.json ~/.kaggle/
! chmod 600 ~/.kaggle/kaggle.json
! kaggle datasets download -d tawsifurrahman/covid19-radiography-database
! unzip "covid19-radiography-database.zip"

Вы также можете получить доступ к данным со своего Google Диска, установив сеанс Colab, и получить доступ к своему местоположению данных изображения с Диска.

from google.colab import drive
drive.mount('/content/drive')

Если вы хотите получить доступ к данным с веб-сайта с открытым исходным кодом, вы можете просто использовать библиотеку запросов из Python. Чтобы взять пример, вот как загрузить 20 ГБ данных из Physio Net.

import requests, zipfile, io
zip_file_url = "https://physionet.org/static/published-projects/siena-scalp-eeg/siena-scalp-eeg-database-1.0.0.zip"
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()

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

Библиотека

Некоторые библиотеки, которые я использовал

from fastai.vision import *
from fastai.metrics import error_rate
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
from torch.autograd import Variable
import numpy as np
import time
import os
from fastai.callbacks import ActivationStats
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')

Доступ к изображению из папки

Определите путь к папке

path = Path('/content/COVID-19 Radiography Database/')
folder = path
folder.mkdir(parents=True, exist_ok=True)

Извлеките пачку данных изображения

np.random.seed(42)
data = ImageDataBunch.from_folder(path, train='.', valid_pct=0.35, ds_tfms=get_transforms(), size=224, num_workers=4).normalize(imagenet_stats)

Тренировка с CNN Resnet50

С fastai мы можем мгновенно использовать модель Resnet с помощью функции cnn_learner. Не забудьте определить показатели точности, чтобы мы могли видеть потери и точность.

Чтобы сократить время, я использую четыре эпохи.

learn = cnn_learner(data, models.resnet50, metrics=accuracy)
learn.fit_one_cycle(4)

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

learn.unfreeze()
learn.lr_find()
learn.recorder.plot(suggestion=True)

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

Результат

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

interp = ClassificationInterpretation.from_learner(learn)
losses, idxs = interp.top_losses()

Во-первых, мы можем построить график потери прогноза на основе модели.

interp.plot_top_losses(9, figsize=(15,11))

А затем Матрица путаницы.

interp.plot_confusion_matrix(figsize=(12,12), dpi=100)

Заключение

Сейчас очень удобно применять многие методы искусственного интеллекта, особенно с FastAI Image Processing. Я считаю, что самое важное в изучении машинного обучения - это быть творческим, новаторским и никогда не прекращать изучать новое!

Спасибо за чтение!

Больше источников для изучения