COVID-19 X-Ray Detection using Keras
In this blog, we will detect whether the X-Ray is of a COVID-19 patient or a Normal patient using Keras module in Python. It is a binary image classification task. We will use Kaggle Dataset for the model training.
So, let’s dive into it.
Code
We would be importing all the necessary libraries for our model.
import os from keras.layers import Dense,Dropout,Conv2D,MaxPool2D,Flatten,GlobalAveragePooling2D from keras.models import Model from keras.preprocessing import image from keras.preprocessing.image import ImageDataGenerator from keras.optimizers import Adam import matplotlib.pyplot as plt
Now, we will do the preprocessing of the data. We will do it using the Keras ImgeDataGenerator. Also, we are going to do the Data Augmentation task such as Zoom, Width, and Horizontal shift, etc to avoid overfitting of the Data. We will make the image size to (150,150) and class model to categorical as we have 2 classes.
train=ImageDataGenerator(rescale=1/255.0, rotation_range=20, shear_range=0.4, zoom_range=0.1, horizontal_flip=True) training=train.flow_from_directory( "xray_dataset_covid19/train", target_size=(150,150), class_mode="categorical" ) testing=ImageDataGenerator(rescale=1/255.0) testing=train.flow_from_directory( "xray_dataset_covid19/test", target_size=(150,150), class_mode="categorical" )
OUTPUT: Found 148 images belonging to 2 classes. Found 40 images belonging to 2 classes.
From the output we can see that very few images are there to train our model, so we have used Data Augmentation.
We can plot some images to see how the normal X-Ray Scan looks like, for that matplotlib is used.
image=os.listdir("xray_dataset_covid19/train/NORMAL") for i in imag[:5]: x=os.path.join("xray_dataset_covid19/train/NORMAL",i) img=image.load_img(x) img=image.img_to_array(img)/255.0 plt.imshow(img) plt.axis("off") plt.show()
- Similarly, we can also see the Covid-19 X-Ray Scans.
image=os.listdir("xray_dataset_covid19/train/PNEUMONIA") for i in imag[:5]: x=os.path.join("xray_dataset_covid19/train/PNEUMONIA",i) img=image.load_img(x) img=image.img_to_array(img)/255.0 plt.imshow(img) plt.axis("off") plt.show()
We will use the Sequential model with layers as Convolutional, Maxpooling, Flatten, and Dropouts to reduce overfitting.
The shape of the image passed is (150,150,3) as we have changed the size of the image to 150,150 and 3 is the number of channels as it is the colored image and has 3 channels RGB.
We will use Relu activations for the hidden layers and Sigmoid for the output layer.
NOTE: Sigmoid is better activation function than Softmax in Binary classification.
model=Sequential() model.add(Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3))) model.add(MaxPool2D(2,2)) model.add(Conv2D(32,(3,3),activation='relu')) model.add(MaxPool2D(2,2)) model.add(Flatten()) model.add(Dense(2,activation='sigmoid')) model.summary()
OUTPUT: Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 148, 148, 32) 896 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 74, 74, 32) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 72, 72, 32) 9248 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 36, 36, 32) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 41472) 0 _________________________________________________________________ dense_1 (Dense) (None, 2) 82946 ================================================================= Total params: 93,090 Trainable params: 93,090 Non-trainable params: 0
Now we will compile our model by using Adam as the Optimizer and Binary loss entropy as the loss.
model.compile(optimizer="Adam",loss="binary_crossentropy",metrics=['accuracy'])
Finally, we will train the model on the given dataset for 15 epochs.
his=model.fit_generator(training,epochs=15)
OUTPUT: Epoch 1/15 5/5 [==============================] - 9s 2s/step - loss: 0.6921 - accuracy: 0.6284 Epoch 2/15 5/5 [==============================] - 8s 2s/step - loss: 0.5085 - accuracy: 0.8311 Epoch 3/15 5/5 [==============================] - 8s 2s/step - loss: 0.3829 - accuracy: 0.8784 Epoch 4/15 5/5 [==============================] - 8s 2s/step - loss: 0.3050 - accuracy: 0.8851 Epoch 5/15 5/5 [==============================] - 8s 2s/step - loss: 0.2834 - accuracy: 0.8784 Epoch 6/15 5/5 [==============================] - 8s 2s/step - loss: 0.2267 - accuracy: 0.8986 Epoch 7/15 5/5 [==============================] - 8s 2s/step - loss: 0.2401 - accuracy: 0.8851 Epoch 8/15 5/5 [==============================] - 8s 2s/step - loss: 0.1965 - accuracy: 0.9257 Epoch 9/15 5/5 [==============================] - 8s 2s/step - loss: 0.1687 - accuracy: 0.9392 Epoch 10/15 5/5 [==============================] - 8s 2s/step - loss: 0.3254 - accuracy: 0.8784 Epoch 11/15 5/5 [==============================] - 8s 2s/step - loss: 0.2622 - accuracy: 0.9054 Epoch 12/15 5/5 [==============================] - 8s 2s/step - loss: 0.2570 - accuracy: 0.8649 Epoch 13/15 5/5 [==============================] - 8s 2s/step - loss: 0.2132 - accuracy: 0.9054 Epoch 14/15 5/5 [==============================] - 8s 2s/step - loss: 0.1912 - accuracy: 0.9392 Epoch 15/15 5/5 [==============================] - 8s 2s/step - loss: 0.1659 - accuracy: 0.9324
After training, we can check the training accuracy of the model.
model.evaluate(testing)
OUTPUT: [0.019918538630008698, 0.949999988079071]
We got 94.9% training accuracy and 1.9% loss.
We can also plot the graph of trainin accuracy and training loss.
plt.plot(his.history['accuracy'],label='accuracy') plt.plot(his.history['loss'],label='loss') plt.legend() plt.show()
Since we have few images of the data we can’t check the accuracy on the test set. In order to predict the image, you can reshape the shape of the image to the shape training image and then call model.predict function on the image.
CONCLUSION
In this blog, we have learnt to do binary image classification using COVID-19 X-Ray scan dataset.
If you have any doubts or suggestions related to the topic, feel free to comment below.
Leave a Reply