Erkennen Sie COVID-19 in Röntgenstrahlen mit Keras, TensorFlow und Deep Learning


Mithilfe dieses Handbuchs lernen wir mithilfe von Keras, TensorFlow und Deep Training, wie COVID-19 automatisch aus einem manuell zusammengestellten Datensatz aus Röntgenbildern bestimmt wird.

Wie so viele andere mache ich mir aufrichtige Sorgen um COVID-19. Mir ist aufgefallen, dass ich ständig meinen Zustand analysiere und mich frage, ob und wann ich die Krankheit bekommen werde. Und je mehr ich mir darüber Sorgen mache, desto mehr wird es zu einem schmerzhaften Spiel des Geistes, bei dem Symptomatik mit Hypochondrien kombiniert wird:

  • Ich wachte am Morgen auf und fühlte Schmerzen und Schwäche.
  • Als ich aus dem Bett krabbelte, fand ich eine laufende Nase (obwohl bereits bekannt ist, dass eine laufende Nase kein Symptom für COVID-19 ist).
  • Als ich ins Badezimmer kam, um einen Papierschal zu holen, hustete ich bereits.

Anfangs habe ich nicht viel darauf geachtet - ich bin allergisch gegen Pollen und aufgrund des warmen Wetters an der Ostküste der USA war dieser Frühling ein früher Frühling. Dies sind höchstwahrscheinlich allergische Symptome. Aber tagsüber besserte sich mein Zustand nicht. Ich sitze und schreibe dieses Handbuch mit einem Thermometer im Mund. Ich schaue nach unten und sehe 37,4 ° C. Meine normale Körpertemperatur ist mit 36,3 ° C etwas niedriger als bei anderen. Alles über 37,2 ° C ist für mich schon etwas Hitze.

Husten und leichtes Fieber? Es könnte COVID-19 sein ... oder nur meine Allergie. Es ist unmöglich, es ohne Tests herauszufinden, und genau diese „Unwissenheit“ macht die Situation auf menschlicher Ebene so einschüchternd.

UFO Care Minute


COVID-19 — , SARS-CoV-2 (2019-nCoV). — , /, .



, .

, , .

: |

Trotz meiner Befürchtungen versuche ich rational zu denken. Ich bin etwas über 30, in guter Verfassung und meine Immunität ist stark. Ich werde mich in Quarantäne stellen (nur für den Fall), mich ausruhen und mich um alles kümmern. COVID-19 macht mir aus Sicht der persönlichen Gesundheit keine Angst (zumindest werde ich es für mich selbst aushalten).

Ich mache mir also Sorgen um meine älteren Verwandten, einschließlich all derer, bei denen die Krankheit bereits diagnostiziert wurde, sowie derer, die sich in Pflegeheimen und Krankenhäusern befinden. Diese Menschen sind verletzlich und es wird schrecklich sein, wenn sie an COVID-19 sterben.

Anstatt nichts zu tun und mich von meiner Krankheit zu Hause halten zu lassen (sei es Allergie, COVID-19 oder meine Ängste), beschloss ich zu tun, was ich kann:Ich werde den Code schreiben, Experimente durchführen und anhand praktischer Beispiele anderen den Umgang mit Computer Vision und Deep Learning beibringen .

Ich muss sofort sagen, dass dies nicht der wissenschaftlichste Artikel ist, den ich geschrieben habe. Sie ist überhaupt nicht wissenschaftlich. Die verwendeten Methoden und Datensätze sind keine Veröffentlichung wert. Aber sie dienen als Ausgangspunkt für diejenigen, die zumindest etwas helfen wollen.

Ich mache mir Sorgen um dich und diese Gemeinschaft. Ich möchte helfen, was ich kann: Dieser Artikel ist mein Weg, um schwierige Zeiten mental zu bewältigen und gleichzeitig anderen in einer ähnlichen Situation zu helfen.

In diesem Handbuch lernen Sie:

  1. Sammeln eines OpenSource-Datensatzes von Röntgenbildern von Patienten mit nachgewiesenem COVID-19.
  2. «» ( ) .
  3. COVID-19 .
  4. .

Hinweis: Ich habe dies bereits angedeutet, aber jetzt werde ich direkt sagen. Die hier beschriebenen Techniken dienen nur zu Bildungszwecken. Dies ist keine strenge wissenschaftliche Studie, sie wird nicht in Fachzeitschriften veröffentlicht. Dieser Artikel richtet sich an Leser, die sich für Computer Vision und Deep Learning interessieren, in der Praxis lernen möchten, sowie an diejenigen, die sich von aktuellen Ereignissen inspirieren lassen. Ich bitte Sie, dies alles zu berücksichtigen.

