اكتشف COVID-19 بالأشعة السينية باستخدام Keras و TensorFlow و Deep Learning


بمساعدة هذا الدليل ، بمساعدة Keras و TensorFlow والتعلم العميق ، سنتعلم كيفية تحديد COVID-19 تلقائيًا من مجموعة بيانات تم تجميعها يدويًا من صور الأشعة السينية.

مثل العديد من الآخرين ، أنا قلق بصدق حول COVID-19. لقد لاحظت أنني أحلل باستمرار حالتي وأتساءل عما إذا كنت سأصاب بالمرض ومتى سيحدث. وكلما زاد القلق بشأن ذلك ، كلما تحولت إلى لعبة مؤلمة للعقل ، حيث يتم دمج الأعراض مع hypochondria:

  • استيقظت في الصباح ، أشعر ببعض الألم والضعف.
  • عندما زحفت من السرير ، وجدت سيلان الأنف (على الرغم من أنه من المعروف بالفعل أن سيلان الأنف ليس من أعراض COVID-19).
  • في الوقت الذي وصلت فيه إلى الحمام لأحصل على وشاح ورقي ، كنت أصاب بالسعال بالفعل.

في البداية لم أكن اهتماما كبيرا به - لدي حساسية من حبوب اللقاح ، وبسبب الطقس الدافئ على الساحل الشرقي للولايات المتحدة ، كان هذا الربيع أوائل الربيع. على الأرجح ، هذه أعراض حساسية. ولكن خلال النهار لم تتحسن حالتي. أجلس وأكتب هذا الدليل مع مقياس حرارة في فمي. أنظر إلى الأسفل وأرى 37.4 درجة مئوية. درجة حرارة جسمي الطبيعية أقل بقليل من غيرها عند 36.3 درجة مئوية. كل شيء فوق 37.2 درجة مئوية هو بالفعل القليل من الحرارة بالنسبة لي.

سعال وحمى طفيفة؟ يمكن أن يكون COVID-19 ... أو حساسيتي فقط. من المستحيل أن تكتشف دون اختبار ، وهذا "الجهل" بالتحديد هو الذي يجعل الموقف مخيفًا جدًا على المستوى البشري.

دقيقة العناية UFO


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



, .

, , .

: |

على الرغم من مخاوفي ، أحاول التفكير بعقلانية. أنا فوق الثلاثين بقليل ، أنا في حالة جيدة ، وحصاني قوي. سأضع نفسي في الحجر الصحي (فقط في حالة) ، وأستريح وأتعامل مع كل شيء. لا يخيفني COVID-19 من وجهة نظر الصحة الشخصية (على الأقل سأقفها بنفسي).

لذلك ، أنا قلق بشأن أقاربي المسنين ، بما في ذلك جميع أولئك الذين تم تشخيصهم بالفعل بالمرض ، وكذلك أولئك الذين هم في دور رعاية المسنين والمستشفيات. هؤلاء الناس ضعفاء ، وسيكون الأمر فظيعًا إذا ماتوا بسبب COVID-19.

بدلاً من عدم فعل أي شيء وترك مرضي يبقيني في المنزل (سواء كان ذلك الحساسية أو COVID-19 أو مخاوفي) ، قررت أن أفعل ما بوسعي:سأكتب الشفرة ، وأجري التجارب ، وباستخدام أمثلة عملية ، سأعلم الآخرين كيفية استخدام رؤية الكمبيوتر والتعلم العميق .

يجب أن أقول على الفور أن هذه ليست أكثر المقالات العلمية التي كتبها. إنها ليست علمية على الإطلاق. الأساليب ومجموعات البيانات المستخدمة لا تستحق النشر. لكنها تعمل كنقطة انطلاق لأولئك الذين يريدون على الأقل شيء للمساعدة.

أنا قلق عليك وعلى هذا المجتمع. أريد أن أساعد ما أستطيع: هذه المقالة هي طريقي للتعامل عقليًا مع الأوقات الصعبة ، بينما أساعد الآخرين في موقف مماثل.

ستتعلم في هذا الدليل:

  1. كيفية جمع مجموعة بيانات مفتوحة المصدر لصور الأشعة السينية للمرضى الذين تم الكشف عن COVID-19.
  2. «» ( ) .
  3. COVID-19 .
  4. .

