alok94's picture
centering test
335a8a6
# import system libs
import os
import time
import shutil
import itertools
# import data handling tools
import cv2
import numpy as np
import pandas as pd
import seaborn as sns
sns.set_style('darkgrid')
import matplotlib.pyplot as plt
import gradio as gr
# import Deep learning Libraries
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Activation, Dropout, BatchNormalization
from tensorflow.keras.models import Model, load_model, Sequential
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.model_selection import train_test_split
from tensorflow.keras.optimizers import Adam, Adamax
from tensorflow.keras import regularizers
from tensorflow.keras.metrics import categorical_crossentropy
from tensorflow.keras.utils import to_categorical
from PIL import Image
from sklearn.model_selection import train_test_split
# Ignore Warnings
import warnings
warnings.filterwarnings("ignore")
print ('modules loaded')
#---Training-----------------------------
# ! pip install -q kaggle
# from google.colab import files
# files.upload()
# ! mkdir ~/.kaggle
# ! cp kaggle.json ~/.kaggle/
# ! chmod 600 ~/.kaggle/kaggle.json
# ! kaggle datasets list
# !kaggle datasets download -d kmader/skin-cancer-mnist-ham10000
# ! mkdir kaggle
# ! unzip skin-cancer-mnist-ham10000.zip -d kaggle
# data_dir = '/content/kaggle/hmnist_28_28_RGB.csv'
# data = pd.read_csv(data_dir)
# print(data.shape)
# data.head()
# Label = data["label"]
# Data = data.drop(columns=["label"])
# print(data.shape)
# Data.head()
# from imblearn.over_sampling import RandomOverSampler
# oversample = RandomOverSampler()
# Data, Label = oversample.fit_resample(Data, Label)
# print(Data.shape)
# Data = np.array(Data).reshape(-1,28, 28,3)
# print('Shape of Data :', Data.shape)
# Label = np.array(Label)
# Label
# classes = {4: ('nv', ' melanocytic nevi'),
# 6: ('mel', 'melanoma'),
# 2 :('bkl', 'benign keratosis-like lesions'),
# 1:('bcc' , ' basal cell carcinoma'),
# 5: ('vasc', ' pyogenic granulomas and hemorrhage'),
# 0: ('akiec', 'Actinic keratoses and intraepithelial carcinomae'),
# 3: ('df', 'dermatofibroma')}
# X_train , X_test , y_train , y_test = train_test_split(Data , Label , test_size = 0.25 , random_state = 49)
# print(f'X_train shape: {X_train.shape}\nX_test shape: {X_test.shape}')
# print(f'y_train shape: {y_train.shape}\ny_test shape: {y_test.shape}')
# y_train = to_categorical(y_train)
# y_test = to_categorical(y_test)
# datagen = ImageDataGenerator(rescale=(1./255)
# ,rotation_range=10
# ,zoom_range = 0.1
# ,width_shift_range=0.1
# ,height_shift_range=0.1)
# testgen = ImageDataGenerator(rescale=(1./255))
# from keras.callbacks import ReduceLROnPlateau
# learning_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy'
# , patience = 2
# , verbose=1
# ,factor=0.5
# , min_lr=0.00001)
# model = keras.models.Sequential()
# # Create Model Structure
# model.add(keras.layers.Input(shape=[28, 28, 3]))
# model.add(keras.layers.Conv2D(32, (3, 3), activation='relu', padding='same', kernel_initializer='he_normal'))
# model.add(keras.layers.MaxPooling2D())
# model.add(keras.layers.BatchNormalization())
# model.add(keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same', kernel_initializer='he_normal'))
# model.add(keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same', kernel_initializer='he_normal'))
# model.add(keras.layers.MaxPooling2D())
# model.add(keras.layers.BatchNormalization())
# model.add(keras.layers.Conv2D(128, (3, 3), activation='relu', padding='same', kernel_initializer='he_normal'))
# model.add(keras.layers.Conv2D(128, (3, 3), activation='relu', padding='same', kernel_initializer='he_normal'))
# model.add(keras.layers.MaxPooling2D())
# model.add(keras.layers.BatchNormalization())
# model.add(keras.layers.Conv2D(256, (3, 3), activation='relu', padding='same', kernel_initializer='he_normal'))
# model.add(keras.layers.Conv2D(256, (3, 3), activation='relu', padding='same', kernel_initializer='he_normal'))
# model.add(keras.layers.MaxPooling2D())
# model.add(keras.layers.Flatten())
# model.add(keras.layers.Dropout(rate=0.2))
# model.add(keras.layers.Dense(units=256, activation='relu', kernel_initializer='he_normal'))
# model.add(keras.layers.BatchNormalization())
# model.add(keras.layers.Dense(units=128, activation='relu', kernel_initializer='he_normal'))
# model.add(keras.layers.BatchNormalization())
# model.add(keras.layers.Dense(units=64, activation='relu', kernel_initializer='he_normal'))
# model.add(keras.layers.BatchNormalization())
# model.add(keras.layers.Dense(units=32, activation='relu', kernel_initializer='he_normal', kernel_regularizer=keras.regularizers.L1L2()))
# model.add(keras.layers.BatchNormalization())
# model.add(keras.layers.Dense(units=7, activation='softmax', kernel_initializer='glorot_uniform', name='classifier'))
# model.compile(Adamax(learning_rate= 0.001), loss= 'categorical_crossentropy', metrics= ['accuracy'])
# model.summary()
# history = model.fit(X_train ,
# y_train ,
# epochs=25 ,
# batch_size=128,
# validation_data=(X_test , y_test) ,
# callbacks=[learning_rate_reduction])
# def plot_training(hist):
# tr_acc = hist.history['accuracy']
# tr_loss = hist.history['loss']
# val_acc = hist.history['val_accuracy']
# val_loss = hist.history['val_loss']
# index_loss = np.argmin(val_loss)
# val_lowest = val_loss[index_loss]
# index_acc = np.argmax(val_acc)
# acc_highest = val_acc[index_acc]
# plt.figure(figsize= (20, 8))
# plt.style.use('fivethirtyeight')
# Epochs = [i+1 for i in range(len(tr_acc))]
# loss_label = f'best epoch= {str(index_loss + 1)}'
# acc_label = f'best epoch= {str(index_acc + 1)}'
# plt.subplot(1, 2, 1)
# plt.plot(Epochs, tr_loss, 'r', label= 'Training loss')
# plt.plot(Epochs, val_loss, 'g', label= 'Validation loss')
# plt.scatter(index_loss + 1, val_lowest, s= 150, c= 'blue', label= loss_label)
# plt.title('Training and Validation Loss')
# plt.xlabel('Epochs')
# plt.ylabel('Loss')
# plt.legend()
# plt.subplot(1, 2, 2)
# plt.plot(Epochs, tr_acc, 'r', label= 'Training Accuracy')
# plt.plot(Epochs, val_acc, 'g', label= 'Validation Accuracy')
# plt.scatter(index_acc + 1 , acc_highest, s= 150, c= 'blue', label= acc_label)
# plt.title('Training and Validation Accuracy')
# plt.xlabel('Epochs')
# plt.ylabel('Accuracy')
# plt.legend()
# plt.tight_layout
# plt.show()
# plot_training(history)
# train_score = model.evaluate(X_train, y_train, verbose= 1)
# test_score = model.evaluate(X_test, y_test, verbose= 1)
# print("Train Loss: ", train_score[0])
# print("Train Accuracy: ", train_score[1])
# print('-' * 20)
# print("Test Loss: ", test_score[0])
# print("Test Accuracy: ", test_score[1])
# y_true = np.array(y_test)
# y_pred = model.predict(X_test)
# y_pred = np.argmax(y_pred , axis=1)
# y_true = np.argmax(y_true , axis=1)
# classes_labels = []
# for key in classes.keys():
# classes_labels.append(key)
# print(classes_labels)
# # Confusion matrix
# cm = cm = confusion_matrix(y_true, y_pred, labels=classes_labels)
# plt.figure(figsize= (10, 10))
# plt.imshow(cm, interpolation= 'nearest', cmap= plt.cm.Blues)
# plt.title('Confusion Matrix')
# plt.colorbar()
# tick_marks = np.arange(len(classes))
# plt.xticks(tick_marks, classes, rotation= 45)
# plt.yticks(tick_marks, classes)
# thresh = cm.max() / 2.
# for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
# plt.text(j, i, cm[i, j], horizontalalignment= 'center', color= 'white' if cm[i, j] > thresh else 'black')
# plt.tight_layout()
# plt.ylabel('True Label')
# plt.xlabel('Predicted Label')
# plt.show()
# #Save the model
# model.save('skin_cancer_model.h5')
# converter = tf.lite.TFLiteConverter.from_keras_model(model)
# tflite_model = converter.convert()
# print("model converted")
# # Save the model.
# with open('skin_cancer_model.tflite', 'wb') as f:
# f.write(tflite_model)
#Training End------------------------------------------
skin_classes = {4: ('nv', ' melanocytic nevi'),
6: ('mel', 'melanoma'),
2 :('bkl', 'benign keratosis-like lesions'),
1:('bcc' , ' basal cell carcinoma'),
5: ('vasc', ' pyogenic granulomas and hemorrhage'),
0: ('akiec', 'Actinic keratoses and intraepithelial carcinomae'),
3: ('df', 'dermatofibroma')}
#Use saved model
loaded_model = tf.keras.models.load_model('skin_cancer_model.h5', compile=False)
loaded_model.compile(Adamax(learning_rate= 0.001), loss= 'categorical_crossentropy', metrics= ['accuracy'])
def predict_digit(image):
if image is not None:
#Use saved model
loaded_model = tf.keras.models.load_model('skin_cancer_model.h5', compile=False)
loaded_model.compile(Adamax(learning_rate= 0.001), loss= 'categorical_crossentropy', metrics= ['accuracy'])
img = image.resize((28, 28))
img_array = tf.keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0)
print(img_array)
predictions = loaded_model.predict(img_array)
print(predictions)
#class_labels = [] # data classes
score = tf.nn.softmax(predictions[0])*100
print(score)
print(skin_classes[np.argmax(score)])
simple = pd.DataFrame(
{
"skin condition": ["akiec", "bcc", "bkl", "df", "nv", "vasc", "mel"],
"probability": score,
"full skin condition": [ 'Actinic keratoses',
' basal cell carcinoma',
'benign keratosis-like lesions',
'dermatofibroma',
' melanocytic nevi',
' pyogenic granulomas and hemorrhage',
'melanoma'],
}
)
predicted_skin_condition=skin_classes[np.argmax(score)][1]+" ("+ skin_classes[np.argmax(score)][0]+")"
return predicted_skin_condition, gr.BarPlot(
simple,
x="skin condition",
y="probability",
x_title="Skin Condition",
y_title="Classification Probabilities",
title="Skin Cancer Classification Probability",
tooltip=["full skin condition", "probability"],
vertical=False,
y_lim=[0, 100],
color="full skin condition"
)
else:
simple_empty = pd.DataFrame(
{
"skin condition": ["akiec", "bcc", "bkl", "df", "nv", "vasc", "mel"],
"probability": [0,0,0,0,0,0,0],
"full skin condition": [ 'Actinic keratoses',
' basal cell carcinoma',
'benign keratosis-like lesions',
'dermatofibroma',
' melanocytic nevi',
' pyogenic granulomas and hemorrhage',
'melanoma'],
}
)
return " ", gr.BarPlot(
simple_empty,
x="skin condition",
y="probability",
x_title="Digits",
y_title="Identification Probabilities",
title="Identification Probability",
tooltip=["full skin condition", "probability"],
vertical=False,
y_lim=[0, 100],
)
skin_images = [
("skin_image/mel.jpg",'mel'),
("skin_image/nv3.jpg",'nv'),
("skin_image/bkl.jpg",'bkl'),
("skin_image/df.jpg",'df'),
("skin_image/akiec.jpg",'akiec'),
("skin_image/bcc.jpg",'bcc'),
("skin_image/vasc.jpg",'vasc'),
("skin_image/nv2.jpg",'nv'),
("skin_image/akiec2.jpg",'akiec'),
("skin_image/bkl2.jpg",'bkl'),
("skin_image/nv.jpg",'nv'),
]
def image_from_gallary(evt: gr.SelectData):
print(evt.index)
return skin_images[evt.index][0]
css='''
#title_head {
text-align: center;
font-weight: bold;
font-size: 30px;
}
#name_head{
text-align: center;
}
'''
with gr.Blocks(css=css) as demo:
with gr.Row():
with gr.Column():
gr.Markdown("<h1>Skin Cancer Classifier</h1>", elem_id='title_head')
gr.Markdown("<h2>Cyperts Project</h2>", elem_id="name_head")
with gr.Row():
with gr.Column():
with gr.Row():
gr.Markdown("<h3>Browse or Select from given Image</h3>", elem_id='info')
img_upload=gr.Image(type="pil", height=200, width=300)
with gr.Row():
clear=gr.ClearButton(img_upload)
btn=gr.Button("Identify")
with gr.Column():
gry=gr.Gallery(value=skin_images, columns=5, show_label=False, allow_preview=False)
with gr.Row():
with gr.Column():
gr.Markdown("Most probable skin condition")
label=gr.Label("")
with gr.Row():
with gr.Column():
gr.Markdown("Other possible values")
bar = gr.BarPlot()
btn.click(predict_digit,inputs=[img_upload],outputs=[label,bar])
gry.select(image_from_gallary, outputs=img_upload)
demo.launch(debug=True)