Im ersten Teil des Handbuchs werden wir diskutieren, wie COVID-19 in Lungenröntgenstrahlen nachgewiesen werden kann. Dann diskutieren wir den Datensatz selbst. Und dann werde ich zeigen, wie das Modell mit Keras und TensorFlow trainiert wird, um COVID-19 in unseren Bildern vorherzusagen.

Erläuterung


Dieser Artikel zur automatischen Erkennung von COVID-19 wurde nur zu Bildungszwecken verfasst. Es ist nicht beschreibt ein zuverlässiges und genaues Diagnosesystem COVID-19, hat weder von einem professionellen noch aus wissenschaftlicher Sicht getestet.

Mein Ziel ist es, Sie zu inspirieren und zu zeigen, wie das Studium von Computer Vision und Deep Learning mit der anschließenden Anwendung dieses Wissens im medizinischen Bereich einen großen Einfluss auf die Welt haben kann.

Stellen Sie sich vor: Sie brauchen keine medizinische Ausbildung, um die Medizin zu beeinflussen . Deep Training-Praktiker arbeiten heute eng mit Ärzten und anderen Ärzten zusammen, um komplexe Probleme zu lösen, Leben zu retten und die Welt zu einem besseren Ort zu machen.

Ich hoffe, meine Führung inspiriert Sie dazu.

In Anbetracht all dessen sind Forscher, Kuratoren von Magazinen und das Überprüfungssystem bereits mit Arbeiten überladen, die COVID-19-Prognosemodelle von zweifelhafter Qualität beschreiben. Bitte senden Sie den Code und das Modell dieses Artikels nicht an eine Zeitschrift oder eine wissenschaftliche Veröffentlichung - Sie werden nur das Chaos erhöhen .

Wenn Sie auf der Grundlage dieses Artikels (oder einer anderen Veröffentlichung zu COVID-19) Nachforschungen anstellen möchten, halten Sie sich zur Beschreibung von Vorhersagemodellen an den TRIPOD-Leitfaden.

Wie Sie verstehen, kann der Einsatz künstlicher Intelligenz im medizinischen Bereich sehr schwerwiegende Folgen haben. Veröffentlichen und verwenden Sie solche Modelle nur, wenn Sie ein Facharzt sind oder von diesen Fachleuten ausführlich beraten wurden.

Wie kann COVID-19 in Röntgenstrahlen nachgewiesen werden?



Abbildung 1: Beispiel einer Röntgenaufnahme eines mit COVID-19 diagnostizierten Patienten. In diesen Bildern können Sie den Klassifikator mithilfe von Keras und TensorFlow unterrichten, um COVID-19 zu bestimmen.

Das Testen auf COVID-19 ist jetzt schwierig - es gibt nicht genügend Tests , aber es ist unmöglich, sie schnell zu erstellen, was nur die Panik erhöht. Und in Panik gibt es Schurken, die versuchen, von anderen zu profitieren und gefälschte Tests für COVID-19 zu verkaufen , wobei sie in sozialen Netzwerken und Instant Messenger ahnungslose Opfer finden.

Angesichts der begrenzten Anzahl von Tests müssen wir uns auf andere Diagnosemethoden verlassen.

Ich entschied mich für die Untersuchung von Röntgenstrahlen, da Ärzte diese häufig verwenden und Computertomographieergebnisse zur Diagnose von Lungenentzündung, Lungenentzündung, Abszessen und vergrößerten Lymphknoten verwenden. Da das Virus die Epithelzellen angreift, die die Atemwege auskleiden, können wir mithilfe von Röntgenstrahlen den Zustand der menschlichen Lunge untersuchen. Und da Röntgengeräte fast überall sind, können Sie mit den Bildern COVID-19 ohne Testkits erkennen.

Zu den Nachteilen des Verfahrens zählen der Bedarf an Radiologen sowie eine erhebliche Verarbeitungszeit. Und Zeit ist besonders teuer, wenn Menschen auf der ganzen Welt krank sind. Und um Ärzten Zeit zu sparen, müssen Sie ein automatisches Analysesystem erstellen .

Hinweis: , , COVID-19 . . , , , , COVID-19, .

COVID-19