ملاحظة: لقد ألمح بالفعل إلى هذا ، ولكن الآن سأقول مباشرة. التقنيات الموضحة هنا للأغراض التعليمية فقط. هذه ليست دراسة علمية صارمة ، ولن يتم نشرها في المجلات. هذه المقالة مخصصة للقراء المهتمين برؤية الكمبيوتر والتعلم العميق ، والذين يرغبون في التعلم عمليًا ، وكذلك لأولئك المستوحين من الأحداث الجارية. أطلب منك أن تأخذ كل هذا في الاعتبار.

في الجزء الأول من الدليل ، سنناقش كيفية الكشف عن COVID-19 في الأشعة السينية للرئة. ثم نناقش مجموعة البيانات نفسها. ثم سأوضح كيفية تدريب النموذج باستخدام Keras و TensorFlow للتنبؤ بـ COVID-19 في صورنا.

تفسير


تمت كتابة مقالة الكشف التلقائي COVID-19 للأغراض التعليمية فقط. انها لا تصف نظام التشخيص موثوقة ودقيقة COVID-19، لم يتم اختباره ولا من المهنية ولا من جهة نظر أكاديمية.

هدفي هو إلهامك وإظهار كيف أن دراسة رؤية الكمبيوتر والتعلم العميق مع التطبيق اللاحق لهذه المعرفة في المجال الطبي يمكن أن يكون لها تأثير كبير على العالم.

تخيل أنك لست بحاجة إلى تعليم طبي للتأثير على الطب . يعمل ممارسو التدريب العميق اليوم بشكل وثيق مع الأطباء والأطباء الآخرين في حل المشاكل المعقدة ، وإنقاذ الأرواح وجعل العالم مكانًا أفضل.

آمل أن تلهمك قيادتي للقيام بذلك.

ولكن بالنظر إلى كل ما سبق ، فإن الباحثين ومنسقي المجلات ونظام المراجعة مثقلون بالفعل بالأعمال التي تصف نماذج التنبؤ COVID-19 ذات الجودة المريبة. يرجى عدم إرسال الرمز والنموذج من هذه المقالة إلى مجلة أو بعض المنشورات العلمية - ستزيد فقط من الفوضى .

علاوة على ذلك ، إذا كنت ترغب في إجراء بحث على أساس هذه المقالة (أو أي منشور آخر حول COVID-19) ، فالتزم بدليل TRIPOD لوصف النماذج التنبؤية.

كما تفهم ، يمكن أن يكون لاستخدام الذكاء الاصطناعي في المجال الطبي عواقب وخيمة للغاية. انشر هذه النماذج واستخدمها فقط إذا كنت متخصصًا طبيًا أو إذا تم إبلاغك بالتفصيل من قبل هؤلاء المتخصصين.

كيف يمكن الكشف عن COVID-19 في الأشعة السينية؟



الشكل 1: مثال الأشعة السينية لمريض تم تشخيصه بـ COVID-19. في هذه الصور ، يمكنك تعليم المصنف باستخدام Keras و TensorFlow لتحديد COVID-19.

اختبار COVID-19 صعب الآن - لا توجد اختبارات كافية ، ولكن من المستحيل إنتاجها بسرعة ، مما يزيد من الذعر فقط. وفي حالة من الذعر ، هناك الأوغاد الذين يحاولون الاستفادة من الآخرين وبيع اختبارات مزيفة على COVID-19 ، يجدون أنفسهم ضحايا غير مرتكبين في الشبكات الاجتماعية والمراسلات الفورية.

نظرًا للعدد المحدود من الاختبارات ، نحتاج إلى الاعتماد على طرق التشخيص الأخرى.

قررت دراسة الأشعة السينية ، لأن الأطباء غالبًا ما يستخدمونها ونتائج التصوير المقطعي المحوسب لتشخيص الالتهاب الرئوي والتهاب الرئة والخراجات وتضخم الغدد الليمفاوية. بما أن الفيروس يهاجم الخلايا الظهارية التي تبطن الجهاز التنفسي ، فيمكننا استخدام الأشعة السينية لدراسة حالة الرئة البشرية. وبما أن أجهزة الأشعة السينية موجودة في كل مكان تقريبًا ، باستخدام الصور ، يمكنك اكتشاف COVID-19 بدون مجموعات اختبار.

