# Tensorflow # Keras # DeepLearning
В этом посте мы собираемся создать Обнаружение Covid-19 с помощью рентгеновского сканирования грудной клетки. Как новичок и энтузиаст глубокого обучения, я хотел поработать над реальным приложением и наткнулся на отличную руководство Адриан Роузброк.
PS: Основная цель этой статьи - дать заинтересованным лицам практический опыт глубокого обучения и не является научно подтвержденным исследованием.
Необходимое условие
- Сбор рентгеновских снимков грудной клетки здоровых пациентов и рентгеновских снимков грудной клетки пациентов с коронавирусом
- Скачайте набор данных по этой ссылке.
- Установите 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