Abbildung 2: Links Bilder von Menschen mit positivem Ergebnis (infiziert), rechts Bilder mit negativem Ergebnis. In diesen Bildern werden wir das Modell unter Verwendung von TensorFlow und Keras lehren, um das Vorhandensein von COVID-19 (dh einer durch Coronavirus verursachten Krankheit) automatisch vorherzusagen.

Der Datensatz der hier verwendeten Patientenbilder mit COVID-19 wurde unter der Aufsicht von Dr. Joseph Cohen , einem Doktoranden an der Universität von Montreal, zusammengestellt. Vor einigen Tagen begann Cohen, Röntgenbilder von Patienten mit COVID-19 zu sammeln und in das GitHub-Repository hochzuladen . Dort finden Sie Beispiele nicht nur für diese Krankheit, sondern auch für MERS, SARS und ARDS.

So erstellen Sie einen Datensatz I:

  1. Analysieren Sie die Datei metadata.csv aus dem Repository.
  2. Alle Zeilen ausgewählt:

Insgesamt wurden 25 Aufnahmen mit positiven Ergebnissen auf COVID-19 erhalten ( Abbildung 2 , links ).

Wählen Sie nun die Bilder von gesunden Menschen.

Dazu habe ich einen Kaggle-Lungenröntgendatensatz (Lungenentzündung) genommen und 25 Bilder von gesunden Menschen ausgewählt ( Abbildung 2 , rechts ). Dieser Datensatz weist eine Reihe von Nachteilen auf, einschließlich schlecht oder falsch ausgefüllter Etiketten, eignet sich jedoch als Ausgangspunkt für die Prüfung der Hypothese des COVID-19-Detektors.

Als Ergebnis bekam ich 50 Schüsse: 25 Patienten mit COVID-19 und 25 gesunde. Sie können den Datensatz über den Link herunterladen. Außerdem habe ich Python-Skripte hinzugefügt, mit denen ich das Dataset generiert habe, aber in diesem Artikel habe ich sie nicht berücksichtigt.

Projektstruktur


Laden Sie den Code und die Daten herunter. Ziehen Sie die Dateien von dort heraus, und Sie erhalten die folgende Verzeichnisstruktur:

$ tree --dirsfirst --filelimit 10
.
├── dataset
│   ├── covid [25 entries]
│   └── normal [25 entries]
├── build_covid_dataset.py
├── sample_kaggle_dataset.py
├── train_covid19.py
├── plot.png
└── covid19.model

Drei Verzeichnisse, fünf Dateien. Der Datensatz befindet sich im Datensatz / Verzeichnis und ist in zwei Klassen unterteilt - covid / und normal /. Unten sehen wir uns das Skript train_covid19.py an, das unseren COVID-19-Detektor trainiert.

Implementierung des Schulungsskripts


Fahren wir mit der Feinabstimmung des neuronalen Faltungsnetzwerks fort, das COVID-19 mithilfe von Keras, TensorFlow und Deep Learning automatisch diagnostiziert.

Öffnen Sie die Datei train_covid19.py und fügen Sie den folgenden Code ein:

# import the necessary packages
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

Dieses Skript nutzt die Bibliotheken TensorFlow 2.0 und Keras, indem es die Importe von tensorflow.keras auswählt. Auch wir verwenden:

  • scikit-learn , dies ist eine De-facto- Python-Bibliothek für maschinelles Lernen.
  • matplotlib zum Charting,
  • OpenCV zum Hochladen und Vorverarbeiten von Bildern in einem Datensatz.

Informationen zur Installation von TensorFlow 2.0 (einschließlich Scikit-Learn, OpenCV und Matplotlib) finden Sie in meinen Tutorials für Ubuntu oder MacOS .

Jetzt analysieren wir die Argumente für die Befehlszeile und initialisieren die Hyperparameter:

# construct the argument parser and parse the arguments
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())

# initialize the initial learning rate, number of epochs to train for,
# and batch size
INIT_LR = 1e-3
EPOCHS = 25
BS = 8

Unsere drei Befehlszeilenargumente ( Zeilen 24-31 ) umfassen:

  • --dataset: Pfad zum Eingabedatensatz.
  • --plot: Optionaler Pfad zum Exit-Zeitplan der Lernhistorie. Standardmäßig heißt das Diagramm plot.png, sofern in der Befehlszeile kein anderer Name angegeben ist.
  • --model: Optionaler Pfad zu unserem Ausgabe-COVID-19-Definitionsmodell. Standardmäßig heißt es covid19.model.