تشمل عيوب الطريقة الحاجة إلى أطباء الأشعة ، بالإضافة إلى وقت معالجة كبير. والوقت مكلف بشكل خاص عندما يكون الناس مرضى في جميع أنحاء العالم. ولتوفير وقت الأطباء ، تحتاج إلى إنشاء نظام تحليل تلقائي .

ملحوظة: , , COVID-19 . . , , , , COVID-19, .

COVID-19



الشكل 2: على اليسار صور لأشخاص بنتيجة إيجابية (مصابة) ، على اليمين - بنتائج سلبية. في هذه الصور ، سنقوم بتعليم النموذج باستخدام TensorFlow و Keras للتنبؤ تلقائيًا بوجود COVID-19 (أي مرض ناتج عن الفيروس التاجي).

تم تجميع مجموعة بيانات صور المرضى المستخدمة مع COVID-19 المستخدمة هنا تحت إشراف الدكتور جوزيف كوهين ، وهو طالب دراسات عليا في جامعة مونتريال. منذ بضعة أيام ، بدأ كوهين في جمع صور الأشعة السينية للمرضى الذين يعانون من COVID-19 وتحميلها إلى مستودع GitHub. هناك ستجد أمثلة ليس فقط لهذا المرض ، ولكن أيضًا لمتلازمة الشرق الأوسط التنفسية و السارس و ARDS.

لإنشاء مجموعة بيانات I:

  1. تحليل ملف metadata.csv من المستودع.
  2. تم تحديد جميع الخطوط:

في المجموع ، تم الحصول على 25 طلقة مع نتائج إيجابية على COVID-19 ( الشكل 2 ، اليسار ).

اختر الآن صور الأشخاص الأصحاء.

للقيام بذلك ، أخذت مجموعة بيانات الرئة بالأشعة السينية Kaggle (الالتهاب الرئوي) واخترت 25 صورة للأشخاص الأصحاء ( الشكل 2 ، على اليمين ). تحتوي مجموعة البيانات هذه على عدد من العيوب ، بما في ذلك التسميات المعبئة بشكل سيئ أو غير صحيح ، ولكنها مناسبة كنقطة بداية لاختبار فرضية كاشف COVID-19.

ونتيجة لذلك ، حصلت على 50 جرعة: 25 مريضًا باستخدام COVID-19 و 25 بصحة جيدة. يمكنك تنزيل مجموعة البيانات من الرابط. بالإضافة إلى ذلك ، أضفت نصوص Python التي أنشأت مجموعة البيانات بها ، ولكن في هذه المقالة لم أعتبرها.

هيكل المشروع


تنزيل الكود والبيانات. اسحب الملفات من هناك ، وستحصل على بنية الدليل التالية:

$ 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

ثلاثة أدلة وخمسة ملفات. تقع مجموعة البيانات في دليل / مجموعة البيانات وتنقسم إلى فئتين - غشاء / وعادي /. أدناه نلقي نظرة على البرنامج النصي train_covid19.py الذي يدرب كاشف COVID-19.

تنفيذ برنامج التدريب


دعنا ننتقل إلى تحسين الشبكة العصبية التلافيفية ، والتي ستشخص تلقائيًا COVID-19 باستخدام Keras و TensorFlow والتعلم العميق.

افتح ملف train_covid19.py والصق الرمز التالي:

# 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

يستفيد هذا البرنامج النصي من مكتبات TensorFlow 2.0 و Keras من خلال تحديد عمليات استيراد tensorflow.keras. كما نستخدم:


لمعرفة كيفية تثبيت TensorFlow 2.0 (بما في ذلك scikit-learn و OpenCV و matplotlib) ، تحقق من برامجي التعليمية لـ Ubuntu أو macOS .

الآن نقوم بتحليل الحجج لسطر الأوامر وتهيئة المعلمات الزائدة:

# 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

تتضمن حجج سطر الأوامر الثلاثة ( السطور 24-31 ) ما يلي:

  • --dataset: المسار إلى مجموعة بيانات الإدخال.
  • --plot: مسار اختياري لجدول الخروج من سجل التعلم. بشكل افتراضي ، يسمى الرسم البياني plot.png ما لم يتم تحديد اسم مختلف في سطر الأوامر.
  • --model: مسار اختياري لنموذج تعريف COVID-19 الناتج. بشكل افتراضي ، يطلق عليه covid19.model.

