Model CNN Untuk Mendeteksi COVID-19 – Menuju AI – Teknologi, Sains, dan Teknik Terbaik

Penulis: Tarishi Singh

Pembelajaran Mendalam

Membangun model CNN dengan API untuk menampilkan COVID-19 positif dan normal melalui pemindaian Radiografi Dada PA.

Foto oleh Fusion Medical Animation di Unsplash

pengantar

Penyakit COVID-19 adalah penyakit menular dan menular yang disebabkan oleh virus korona yang baru ditemukan. Orang biasanya merasakan demam sedang, batuk, kelelahan, masalah pernapasan, dan nyeri sendi. Tapi, ini tidak cukup untuk mendiagnosis penyakit ini. Individu yang berbeda juga menunjukkan gejala yang berbeda.

Banyak model prediksi wabah untuk COVID-19 digunakan oleh otoritas terkait, dan keputusan yang diinformasikan dan direncanakan dibuat berdasarkan prediksi tersebut. Namun, karena tingkat ketidakpastian yang tinggi dan kurangnya data penting, model standar menunjukkan akurasi yang rendah. Karena COVID-19 memiliki sifat gejala yang sangat kompleks, bergantung sepenuhnya pada hasil tes individu menjadi sangat menantang.

Set data # 1

Menggunakan total 192 gambar dari ‘covid-chestxray-dataset’, memisahkannya menjadi ‘train’ dan ‘test’ di file ‘train_path’ dan ‘val_path’, masing-masing. Memiliki 96 gambar yang masing-masing dibagi dalam “COVID ‘dan’ Normal ‘.

! unrar x CovidDataset.rar ? dl = 0 TRAIN_PATH = “CovidDataset / Train” VAL_PATH = “CovidDataset / Test”

Gambar sampel:

Ara. [1] Rontgen dada normalAra. [2] Rontgen Dada COVID-19

# 2 Mengimpor perpustakaan

Mengimpor beberapa pustaka penting untuk membangun model.

import numpy as np import matplotlib.pyplot as plt import keras from keras.layers import * from keras.models import * from keras.preprocessing import image

# 3 Membangun Model

Model ini mengambil input gambar 224 × 224 dan mengikuti aliran CNN standar. Menambahkan beberapa lapisan lapisan konvolusional, lapisan aktivasi, meratakan lapisan dengan lapisan dropout untuk mencegah overfitting.

model = Sequential ()
model.add (Conv2D (32, kernel_size = (3,3), activation = ‘relu’, input_shape = (224,224,3)))
model.add (Konv2D (64, (3,3), aktivasi = ‘relu’))
model.add (MaxPooling2D (ukuran_koleksi = (2,2)))
model.add (Dropout (0.25)) model.add (Konv2D (64, (3,3), aktivasi = ‘relu’))
model.add (MaxPooling2D (ukuran_koleksi = (2,2)))
model.add (Dropout (0.25)) model.add (Konv2D (128, (3,3), aktivasi = ‘relu’))
model.add (MaxPooling2D (ukuran_koleksi = (2,2)))
model.add (Dropout (0.25)) model.add (Ratakan ())
model.add (Padat (64, aktivasi = ‘relu’))
model.add (Putus Sekolah (0,5))
model.add (Dense (1, activation = ‘sigmoid’)) model.compile (loss = keras.losses.binary_crossentropy, optimizer = ‘adam’, metrics =[‘accuracy’])

Ringkasan model dapat ditunjukkan oleh:

model.summary () Model: “sequential” _________________________________________________________________ Layer (tipe) Parameter Bentuk Output # =============================== ================================== konv2d (Konv2D) (Tidak ada, 222, 222, 32) 896 _________________________________________________________________ konv2d_1 (Conv2D) (Tidak ada, 220, 220, 64) 18496 _________________________________________________________________ max_pooling2d (MaxPooling2D) (Tidak ada, 110, 110, 64) 0 _________________________________________________________________ putus sekolah (Putus Sekolah) (Tidak ada, 110, 110, 64) 0 _________________________________________________________________ konv2d_2 (Konv2D) (Tidak ada , 108, 108, 64) 36928 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (Tidak ada, 54, 54, 64) 0 _________________________________________________________________ putus sekolah_1 (Putus sekolah) (Tidak ada, 54, 54, 64) 0 _________________________________________________________________ konv2d_3 (Konv2D) (Tidak ne, 52, 52, 128) 73856 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (Tidak ada, 26, 26, 128) 0 _________________________________________________________________ putus sekolah_2 (Putus sekolah) (Tidak ada, 26, 26, 128) 0 _________________________________________________________________ rata (Ratakan) (Tidak ada, 86528) 0 _________________________________________________ padat (Padat) (Tidak ada, 64) 5537856 _________________________________________________________________ putus sekolah_3 (Putus sekolah) (Tidak ada, 64) 0 _________________________________________________________________ padat_1 (Padat) (Tidak ada, 1) 65 ================== =============================================== Parameter total: 5.668.097
Paramedis yang bisa dilatih: 5.668.097
Parameter yang tidak bisa dilatih: 0 _________________________________________________________________

Untuk mendapatkan versi diagram:

dari tensorflow.keras.utils impor plot_model
plot_model (model)
Ara. [3] Penggambaran berbagai lapisan

# 4 Pelatihan dan Validasi Model

Sebelum pelatihan, pemrosesan gambar dilakukan. Gambar 224 × 224 diubah ukurannya, disesuaikan dalam ketajaman, diperbesar, dan dibalik secara horizontal, serta dibagi menjadi 32 ukuran tumpukan.