Jetzt initialisieren wir die anfängliche Lernfrequenz, die Anzahl der Trainingsperioden und die Hyperparameter der Paketgröße ( Zeilen 35-37 ).

Laden Sie anschließend die Röntgenbilder herunter und verarbeiten Sie sie vor:

# grab the list of images in our dataset directory, then initialize
# the list of data (i.e., images) and class images
print("[INFO] loading images...")
imagePaths = list(paths.list_images(args["dataset"]))
data = []
labels = []

# loop over the image paths
for imagePath in imagePaths:
    # extract the class label from the filename
    label = imagePath.split(os.path.sep)[-2]

    # load the image, swap color channels, and resize it to be a fixed
    # 224x224 pixels while ignoring aspect ratio
    image = cv2.imread(imagePath)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image = cv2.resize(image, (224, 224))

    # update the data and labels lists, respectively
    data.append(image)
    labels.append(label)

# convert the data and labels to NumPy arrays while scaling the pixel
# intensities to the range [0, 1]
data = np.array(data) / 255.0
labels = np.array(labels)

Um die Daten zu laden, nehmen wir alle Pfade zu den Bildern im Verzeichnis --dataset ( Zeile 42 ) und dann für jeden imagePath:

  • Wir extrahieren aus dem Pfad ( Zeile 49 ) die Klassenbezeichnung (covid oder normal).
  • Wir laden das Bild, konvertieren es in RGB-Kanäle und reduzieren es auf eine Größe von 224 x 224 Pixel, um ein Faltungsnetzwerk zu speisen ( Zeilen 53-55 ).
  • Aktualisieren von Listen mit Daten und Beschriftungen ( Zeilen 58 und 59 ).

Dann skalieren wir die Pixelintensität in einen Bereich [0, 1]und konvertieren die Daten und Beschriftungen in das NumPy-Array-Format ( Zeilen 63 und 64 ).

Als Nächstes führen wir eine One-Hot-Codierung unserer Etiketten durch und teilen den Datensatz in Trainings- und Testsätze auf:

# perform one-hot encoding on the labels
lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels); print(labels)

# partition the data into training and testing splits using 80% of
# the data for training and the remaining 20% for testing
(trainX, testX, trainY, testY) = train_test_split(data, labels,
    test_size=0.20, stratify=labels, random_state=42)

# initialize the training data augmentation object
trainAug = ImageDataGenerator(
    rotation_range=15,
    fill_mode="nearest")

Die einheitliche Etikettencodierung erfolgt in den Zeilen 67-69 : Die Daten werden in diesem Format dargestellt:

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

Jedes auf diese Weise codierte Label besteht aus einem Array mit zwei Elementen, in dem eines der Elemente "hot" (1) und das zweite "no" (0) ist. In den Zeilen 73 und 74 ist der Datensatz in zwei Teile unterteilt: 80% für das Training, 20% für das Testen.

Um das Modell zu verallgemeinern, führen wir eine Datenerweiterung (Datenerweiterung) durch, indem wir eine zufällige Bilddrehung um 15 Grad im Uhrzeigersinn einstellen oder dem entgegenwirken. Das Erweiterungsgenerierungsobjekt wird in den Zeilen 77-79 initialisiert .

Initialisieren Sie nun das VGGNet-Modell und bereiten Sie es für die Feinabstimmung vor :

# load the VGG16 network, ensuring the head FC layer sets are left
# off
baseModel = VGG16(weights="imagenet", include_top=False,
    input_tensor=Input(shape=(224, 224, 3)))

# construct the head of the model that will be placed on top of the
# the base model
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)

# place the head FC model on top of the base model (this will become
# the actual model we will train)
model = Model(inputs=baseModel.input, outputs=headModel)

# loop over all layers in the base model and freeze them so they will
# *not* be updated during the first training process
for layer in baseModel.layers:
    layer.trainable = False

In den Zeilen 83 und 84 wird eine Instanz des neuronalen Netzwerks VGG16 mit den Gewichten erstellt, die im Voraus auf ImageNet ohne vollständig verbundene Schicht erhalten wurden.

Als nächstes erstellen wir eine vollständig verbundene Schicht, die aus POOL => FC = SOFTMAX-Schichten ( Zeilen 88-93 ) besteht, und platzieren sie auf VGG16 ( Zeile 97 ).