الآن نقوم بتهيئة تردد التعلم الأولي ، وعدد فترات التدريب ، والمعلمات المفرطة لحجم الحزمة ( السطور 35-37 ).

بعد ذلك ، قم بتنزيل الأشعة السينية ومعالجتها مسبقًا:

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

لتحميل البيانات ، نأخذ جميع المسارات إلى الصور في دليل مجموعة البيانات ( السطر 42 ) ، ثم لكل imagePath:

  • نستخرج من المسار ( السطر 49 ) تسمية الفئة (غشاء أو عادي).
  • نقوم بتحميل الصورة ، وتحويلها إلى قنوات RGB وتقليل حجمها إلى 224 × 224 بكسل لتغذية الشبكة العصبية التلافيفية ( السطور 53-55 ).
  • تحديث قوائم البيانات والملصقات ( السطران 58 و 59 ).

ثم نقيس كثافة البكسل في نطاق [0, 1]ونحول البيانات والتسميات إلى تنسيق صفيف NumPy ( السطران 63 و 64 ).

بعد ذلك ، سنجري ترميزًا ساخنًا واحدًا لملصقاتنا ونقسم مجموعة البيانات إلى مجموعات تدريب واختبار:

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

يتم تنفيذ ترميز الملصق الوحدوي في السطور 67-69 : سيتم تقديم البيانات بهذا التنسيق:

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

يتكون كل ملصق مشفر بهذه الطريقة من صفيف من عنصرين ، يكون أحد العناصر فيه "حار" (1) والثاني هو "لا" (0). في السطرين 73 و 74 ، تنقسم مجموعة البيانات إلى قسمين: 80٪ للتدريب ، 20٪ للاختبار.

لتعميم النموذج ، نقوم بتوسيع البيانات (زيادة البيانات) ، ونقوم بتعيين تدوير عشوائي للصورة بمقدار 15 درجة في اتجاه عقارب الساعة أو مواجهته. تتم تهيئة كائن إنشاء الملحقات على الأسطر 77-79 .

الآن قم بتهيئة نموذج VGGNet وقم بإعداده للضبط الدقيق :

# 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

في السطور 83 و 84 ، يتم إنشاء مثيل للشبكة العصبية VGG16 باستخدام الأوزان التي تم الحصول عليها مسبقًا على ImageNet بدون طبقة متصلة بالكامل.

بعد ذلك ، سننشئ طبقة متصلة بالكامل تتكون من POOL => FC = طبقات SOFTMAX ( الخطوط 88-93 ) ونضعها فوق VGG16 ( الخط 97 ).

قم الآن بتجميد أوزان CONV بحيث يتم تدريب طبقة متصلة بالكامل فقط ( الخطوط 101-102 ). هذا ينتهي الضبط.

نحن الآن على استعداد لتجميع وتدريب نموذج التعلم العميق الخاص بنا:

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

في السطور 106-108 تم تجميع تدريب سرعة التوهين على الشبكة والمحسن آدم. بالنظر إلى أن هذه مهمة تصنيف من فئتين ، فإننا نستخدم وظيفة الخسارة ثنائية الإنتروبيا الثنائية (binary_crossentropy) ، وليس الإنتروبيا القاطعة (الأنتروبيا الفئوية).

لبدء التدريب ، نسمي Keras-method fit_generator ونمنحه الأشعة السينية من خلال امتداد كائن البيانات ( السطور 112-117 ).

الآن دعونا نقيم النموذج:

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

للقيام بذلك ، نقوم أولاً بالتنبؤ بناءً على مجموعة الاختبار ونحصل على مؤشرات التنبؤ ( البنود 121-125 ). ثم سننشئ ونعرض تقرير التصنيف ( السطران 128 و 129 ) باستخدام الأداة المساعدة للتعلم .

الآن دعونا نحسب مصفوفة الارتباك للتقدير الإحصائي المستقبلي:

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

نحن هنا:

  • إنشاء مصفوفة من عدم الدقة ( السطر 133 ) ،
  • نستخدم هذه المصفوفة لتحديد الدقة والحساسية والخصوصية ( البنود 135-137 ) ، ثم نستمد جميع هذه المقاييس ( البنود 141-143 ).

