Détectez COVID-19 dans les rayons X avec Keras, TensorFlow et Deep Learning


Avec l'aide de ce guide, avec l'aide de Keras, TensorFlow et de l'apprentissage en profondeur, nous apprendrons comment déterminer automatiquement COVID-19 à partir d'un ensemble de données assemblé manuellement à partir d'images radiographiques.

Comme tant d'autres, je suis sincèrement préoccupé par COVID-19. J'ai remarqué que j'analysais constamment mon état et je me demandais si j'attraperais la maladie et quand elle se produirait. Et plus je m'en inquiète, plus cela se transforme en un jeu d'esprit douloureux, dans lequel la symptomatologie se conjugue à l'hypocondrie:

  • Je me suis réveillé le matin, ressentant un peu de douleur et de faiblesse.
  • Quand j'ai rampé hors du lit, j'ai trouvé un nez qui coule (bien qu'il soit déjà connu qu'un nez qui coule n'est pas un symptôme de COVID-19).
  • Au moment où je suis arrivé aux toilettes pour obtenir un foulard en papier, je toussais déjà.

Au début, je n'y ai pas prêté beaucoup d'attention - je suis allergique au pollen, et en raison du temps chaud sur la côte est des États-Unis, ce printemps a été un début de printemps. Il s'agit très probablement de symptômes allergiques. Mais pendant la journée, mon état ne s'est pas amélioré. Je m'assois et j'écris ce manuel avec un thermomètre dans la bouche. Je baisse les yeux et vois 37,4 ° C. Ma température corporelle normale est légèrement inférieure à celle des autres, à 36,3 ° C. Tout ce qui dépasse 37,2 ° C est déjà un peu chaud pour moi.

Toux et légère fièvre? Ça pourrait être COVID-19 ... ou juste mon allergie. Il est impossible de le découvrir sans tester, et c'est précisément cette «ignorance» qui rend la situation si intimidante sur le plan humain.

UFO Care Minute


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



, .

, , .

: |

Malgré mes craintes, j'essaie de penser rationnellement. J'ai un peu plus de 30 ans, je suis en pleine forme et mon immunité est forte. Je vais me mettre en quarantaine (juste au cas où), me reposer et m'occuper de tout. COVID-19 ne me fait pas peur du point de vue de la santé personnelle (au moins je vais le supporter pour moi-même).

Donc, je m'inquiète pour mes parents âgés, y compris tous ceux qui ont déjà été diagnostiqués avec la maladie, ainsi que ceux qui sont dans des maisons de retraite et des hôpitaux. Ces gens sont vulnérables et ce sera terrible s'ils meurent à cause de COVID-19.

Au lieu de ne rien faire et de laisser ma maladie me garder à la maison (que ce soit l'allergie, le COVID-19 ou mes peurs), j'ai décidé de faire ce que je peux:Je vais écrire le code, mener des expériences et, à l'aide d'exemples pratiques, enseigner aux autres comment utiliser la vision par ordinateur et l'apprentissage en profondeur .

Je dois dire tout de suite que ce n'est pas l' article le plus scientifique que j'ai écrit. Elle n'est pas du tout scientifique. Les méthodes et les ensembles de données utilisés ne valent pas la peine d'être publiés. Mais ils servent de point de départ à ceux qui veulent au moins quelque chose pour aider.

Je m'inquiète pour vous et cette communauté. Je veux aider ce que je peux: cet article est ma façon de faire face mentalement aux moments difficiles, tout en aidant les autres dans une situation similaire.

Dans ce guide, vous apprendrez:

  1. Comment collecter un ensemble de données open source d'images radiographiques de patients atteints de COVID-19 détecté.
  2. «» ( ) .
  3. COVID-19 .
  4. .

Remarque: j'ai déjà fait allusion à cela, mais maintenant je vais le dire directement. Les techniques décrites ici sont uniquement à des fins éducatives. Il ne s'agit pas d'une étude scientifique rigoureuse, elle ne sera pas publiée dans des revues. Cet article s'adresse aux lecteurs qui s'intéressent à la vision par ordinateur et au deep learning, qui souhaitent apprendre dans la pratique, ainsi qu'à ceux qui sont inspirés par l'actualité. Je vous demande de prendre tout cela en compte.

Dans la première partie du manuel, nous verrons comment détecter le COVID-19 dans les radiographies pulmonaires. Ensuite, nous discutons de l'ensemble de données lui-même. Et puis je montrerai comment former le modèle en utilisant Keras et TensorFlow pour prédire COVID-19 dans nos images.

Explication


Cet article sur la détection automatique COVID-19 est écrit à des fins éducatives uniquement. Il ne décrit pas un système de diagnostic fiable et précis COVID-19, n'a été testé ni d'un point de vue professionnel ni académique.

Mon objectif est de vous inspirer et de montrer comment l'étude de la vision par ordinateur et de l'apprentissage profond avec l'application ultérieure de ces connaissances dans le domaine médical peut avoir un impact important sur le monde.

Imaginez: vous n'avez pas besoin d'une formation médicale pour influencer la médecine . Aujourd'hui, les praticiens de la formation approfondie travaillent en étroite collaboration avec des médecins et d'autres médecins pour résoudre des problèmes complexes, sauver des vies et rendre le monde meilleur.

J'espère que mon leadership vous inspirera à le faire.

Mais compte tenu de tout ce qui précède, les chercheurs, les conservateurs de magazines et le système d'examen sont déjà surchargés de travaux qui décrivent des modèles de prévision COVID-19 d'une qualité douteuse. Veuillez ne pas envoyer le code et le modèle de cet article à une revue ou à une publication scientifique - vous ne fera qu'augmenter le chaos .

De plus, si vous souhaitez effectuer des recherches sur la base de cet article (ou de toute autre publication sur COVID-19), respectez le guide TRIPOD pour décrire les modèles prédictifs.

Comme vous le comprenez, l'utilisation de l'intelligence artificielle dans le domaine médical peut avoir des conséquences très graves. Ne publiez et n'utilisez de tels modèles que si vous êtes un médecin spécialiste ou si ces spécialistes vous ont conseillé en détail.

Comment COVID-19 peut-il être détecté aux rayons X?



Figure 1: Exemple de radiographie d'un patient diagnostiqué avec COVID-19. Dans ces images, vous pouvez apprendre au classificateur à l'aide de Keras et TensorFlow pour déterminer COVID-19.

Le test de COVID-19 est maintenant difficile - il n'y a pas assez de tests , mais il est impossible de les produire rapidement, ce qui ne fait qu'accroître la panique. Et dans la panique, il y a des scélérats qui essaient de tirer profit des autres et de vendre de faux tests sur COVID-19 , se retrouvant victimes sans méfiance dans les réseaux sociaux et les messagers instantanés.

Étant donné le nombre limité de tests, nous devons compter sur d'autres méthodes de diagnostic.

J'ai décidé d'étudier les rayons X, car les médecins les utilisent souvent et les résultats de la tomodensitométrie pour diagnostiquer la pneumonie, l'inflammation pulmonaire, les abcès et les ganglions lymphatiques hypertrophiés. Comme le virus attaque les cellules épithéliales qui tapissent les voies respiratoires, nous pouvons utiliser des rayons X pour étudier l'état des poumons humains. Et puisque les machines à rayons X sont presque partout, en utilisant les images, vous pouvez détecter COVID-19 sans kits de test.

Les inconvénients de la méthode incluent le besoin de radiologues, ainsi qu'un temps de traitement important. Et le temps est particulièrement coûteux lorsque les gens sont malades partout dans le monde. Et pour gagner du temps aux médecins, vous devez créer un système d'analyse automatique .

Remarque: , , COVID-19 . . , , , , COVID-19, .

COVID-19



Figure 2: à gauche sont des photos de personnes avec un résultat positif (infecté), à droite - avec un négatif. Dans ces images, nous enseignerons le modèle en utilisant TensorFlow et Keras pour prédire automatiquement la présence de COVID-19 (c'est-à-dire une maladie résultant d'un coronavirus).

L'ensemble de données d'images de patients utilisées avec COVID-19 utilisé ici a été compilé sous la supervision du Dr Joseph Cohen , un étudiant diplômé de l'Université de Montréal. Il y a quelques jours, Cohen a commencé à collecter des images radiographiques de patients atteints de COVID-19 et à les télécharger dans le référentiel GitHub. Vous y trouverez des exemples non seulement de cette maladie, mais aussi du MERS, du SRAS et des SDRA.

Pour créer un jeu de données I:

  1. Analysez le fichier metadata.csv à partir du référentiel.
  2. Sélectionné toutes les lignes:

Au total, 25 tirs ont été obtenus avec des résultats positifs sur COVID-19 ( figure 2 , à gauche ).

Maintenant, choisissez les photos de personnes en bonne santé.

Pour ce faire, j'ai pris un ensemble de données de radiographie pulmonaire de Kaggle (pneumonie) et sélectionné 25 images de personnes en bonne santé ( figure 2 , à droite ). Cet ensemble de données présente un certain nombre d'inconvénients, y compris des étiquettes mal ou mal remplies, mais il convient comme point de départ pour tester l'hypothèse du détecteur COVID-19.

En conséquence, j'ai reçu 50 injections : 25 patients avec COVID-19 et 25 en bonne santé. Vous pouvez télécharger l'ensemble de données à partir du lien. De plus, j'ai ajouté des scripts Python avec lesquels j'ai généré le jeu de données, mais dans cet article, je ne les ai pas pris en compte.

Structure du projet


Téléchargez le code et les données. Retirez les fichiers à partir de là et vous obtenez la structure de répertoires suivante:

$ 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

Trois répertoires, cinq fichiers. L'ensemble de données se trouve dans le répertoire dataset / et est divisé en deux classes - covid / et normal /. Ci-dessous, nous regardons le script train_covid19.py qui forme notre détecteur COVID-19.

Implémentation du script de formation


Passons maintenant au réglage fin du réseau neuronal convolutionnel, qui diagnostiquera automatiquement COVID-19 à l'aide de Keras, TensorFlow et de l'apprentissage en profondeur.

Ouvrez le fichier train_covid19.py et collez le code suivant:

# 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

Ce script tire parti des bibliothèques TensorFlow 2.0 et Keras en sélectionnant les importations tensorflow.keras. Nous utilisons également:

  • scikit-learn , il s'agit d'une bibliothèque d'apprentissage automatique de facto Python,
  • matplotlib pour la cartographie,
  • OpenCV pour le téléchargement et le prétraitement d'images dans un ensemble de données.

Pour savoir comment installer TensorFlow 2.0 (y compris scikit-learn, OpenCV et matplotlib), consultez mes tutoriels pour Ubuntu ou macOS .

Maintenant, nous analysons les arguments de la ligne de commande et initialisons les hyperparamètres:

# 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

Nos trois arguments de ligne de commande ( lignes 24-31 ) incluent:

  • --dataset: chemin d'accès au jeu de données d'entrée.
  • --plot: chemin facultatif vers le calendrier de sortie de l'historique d'apprentissage. Par défaut, le graphique est appelé plot.png sauf si un nom différent est spécifié sur la ligne de commande.
  • --model: chemin facultatif vers notre modèle de définition de sortie COVID-19. Par défaut, il est appelé covid19.model.

Maintenant, nous initialisons la fréquence d'apprentissage initiale, le nombre d'époques d'apprentissage et les hyperparamètres de taille de paquet ( lignes 35-37 ).

Ensuite, téléchargez et prétraitez les rayons X:

# 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)

Pour charger les données, nous prenons tous les chemins d'accès aux images dans le répertoire --dataset ( ligne 42 ), puis pour chaque imagePath:

  • On extrait du chemin ( ligne 49 ) le label de classe (covid ou normal).
  • Nous chargeons l'image, la convertissons en canaux RVB et la réduisons à une taille de 224x224 pixels pour alimenter un réseau neuronal convolutionnel ( lignes 53-55 ).
  • Mise à jour des listes de données et d'étiquettes ( lignes 58 et 59 ).

Ensuite, nous mettons l'échelle des pixels à l'échelle [0, 1]et convertissons les données et les étiquettes au format de tableau NumPy ( lignes 63 et 64 ).

Ensuite, nous effectuerons un codage à chaud de nos étiquettes et diviserons l'ensemble de données en ensembles de formation et de test:

# 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")

Le codage unitaire des étiquettes s'effectue aux lignes 67 à 69 : les données seront présentées dans ce format:

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

Chaque étiquette codée de cette manière est constituée d'un tableau à deux éléments, dans lequel l'un des éléments est «chaud» (1) et le second est «non» (0). Aux lignes 73 et 74, l' ensemble de données est divisé en deux parties: 80% pour la formation, 20% pour les tests.

Pour généraliser le modèle, nous effectuons une expansion des données (augmentation des données), en définissant une rotation aléatoire de l'image de 15 degrés dans le sens horaire ou en la contrant. L'objet de génération d'extension est initialisé sur les lignes 77-79 .

Maintenant, initialisez le modèle VGGNet et préparez-le pour un réglage fin :

# 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

Aux lignes 83 et 84 , une instance du réseau neuronal VGG16 est créée avec les poids obtenus à l'avance sur ImageNet sans couche entièrement connectée.

Ensuite, nous allons créer une couche entièrement connectée composée de couches POOL => FC = SOFTMAX ( lignes 88-93 ) et la placer sur VGG16 ( ligne 97 ).

Geler maintenant les poids CONV de sorte que seule une couche entièrement connectée soit entraînée ( lignes 101-102 ). Ceci termine le réglage.

Nous sommes maintenant prêts à compiler et à former notre modèle d'apprentissage en profondeur:

# 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)

Dans les lignes 106-108, l' entraînement et l'optimiseur de vitesse d'atténuation du réseau compilés Adam. Étant donné qu'il s'agit d'une tâche de classification à deux classes, nous utilisons la fonction de perte de l'entropie croisée binaire (binary_crossentropy), et non de l'entropie croisée catégorique (entrentropie catégorielle).

Pour commencer la formation, nous appelons la méthode Keras fit_generator et lui donnons nos rayons X via une extension d'objet de données ( lignes 112-117 ).

Maintenant, évaluons le modèle:

# 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_))

Pour ce faire, nous effectuons d'abord des prévisions basées sur la suite de tests et obtenons des indices de prévision ( lignes 121-125 ). Ensuite, nous générerons et afficherons le rapport de classification ( lignes 128 et 129 ) à l'aide de l'utilitaire scikit-learn .

Calculons maintenant la matrice de confusion pour une future estimation statistique:

# 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))

Nous sommes ici:

  • générer une matrice d'inexactitudes ( ligne 133 ),
  • nous utilisons cette matrice pour déterminer la précision, la sensibilité et la spécificité ( lignes 135-137 ), puis nous dérivons toutes ces mesures ( lignes 141-143 ).

Ensuite, pour une analyse ultérieure, nous affichons sous forme de graphique dans un fichier l'historique des changements de précision et des pertes:

# 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"])

Et enfin, nous sérialisons le modèle de classificateur tf.keras sur le disque:

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

Nous formons notre détecteur avec Keras et TensorFlow


Après l'implémentation du script train_covid19.py, nous pouvons entraîner le détecteur automatique.

Téléchargez le code source, l'ensemble de données et le modèle pré-formé. Ouvrez un terminal et exécutez la commande pour entraîner le détecteur:

$ 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...

Diagnostic automatique des rayons X


Remarque: dans cette partie, nous ne "résolvons" pas le problème de détermination du COVID-19. Il est rédigé dans le contexte de la situation actuelle et uniquement à des fins éducatives. Ceci est un exemple de l'application pratique de la vision par ordinateur et de l'apprentissage en profondeur, afin que vous vous familiarisiez avec différentes mesures, y compris la précision, la sensibilité et la spécificité habituelles (et les compromis qui doivent être pris en compte lorsque vous travaillez avec des données médicales). Je le répète, nous ne résolvons pas le problème de détermination du COVID-19.

Ainsi, notre détecteur automatique a montré une précision de ~ 90-92% sur des échantillons d'images radiographiques seuls . Aucune autre information n'a été utilisée pour former le modèle, y compris l'emplacement géographique, la densité de population, etc.

Nous avons également reçusensibilité de 100% et spécificité de 80% , ce qui signifie:

  • Parmi les patients avec COVID-19 (vrais cas positifs), en utilisant le modèle, nous avons pu identifier avec précision comme «COVID-19 positif» dans 100% des cas.
  • Parmi les patients qui n'avaient pas de COVID-19 (véritables cas négatifs), en utilisant le modèle, nous avons pu identifier avec précision comme «COVID-19-négatif» dans seulement 80% des cas.

Comme le montre le graphique de l'historique d'entraînement, le réseau neuronal n'est pas recyclé, malgré la très petite taille des données d'entraînement:


Figure 3: Ce graphique de précision et de perte montre que notre modèle n'est pas recyclé.

C'est formidable d'avoir atteint une précision de 100% lors de la détection de COVID-19. Cependant, la situation avec des cas vraiment négatifs est embarrassante: nous ne voulons pas attribuer à «COVID-19-négatif» ceux qui sont réellement «COVID-19-positifs».

Nous voulons moins laisser les patients malades rentrer chez eux, dans leurs familles et amis, ce qui contribue à la propagation de la maladie.

Vous devez également être très prudent avec la part des cas de faux positifs: nous ne voulons pas considérer par erreur quelqu'un comme malade et le mettre en quarantaine avec d'autres patients afin qu'il en soit infecté .

Trouver un équilibre entre sensibilité et spécificité -une tâche extrêmement difficile , surtout en ce qui concerne la médecine, et surtout en ce qui concerne la propagation rapide des maladies infectieuses.

En parlant de vision par ordinateur médicale et d'apprentissage en profondeur, vous devez toujours vous rappeler que le travail de nos modèles prédictifs peut avoir des conséquences très graves: des diagnostics erronés peuvent coûter des vies .

Je le répète, les résultats de cet article sont présentés à des fins éducatives uniquement . Ce n'est pas une publication de revue, ces données ne répondent pas aux critères du TRÉPIED pour la publication des modèles de prévision.

Limitations, améliorations et travaux ultérieurs



Figure 4: Aujourd'hui, les professionnels de l'IA et du deep learning manquent de données COVID-19 de qualité pour former efficacement les systèmes de reconnaissance automatique d'images.

L'une des principales limites de la méthode décrite dans ce manuel concerne les données.

Nous ne disposons pas de suffisamment de données (fiables) pour former des détecteurs COVID-19.

Les hôpitaux ont déjà de nombreux antécédents de cas avec ce virus, mais compte tenu de la confidentialité et des droits de l'homme, il devient encore plus difficile d'assembler rapidement un ensemble de données de haute qualité à partir d'images médicales. Je pense qu'au cours des 12 à 18 prochains mois, nous aurons plus de données de qualité. Mais pour l'instant, vous devez utiliser ce que vous avez.

J'ai essayé (compte tenu de ma condition physique et mentale) dans des conditions de temps et de ressources limités d'écrire ce guide pour ceux qui sont intéressés par l'utilisation de la vision par ordinateur et de l'apprentissage profond. Mais permettez-moi de vous rappeler que je ne suis pas un médecin professionnel .

Afin d'utiliser le détecteur COVID-19 dans la vie réelle, il doit être rigoureusement testé par de vrais médecins travaillant main dans la main avec des spécialistes de l'apprentissage en profondeur. La méthode que j'ai décrite ne convient pas à cela.

De plus, il faut faire attention à ce que le modèle «apprend» exactement.

Comme je l'ai écrit dans le manuel Grad-CAM, il est probable que le modèle apprendra des modèles qui ne sont pas pertinents pour COVID-19, mais ne pourra distinguer que deux échantillons de données (c'est-à-dire des diagnostics positifs et négatifs). Les résultats de notre détecteur devront être rigoureusement testés et vérifiés par des médecins.

Enfin, les futurs détecteurs (et plus avancés) seront multimodaux.

Maintenant, nous utilisons uniquement des données visuelles (rayons X). De meilleurs détecteurs devraient utiliser d'autres données: indicateurs vitaux des patients, densité de population, situation géographique, etc. Les données visuelles seules ne sont généralement pas suffisantes pour de telles tâches .

Pour ces raisons, je tiens à souligner à nouveau: ce guide ne joue que le rôle de matériel de formation - il ne peut pas être considéré comme un détecteur COVID-19 fiable.

Si vous pensez que vous ou une personne proche de COVID-19, suivez les recommandations de votre système de santé.

J'espère que ce guide vous a été utile. J'espère également que ce sera pour quelqu'un un point de départ dans la recherche de méthodes d'utilisation de la vision par ordinateur et de l'apprentissage en profondeur pour déterminer automatiquement COVID-19.

Sommaire


Dans ce guide, vous avez appris à utiliser Keras, TensorFlow et le deep learning pour créer un détecteur automatique COVID-19 sur un jeu de données à partir d'images radiographiques.

Aujourd'hui (encore) il n'y a pas de jeux de données d'images de haute qualité et vérifiées pour cette maladie, vous devez donc travailler avec le référentiel Joseph Cohen :

  • Nous avons pris 25 images de son ensemble de données , nous limitant à la projection antéropostérieure de cas diagnostiqués positivement.
  • Ensuite, nous avons pris 25 photos de personnes en bonne santé à partir du jeu de données Kaggle Chest X-Ray Images (Pneumonia).

Puis, avec l'aide de Keras et TensorFlow, nous avons formé le détecteur COVID-19, qui a montré une précision de 90 à 92 % sur notre échantillon de test, avec une sensibilité de 100% et une spécificité de 80% (sur notre petit ensemble de données).

N'oubliez pas que le détecteur décrit ici est uniquement à des fins éducatives (voir la note dans le texte). Je voulais inspirer d'autres personnes à utiliser l'apprentissage en profondeur, pour montrer qu'en combinaison avec la vision par ordinateur, cela pouvait avoir un grand impact sur nos vies.

J'espère que vous avez aimé.

All Articles