Frieren Sie nun die CONV-Gewichte ein, sodass nur eine vollständig verbundene Schicht trainiert wird ( Zeilen 101-102 ). Damit ist die Abstimmung abgeschlossen.

Jetzt sind wir bereit, unser Deep-Learning-Modell zu kompilieren und zu trainieren:

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

# train the head of the network
print("[INFO] 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)

In den Zeilen 106-108 wurde das Training und Optimierer der Netzwerkdämpfungsgeschwindigkeit Adam zusammengestellt. Da es sich um eine Klassifizierungsaufgabe mit zwei Klassen handelt, verwenden wir die Verlustfunktion der binären Kreuzentropie (binary_crossentropy) und nicht der kategorialen Kreuzentropie (kategoriale Kreuzentropie).

Um das Training zu beginnen, rufen wir die Keras-Methode fit_generator auf und geben ihm unsere Röntgenstrahlen durch eine Datenobjekterweiterung ( Zeilen 112-117 ).

Lassen Sie uns nun das Modell bewerten:

# make predictions on the testing set
print("[INFO] evaluating network...")
predIdxs = model.predict(testX, batch_size=BS)

# for each image in the testing set we need to find the index of the
# label with corresponding largest predicted probability
predIdxs = np.argmax(predIdxs, axis=1)

# show a nicely formatted classification report
print(classification_report(testY.argmax(axis=1), predIdxs,
    target_names=lb.classes_))

Dazu führen wir zunächst Prognosen basierend auf der Testsuite durch und erhalten Prognoseindizes ( Zeilen 121-125 ). Anschließend erstellen wir den Klassifizierungsbericht ( Zeilen 128 und 129 ) mit dem Dienstprogramm scikit-learn und zeigen ihn an .

Berechnen wir nun die Verwirrungsmatrix für die zukünftige statistische Schätzung:

# compute the confusion matrix and and use it to derive the raw
# accuracy, sensitivity, and specificity
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])

# show the confusion matrix, accuracy, sensitivity, and specificity
print(cm)
print("acc: {:.4f}".format(acc))
print("sensitivity: {:.4f}".format(sensitivity))
print("specificity: {:.4f}".format(specificity))

Wir sind hier:

  • eine Matrix von Ungenauigkeiten erzeugen ( Zeile 133 ),
  • Wir verwenden diese Matrix, um die Genauigkeit, Empfindlichkeit und Spezifität zu bestimmen ( Zeilen 135-137 ), und leiten dann alle diese Metriken ab ( Zeilen 141-143 ).

Für die nachfolgende Analyse zeigen wir dann in Form eines Diagramms in einer Datei den Verlauf der Genauigkeits- und Verluständerungen an:

# plot the training loss and accuracy
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.plot(np.arange(0, N), H.history["accuracy"], label="train_acc")
plt.plot(np.arange(0, N), H.history["val_accuracy"], label="val_acc")
plt.title("Training Loss and Accuracy on COVID-19 Dataset")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend(loc="lower left")
plt.savefig(args["plot"])

Und schließlich serialisieren wir das tf.keras-Klassifikatormodell auf die Festplatte:

# serialize the model to disk
print("[INFO] saving COVID-19 detector model...")
model.save(args["model"], save_format="h5")

Wir trainieren unseren Detektor mit Keras und TensorFlow


Nach der Implementierung des Skripts train_covid19.py können wir den automatischen Detektor trainieren.

Laden Sie den Quellcode, den Datensatz und das vorgefertigte Modell herunter. Öffnen Sie ein Terminal und führen Sie den Befehl zum Trainieren des Detektors aus:

$ python train_covid19.py --dataset dataset
[INFO] loading images...
[INFO] compiling model...
[INFO] training head...
Epoch 1/25
5/5 [==============================] - 20s 4s/step - loss: 0.7169 - accuracy: 0.6000 - val_loss: 0.6590 - val_accuracy: 0.5000
Epoch 2/25
5/5 [==============================] - 0s 86ms/step - loss: 0.8088 - accuracy: 0.4250 - val_loss: 0.6112 - val_accuracy: 0.9000
Epoch 3/25
5/5 [==============================] - 0s 99ms/step - loss: 0.6809 - accuracy: 0.5500 - val_loss: 0.6054 - val_accuracy: 0.5000
Epoch 4/25
5/5 [==============================] - 1s 100ms/step - loss: 0.6723 - accuracy: 0.6000 - val_loss: 0.5771 - val_accuracy: 0.6000
...
Epoch 22/25
5/5 [==============================] - 0s 99ms/step - loss: 0.3271 - accuracy: 0.9250 - val_loss: 0.2902 - val_accuracy: 0.9000
Epoch 23/25
5/5 [==============================] - 0s 99ms/step - loss: 0.3634 - accuracy: 0.9250 - val_loss: 0.2690 - val_accuracy: 0.9000
Epoch 24/25
5/5 [==============================] - 27s 5s/step - loss: 0.3175 - accuracy: 0.9250 - val_loss: 0.2395 - val_accuracy: 0.9000
Epoch 25/25
5/5 [==============================] - 1s 101ms/step - loss: 0.3655 - accuracy: 0.8250 - val_loss: 0.2522 - val_accuracy: 0.9000
[INFO] evaluating network...
              precision    recall  f1-score   support

       covid       0.83      1.00      0.91         5
      normal       1.00      0.80      0.89         5

    accuracy                           0.90        10
   macro avg       0.92      0.90      0.90        10
weighted avg       0.92      0.90      0.90        10

[[5 0]
 [1 4]]
acc: 0.9000
sensitivity: 1.0000
specificity: 0.8000
[INFO] saving COVID-19 detector model...

Automatische Röntgendiagnose


Hinweis: In diesem Teil "lösen" wir das Problem der Bestimmung von COVID-19 nicht. Es ist im Kontext der aktuellen Situation und nur zu Bildungszwecken geschrieben. Dies ist ein Beispiel für die praktische Anwendung von Computer Vision und Deep Learning, damit Sie sich mit verschiedenen Metriken vertraut machen können, einschließlich der üblichen Genauigkeit, Sensitivität und Spezifität (und Kompromisse, die bei der Arbeit mit medizinischen Daten berücksichtigt werden müssen). Ich wiederhole, wir lösen das Problem der Bestimmung von COVID-19 nicht.

Unser automatischer Detektor zeigte also eine Genauigkeit von ~ 90-92% allein bei Proben vonRöntgenbildern. Für das Training des Modells wurden keine weiteren Informationen verwendet, einschließlich geografischer Lage, Bevölkerungsdichte usw.

Wir haben auch erhaltenSensitivität von 100% und Spezifität von 80% , was bedeutet:

  • Von den Patienten mit COVID-19 (echte positive Fälle) konnten wir anhand des Modells in 100% der Fälle genau als „COVID-19-positiv“ identifizieren.
  • Von den Patienten, die kein COVID-19 hatten (echte negative Fälle), konnten wir anhand des Modells nur in 80% der Fälle genau als „COVID-19-negativ“ identifizieren.

Wie die Grafik zur Trainingshistorie zeigt, wird das neuronale Netzwerk trotz der sehr geringen Größe der Trainingsdaten nicht umgeschult :


Abbildung 3: Dieses Diagramm der Genauigkeit und des Verlusts zeigt, dass unser Modell nicht umgeschult wird.

Es ist großartig, dass wir bei der Erkennung von COVID-19 eine Genauigkeit von 100% erreicht haben. Die Situation mit wirklich negativen Fällen ist jedoch peinlich: Wir möchten nicht diejenigen, die tatsächlich „COVID-19-positiv“ sind, „COVID-19-negativ“ zuschreiben.

Wir wollen am wenigsten kranke Patienten nach Hause gehen lassen, zu Familien und Freunden, um zur weiteren Ausbreitung der Krankheit beizutragen.

Sie müssen auch sehr vorsichtig mit dem Anteil falsch positiver Fälle sein: Wir möchten nicht fälschlicherweise jemanden als krank betrachten und ihn mit anderen Patienten unter Quarantäne stellen, damit er von ihnen infiziert wird .

Ein Gleichgewicht zwischen Sensitivität und Spezifität finden -Eine äußerst schwierige Aufgabe, insbesondere in Bezug auf die Medizin und insbesondere in Bezug auf die rasche Ausbreitung von Infektionskrankheiten.

Wenn Sie über medizinisches Computer-Sehen und tiefes Lernen sprechen, sollten Sie immer daran denken, dass die Arbeit unserer Vorhersagemodelle sehr schwerwiegende Folgen haben kann: Fehlerhafte Diagnosen können Leben kosten .