ثم ، من أجل التحليل اللاحق ، نعرض في شكل رسم بياني في ملف تاريخ التغييرات في الدقة والخسائر:

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

وأخيرًا ، نقوم بتسلسل نموذج مصنف tf.keras إلى القرص:

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

ندرب كاشفنا مع Keras و TensorFlow


بعد تنفيذ البرنامج النصي train_covid19.py ، يمكننا تدريب الكاشف التلقائي.

قم بتنزيل شفرة المصدر ومجموعة البيانات والنموذج المدربين مسبقًا. افتح نافذة طرفية وقم بتشغيل الأمر لتدريب الكاشف:

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

التشخيص التلقائي للأشعة السينية


ملاحظة: في هذا الجزء لا "نحل" مشكلة تحديد COVID-19. هو مكتوب في سياق الوضع الحالي ولأغراض تعليمية فقط. هذا مثال على التطبيق العملي للرؤية الحاسوبية والتعلم العميق ، حتى تشعر بالراحة مع المقاييس المختلفة ، بما في ذلك الدقة والحساسية والخصوصية المعتادة (والمفاضلات التي يجب مراعاتها عند العمل مع البيانات الطبية). أكرر ، نحن لا نحل مشكلة تحديد COVID-19.

لذلك ، أظهر كاشفنا التلقائي دقة ~ 90-92٪ على عينات منصور الأشعة السينية وحدها . تم استخدام أية معلومات أخرى لتدريب نموذج، بما في ذلك الموقع الجغرافي والكثافة السكانية، وما إلى ذلك

تلقينا أيضاحساسية من 100٪ و خصوصية 80٪ ، وهو ما يعني:

  • من المرضى مع COVID-19 (الحالات الإيجابية الحقيقية)، وذلك باستخدام النموذج، كنا قادرين على تحديد بدقة "COVID 19 ايجابية" في 100٪ من الحالات.
  • من بين المرضى الذين لم يكن لديهم COVID-19 (الحالات السلبية الحقيقية) ، باستخدام النموذج ، تمكنا من التعرف بدقة على أنه "COVID-19-السلبي" في 80٪ فقط من الحالات.

كما يوضح الرسم البياني لسجل التدريب ، لا يتم إعادة تدريب الشبكة العصبية ، على الرغم من الحجم الصغير جدًا لبيانات التدريب:


الشكل 3: يوضح الرسم البياني للدقة والخسارة أن نموذجنا لم تتم إعادة تدريبه.

من الرائع أننا حققنا دقة 100٪ عند اكتشاف COVID-19. ومع ذلك ، فإن الوضع مع الحالات السلبية حقًا أمر محرج: لا نريد أن نعزو إلى "COVID-19-السلبية" أولئك الذين هم في الواقع "COVID-19-إيجابي".

نرغب على الأقل في السماح للمرضى المرضى بالعودة إلى منازلهم ، إلى العائلات والأصدقاء ، مما يساهم في زيادة انتشار المرض.

أنت بحاجة أيضًا إلى توخي الحذر الشديد فيما يتعلق بنصيب الحالات الإيجابية الكاذبة: لا نريد أن نحسب شخصًا بطريق الخطأ كمريض وأن نعزله مع مرضى آخرين حتى يصاب به .

إيجاد توازن بين الحساسية والخصوصية -مهمة صعبة للغاية ، خاصة عندما يتعلق الأمر بالطب ، وخاصة عندما يتعلق الأمر بالانتشار السريع للأمراض المعدية.

بالحديث عن رؤية الكمبيوتر الطبية والتعلم العميق ، يجب أن تتذكر دائمًا أن عمل نماذجنا التنبؤية يمكن أن يكون لها عواقب وخيمة للغاية: التشخيص الخاطئ يمكن أن يكلف الأرواح .

أكرر ، يتم عرض النتائج في هذه المقالة لأغراض تعليمية فقط . هذه ليست نشرة مجلة ، هذه البيانات لا تفي بمعايير TRIPOD لنشر نماذج التنبؤ.

القيود والتحسينات والمزيد من العمل



الشكل 4: تفتقر منظمة العفو الدولية ومتخصصو التعلم العميق اليوم إلى بيانات COVID-19 عالية الجودة لتدريب أنظمة التعرف التلقائي على الصور بفعالية.

البيانات هي أحد القيود الرئيسية للطريقة الموضحة في هذا الدليل.

