# Tensorflow # Keras # DeepLearning

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

PS: Основная цель этой статьи - дать заинтересованным лицам практический опыт глубокого обучения и не является научно подтвержденным исследованием.

Необходимое условие

  1. Сбор рентгеновских снимков грудной клетки здоровых пациентов и рентгеновских снимков грудной клетки пациентов с коронавирусом
  2. Скачайте набор данных по этой ссылке.
  3. Установите Tensorflow, Keras, Sklearn, Matplotlib, numpy

Давайте начнем

Откройте в редакторе training_detector.py и начинайте кодировать !!!

Шаг 1. Импорт необходимых пакетов

from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import VGG16
from tensorflow.keras.layers import AveragePooling2D
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Input
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import to_categorical
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import argparse
import cv2
import os

Шаг 2: анализ аргументов и инициализация скорости обучения, размера эпохи, размера пакета.

ap = argparse.ArgumentParser()
ap.add_argument("-d","--dataset",required=True,help= "Path to input dataset") 
ap.add_argument("-p","--plot",type=str,default="plot.png",help= "Path to output loss/ accuracy plot") 
ap.add_argument("-m","--model",type=str,default="covid19.model",help= "Path to output loss/ accuracy plot") 
args = vars(ap.parse_args())
INIT_LR = 1e-3
EPOCHS = 25
BS = 8

Шаг 3: загрузка набора данных

print("Loading Images...")
imagePaths = list(paths.list_images(args["dataset"]))
data = []
labels = []

Шаг 4. Выполните цикл в наборе данных, чтобы извлечь изображения и пометить их.

for imagePath in imagePaths:
 label = imagePath.split(os.path.sep)[-2]
 image = cv2.imread(imagePath)
 image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
 image = cv2.resize(image, (224, 224))
 data.append(image)
 labels.append(label)
data = np.array(data)/255.0
labels = np.array(labels)

Шаг 5. Так как на выходе получается «Covid» или «Normal», мы используем labelbinarizer для присвоения уникального номера значения.

lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels)

Шаг 6. Чтобы разделить набор данных для обучения и тестирования, мы используем функцию train_test_split в sklearn.

(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.20, stratify = labels, random_state = 42)

Шаг 7. ImageDataGenerator преобразует каждое изображение в пакете с помощью серии случайных перемещений, вращений и т. д.

trainAug = ImageDataGenerator(rotation_range = 15, fill_mode = "nearest")

Шаг 8: мы используем архитектуру CNN VGG16 (Visual Geometry Group).

baseModel = VGG16(weights = "imagenet", include_top = False, input_tensor = Input(shape=(224, 224, 3)))
headModel = baseModel.output
headModel = AveragePooling2D(pool_size=(4,4))(headModel)
headModel = Flatten(name = "flatten")(headModel)
headModel = Dense(64, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(2, activation = "softmax")(headModel)
model = Model(inputs=baseModel.input, outputs = headModel)
for layer in baseModel.layers:
 layer.trainable = False

Шаг 9: составление модели

print("Compiling model...")
opt = Adam(lr = INIT_LR,decay = INIT_LR/EPOCHS)
model.compile(loss = "binary_crossentropy", optimizer=opt, metrics = ["accuracy"])

Шаг 10: обучение модели

print("Training Head")
H = model.fit_generator(trainAug.flow(trainX, trainY, batch_size = BS), 
 steps_per_epoch = len(trainX)//BS,
 validation_data = (testX, testY),
 validation_steps = len(testX)//BS,
 epochs = EPOCHS)

Шаг 11. Оценка модели с разными параметрами.

print("Evaluating Network...")
predIdxs = model.predict(testX, batch_size = BS)
predIdxs = np.argmax(predIdxs, axis=1)
print(classification_report(testY.argmax(axis=1), predIdxs, target_names = lb.classes_))
cm = confusion_matrix(testY.argmax(axis=1), predIdxs)
total = sum(sum(cm))
acc = (cm[0, 0] + cm[1, 1])/total
sensitivity = cm[0,0] / (cm[0,0]+cm[0,1])
specificity = cm[1,1] / (cm[1,0]+cm[1,1])
print(cm)
print("acc: {:.4f}".format(acc))
print("sensitivity: {:.4f}".format(sensitivity))
print("specificity: {:.4f}".format(specificity))

Шаг 12. Построение параметров тренировки.

N = EPOCHS
plt.style.use("ggplot")
plt.figure()
plt.plot(np.arange(0, N), H.history["loss"], label = "train_loss")
plt.plot(np.arange(0, N), H.history["val_loss"], label = "val_loss")
plt.title("Training Loss and Accuracy on Covid-19 Dataset")
plt.xlabel("Epoch #")
plt.ylabel("Loss/ Accuracy")
plt.savefig(args["plot"])

Шаг 13. Сохранение модели.

print("Saving COVID-19 detector model...")
model.save(args["model"])

Запустите следующий код в командной строке, чтобы сгенерировать файл модели (не забудьте перейти в рабочий каталог)

python training_detector.py --dataset dataset

Мы можем видеть прогресс обучения с точностью и другими параметрами.

Большой!! Вы можете увидеть сгенерированный файл covid19.model в каталоге, как показано ниже.

Приступим к тестированию модели

Откройте testing_detector.py в редакторе и продолжайте кодирование.

Шаг 1: импорт необходимых пакетов

from keras.preprocessing.image import img_to_array
from keras.models import load_model
from imutils import build_montages
from imutils import paths
import numpy as np
import argparse
import random
import cv2

Шаг 2. Анализ аргументов

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--images", required=True,
 help="path to out input directory of images")
ap.add_argument("-m", "--model", required=True,
 help="path to pre-trained model")
args = vars(ap.parse_args())

Шаг 3. Загрузка предварительно обученной модели.

print("[INFO] loading pre-trained network...")
model = load_model(args["model"])

Шаг 4: загрузка изображений из каталога тестирования.

imagePaths = list(paths.list_images(args["images"]))
random.shuffle(imagePaths)
imagePaths = imagePaths[:16]
results = []

Шаг 5. Для каждого изображения а) измените его размер в соответствии с размером обученной модели, б) сделайте прогнозы.

for p in imagePaths:
 orig = cv2.imread(p)
 image = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB)
 image = cv2.resize(image, (224, 224))
 image = image.astype("float") / 255.0
 image = img_to_array(image)
 image = np.expand_dims(image, axis=0)
 pred = model.predict(image)
 pred = pred.argmax(axis=1)[0]
 label = "Covid" if pred == 0 else "Normal"
 color = (0, 0, 255) if pred == 0 else (0, 255, 0)
 orig = cv2.resize(orig, (128, 128))
 cv2.putText(orig, label, (3, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
  color, 2)
 results.append(orig)

Шаг 6. Создайте плитки размером 3 x 3.

montage = build_montages(results, (128, 128), (3, 3))[0]
cv2.imshow("Results", montage)
cv2.waitKey(0)

Выполните следующий код, чтобы предсказать результат

python testing_detector.py --images images --model covid19.model

Ура!! Мы закончили создание детектора Covid-19. Результаты не будут такими точными, поскольку набор данных настолько мал. Эту статью можно рассматривать как доказательство концепции и учебную цель.

Ссылка на репозиторий Github: https://github.com/Harika-BV/Covid-19-Detection-using-Chest-X-ray