import os
import glob
import PIL
import PIL.Image
from pathlib import Path
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.image as mimg
import cv2
import tensorflow as tf
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Conv2D, GlobalAveragePooling2D, MaxPooling2D, Dense, Dropout, Input, Flatten, SeparableConv2D, BatchNormalization
from tensorflow.keras.applications import Xception
from tensorflow.keras.optimizers import Adam
from keras.utils import to_categorical
from keras.preprocessing.image import ImageDataGenerator
WARNING:tensorflow:From /home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/tensorflow_core/__init__.py:1473: The name tf.estimator.inputs is deprecated. Please use tf.compat.v1.estimator.inputs instead.
Using TensorFlow backend.
#There are two types of lung xray cases, Normal and Pneumonia
labels = ["NORMAL", "PNEUMONIA"]i
mg_size = 150
#Location of images
train_folder = './chest_xray/train'
test_folder = './chest_xray/test'
val_folder = './chest_xray/val'
normal_cases = []
pneumonia_cases = []
#We will use a image data generator for training later but for now we want to grab some images to look at
for label in labels:
path = os.path.join(train_folder, label)
class_num = labels.index(label)
for img in os.listdir(path):
img_array = cv2.imread(os.path.join(path, img))
new_array = cv2.resize(img_array, (img_size, img_size))
if class_num == 0:
normal_cases.append([new_array, class_num])
else:
pneumonia_cases.append([new_array, class_num])
#Lets count the amount of each case
normal_cases = np.array(normal_cases)
pneumonia_cases = np.array(pneumonia_cases)
#Lets look at some examples of Normal vs Pneuonia xrays
plt.figure(figsize=(20, 8))
for i in range(10):
ax = plt.subplot(2, 5, i + 1)
if i < 5:
plt.imshow(normal_cases[i][0].astype("uint8"))
plt.title("Normal")
else:
plt.imshow(pneumonia_cases[i][0].astype("uint8"))
plt.title("Pneumonia")
plt.axis("off")
#There are significantly more pneumonia cases than normal cases, we will use a weight to balance this for training
all_cases = pd.DataFrame(data=np.concatenate((normal_cases,pneumonia_cases),axis=0),columns = ['img','label'])
for index, row in all_cases.iterrows():
row['label'] = 'Pneumonia' if row['label'] == 1 else 'Normal'
sns.set_style("dark")
sns.set(rc={'figure.figsize':(11.7,8.27)})
ax = sns.countplot(x="label", data=all_cases,palette="husl")