ليس لدينا ما يكفي من البيانات (الموثوقة) لتدريب كواشف COVID-19.

لدى المستشفيات بالفعل العديد من تواريخ الحالات مع هذا الفيروس ، ولكن نظرًا للخصوصية وحقوق الإنسان ، يصبح من الصعب تجميع مجموعة بيانات عالية الجودة بسرعة من الصور الطبية. أعتقد أنه في الأشهر الـ 12 إلى الـ 18 المقبلة سيكون لدينا المزيد من البيانات عالية الجودة. ولكن في حين أنه من الضروري استخدام ما هو.

حاولت (بالنظر إلى حالتي الجسدية والعقلية) في ظروف الوقت والموارد المحدودة لكتابة هذا الدليل لأولئك الذين يرغبون في استخدام رؤية الكمبيوتر والتعلم العميق. لكن دعني أذكرك بأنني لست طبيبا محترفا .

من أجل استخدام كاشف COVID-19 في الحياة الواقعية ، يجب اختباره بدقة من قبل أطباء حقيقيين يعملون جنبًا إلى جنب مع متخصصي التعلم العميق. الطريقة التي وصفتها ليست مناسبة لذلك.

علاوة على ذلك ، يجب على المرء توخي الحذر بشأن ما يتعلمه النموذج بالضبط.

كما كتبت في دليل Grad-CAM، من المحتمل أن يتعلم النموذج أنماطًا غير ذات صلة بـ COVID-19 ، ولكن يمكنه فقط التمييز بين عينتي بيانات (أي التشخيص الإيجابي والسلبي). ستحتاج نتائج كاشفنا إلى اختبارها وفحصها بدقة من قبل الأطباء.

وأخيرًا ، ستكون أجهزة الكشف المستقبلية (والأكثر تقدمًا) متعددة الوسائط.

الآن نستخدم البيانات المرئية فقط (الأشعة السينية). يجب أن تستخدم أجهزة الكشف الأفضل بيانات أخرى: المؤشرات الحيوية للمريض ، والكثافة السكانية ، والموقع الجغرافي ، وما إلى ذلك. البيانات المرئية وحدها لا تكفي عادة لمثل هذه المهام .

لهذه الأسباب ، أود التأكيد مرة أخرى: لا يلعب هذا الدليل سوى دور مواد التدريب - لا يمكن اعتباره كاشف COVID-19 موثوقًا به.

إذا كنت تعتقد أنك أو شخص قريب من COVID-19 ، فاتبع توصيات نظام الرعاية الصحية الخاص بك.

آمل أن يكون هذا الدليل مفيدًا لك. آمل أيضًا أن تكون نقطة بداية لشخص ما في البحث عن طرق استخدام رؤية الكمبيوتر والتعلم العميق لتحديد COVID-19 تلقائيًا.

ملخص


في هذا الدليل ، تعلمت كيفية استخدام Keras و TensorFlow والتعلم العميق لإنشاء كاشف أوتوماتيكي COVID-19 على مجموعة بيانات من صور الأشعة السينية.

اليوم (حتى الآن) لا توجد مجموعات بيانات صور عالية الجودة وموثقة لهذا المرض ، لذلك عليك العمل مع مستودع جوزيف كوهين :

  • أخذنا 25 صورة من مجموعة بياناته ، وقصرنا أنفسنا على الإسقاط الأمامي الخلفي للحالات المشخصة بشكل إيجابي.
  • ثم التقطنا 25 صورة لأشخاص أصحاء من مجموعة بيانات Kaggle Chest Chest X-Ray (الالتهاب الرئوي).

ثم بمساعدة Keras و TensorFlow ، قمنا بتدريب كاشف COVID-19 ، والذي أظهر دقة 90-92٪ في عينة الاختبار لدينا ، مع حساسية 100٪ وخصوصية 80٪ (في مجموعة البيانات الصغيرة).

تذكر أن الكاشف الموضح هنا للأغراض التعليمية فقط (انظر الملاحظة في النص). كنت أرغب في إلهام الآخرين لاستخدام التعلم العميق ، لأثبت أنه بالاشتراك مع رؤية الكمبيوتر يمكن أن يكون له تأثير كبير على حياتنا.

اتمنى ان تكون قد استمتعت به.

All Articles