Ich wiederhole, die Ergebnisse in diesem Artikel werden nur zu Bildungszwecken präsentiert . Dies ist keine Zeitschriftenveröffentlichung. Diese Daten erfüllen nicht die TRIPOD- Kriterien für die Veröffentlichung von Prognosemodellen.

Einschränkungen, Verbesserungen und weitere Arbeiten



Abbildung 4: Heutzutage fehlt es KI- und Deep-Learning-Fachleuten an hochwertigen COVID-19-Daten, um automatische Bilderkennungssysteme effektiv zu trainieren.

Eine der Haupteinschränkungen der in diesem Handbuch beschriebenen Methode sind Daten.

Wir haben nicht genügend (zuverlässige) Daten, um COVID-19-Detektoren zu trainieren.

Krankenhäuser haben bereits viele Fallbeispiele mit diesem Virus, aber angesichts der Privatsphäre und der Menschenrechte wird es noch schwieriger, schnell einen hochwertigen Datensatz aus medizinischen Bildern zusammenzustellen. Ich glaube, dass wir in den nächsten 12 bis 18 Monaten mehr Qualitätsdaten haben werden. Aber jetzt müssen Sie verwenden, was Sie haben.

Ich habe (unter Berücksichtigung meiner körperlichen und geistigen Verfassung) unter den Bedingungen begrenzter Zeit und Ressourcen versucht, diesen Leitfaden für diejenigen zu schreiben, die sich für die Verwendung von Computer Vision und Deep Learning interessieren. Aber ich möchte Sie daran erinnern, dass ich kein professioneller Mediziner bin .

Um den COVID-19-Detektor im wirklichen Leben einsetzen zu können, muss er von echten Ärzten, die Hand in Hand mit Deep-Learning-Spezialisten arbeiten , streng getestet werden. Die von mir beschriebene Methode ist dafür nicht geeignet.

Außerdem muss man vorsichtig sein, was genau das Modell „lernt“.

Wie ich im Grad-CAM-Handbuch geschrieben habeEs ist wahrscheinlich, dass das Modell Muster lernt, die für COVID-19 nicht relevant sind, aber nur zwischen zwei Datenproben unterscheiden können (d. h. positive und negative Diagnosen). Die Ergebnisse unseres Detektors müssen von Ärzten streng getestet und überprüft werden.

Und schließlich werden zukünftige (und fortschrittlichere) Detektoren multimodal sein.

Jetzt verwenden wir nur visuelle Daten (Röntgenstrahlen). Bessere Detektoren sollten andere Daten verwenden: Vitalindikatoren für Patienten, Bevölkerungsdichte, geografische Lage usw. Visuelle Daten allein reichen für solche Aufgaben normalerweise nicht aus .

Aus diesen Gründen möchte ich noch einmal betonen: Dieser Leitfaden spielt nur die Rolle von Schulungsmaterial - er kann nicht als zuverlässiger COVID-19-Detektor angesehen werden.

Wenn Sie glauben, dass Sie oder jemand in der Nähe von COVID-19 sind, befolgen Sie die Empfehlungen Ihres Gesundheitssystems.

Ich hoffe, dieser Leitfaden hat Ihnen geholfen. Ich hoffe auch, dass es für jemanden ein Ausgangspunkt bei der Suche nach Methoden zur Verwendung von Computer Vision und Deep Learning sein wird, um COVID-19 automatisch zu bestimmen.

Zusammenfassung


In diesem Handbuch haben Sie gelernt, wie Sie mit Keras, TensorFlow und Deep Learning einen automatischen COVID-19-Detektor für einen Datensatz aus Röntgenbildern erstellen.

Heute (noch) gibt es keine qualitativ hochwertigen und verifizierten Bilddatensätze für diese Krankheit, daher müssen Sie mit dem Joseph Cohen-Repository arbeiten :


Dann haben wir mit Hilfe von Keras und TensorFlow den COVID-19-Detektor trainiert, der eine Genauigkeit von 90-92% bei unserer Testprobe mit einer Sensitivität von 100% und einer Spezifität von 80% (bei unserem kleinen Datensatz) zeigte.

Denken Sie daran, dass der hier beschriebene Detektor nur zu Bildungszwecken dient (siehe Hinweis im Text). Ich wollte andere Menschen dazu inspirieren, tiefes Lernen zu nutzen, um zu zeigen, dass es in Kombination mit Computer Vision einen großen Einfluss auf unser Leben haben kann.

Ich hoffe, dass es Ihnen gefallen hat.

All Articles