# Melatih
train_datagen = image.ImageDataGenerator (
skala ulang = 1./255,
shear_range = 0,2,
zoom_range = 0,2,
horizontal_flip = Benar,)
test_dataset = image.ImageDataGenerator (skala ulang = 1. / 255) train_generator = train_datagen.flow_from_directory (‘CovidDataset / Train’,
target_size = (224.224),
batch_size = 32,
class_mode = ‘binary’)

Model divalidasi dari direktori ‘CovidDataset / Val’ dengan 10 epochs, 6 per step menghasilkan loss 0.1404, akurasi 0.9531, kehilangan validasi 0.1182, dan akurasi validasi 0.9531.

validation_generator = test_dataset.flow_from_directory (
‘CovidDataset / Val’,
target_size = (224.224),
batch_size = 32,
class_mode = ‘binary’) hist = model.fit_generator (
train_generator,
steps_per_epoch = 6,
zaman = 10,
validation_data = validation_generator,
validation_steps = 2)

Output dari fase pelatihan:

Kerugian dan akurasi dengan setiap zaman

# 5 Visualisasi dan Evaluasi Model

Visualisasi merupakan langkah penting karena membantu kami mengevaluasi kinerja model secara holistik. Petak utama untuk evaluasi adalah akurasi dan kerugian.

Angka [4] dan [5] menunjukkan akurasi dan kerugian sesuai dengan masing-masing periode pelatihan dan validasi. Akurasi model bervariasi dengan jumlah epoch dan juga karena regularisasi yang dilakukan oleh metode dropout. Ketika jumlah epoch meningkat secara konsekuen, akurasi meningkat, dan dengan demikian, persen kerugian menurun. Model mendapatkan akurasi tertinggi yang dapat dicapai tanpa overfitting, pelatihan dihentikan setelah delapan periode, dan di bawah titik ini, akurasi klasifikasi yang diukur adalah 96%. Setelah itu, kerugian validasi dan pelatihan mulai rata, dan kesenjangan kerugian meningkat di antara keduanya.

plt.figure (figsize = (13,7))
plt.plot (hist.history[“accuracy”])
plt.plot (hist.history[“val_accuracy”])
plt.title (“Akurasi Model”)
plt.ylabel (“Akurasi”)
plt.xlabel (“Epoch”)
plt.legend ([“Train”, “Test”], loc = “kiri atas”)

Potongan kode di atas adalah untuk grafik ‘akurasi vs. epoch’. Seperti yang dipamerkan, akurasi meningkat dengan setiap epoch yang membuktikan performa yang baik.

Ara. [4] Akurasi VS Gambar Epochplt. (Figsize = (13,7))
plt.plot (hist.history[“loss”])
plt.plot (hist.history[“val_loss”])
plt.title (“Model Loss”)
plt.ylabel (“Rugi”)
plt.xlabel (“Epoch”)
plt.legend ([“Train”, “Test”], loc = “kiri atas”)

Potongan kode di atas adalah untuk plot untuk menampilkan Kerugian model dengan setiap epoch. Grafik di bawah ini menunjukkan penurunan kerugian dengan setiap epoch.

Ara. [5] Rugi VS Waktu

# 6 Confusion Matrix

Matriks konfusi untuk prediksi COVID-19 dan kondisi Normal untuk citra scan dada. Ini mewakili sebagian kecil kesalahan klasifikasi untuk kedua kategori. Di sini terlihat bahwa citra dada kategori Normal diklasifikasikan dengan benar dengan akurasi 95%. Padahal COVID-19 salah diklasifikasikan dalam beberapa kasus. Saat ini diklasifikasikan dengan persentase 90. Hal ini disebabkan sedikitnya jumlah sampel pelatihan untuk kelas tersebut. Secara keseluruhan, dapat dikatakan bahwa itu adalah akurasi yang layak untuk klasifikasi.

impor mereka
f, ax = plt.subplots (figsize = (6,6))
sns.heatmap (cm, annot = True, linewidths = 0.3, cmap = “Blues”, annot_kws = {“size”: 18}, linecolor = “black”, fmt = “.0f”, ax = ax)
plt.xlabel (“Prediksi”)
plt.title (“Confusion Matrix”)
plt.ylabel (“Benar”)
plt.show ()
Ara. [6] Confusion Matrix

Berdasarkan matriks kebingungan, menghitung presisi, perolehan, dan skor f1 untuk setiap kelas gambar dada. Itu diwakili dalam Tabel di bawah ini

presisi mengingat dukungan f1-skor

0 0,99 0,94 0,96 96
1 0,94 0,99 0,96 96

akurasi 0,96 192
makro rata-rata 0,96 0,96 0,96 192
rata-rata tertimbang 0,96 0,96 0,96 192

# 7 API

API dibuat sedemikian rupa sehingga membutuhkan masukan rontgen dada dari pengguna dan memeriksa kondisi dada berdasarkan gambar masukan menggunakan model terlatih dengan lapisan tambahan. API dibuat dalam bahasa Python menggunakan pustaka Tflite, Pillow, TensorFlow, dan Pyinstaller pada alat JupyterLab.

Ara. [7] Deteksi Positif COVID-19Ara. [8] Deteksi Normal COVID-19

Penafian: Sebagai kesimpulan, saya ingin menyebutkan bahwa model ini hanya untuk tujuan penelitian di bidang pembelajaran mesin dan tidak diperhitungkan sebagai diagnosis medis resmi. Untuk informasi lebih lanjut tentang virus corona, kunjungi situs web resmi WHO.

Model CNN Untuk Mendeteksi COVID-19 awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.

Diterbitkan melalui Towards AI