deeplearning / ResNet /ResNet.py
umaradnaan's picture
Upload 6 files
c1da662 verified
# -*- coding: utf-8 -*-
"""ResNet50.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1Ztagc2mpxc2YEeFMut7EwFhL8SFY2gAm
"""
import numpy as np
import pandas as pd
from PIL import Image
import pickle
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import os
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications.resnet50 import preprocess_input
datagen = ImageDataGenerator(rescale=1.0/255.0, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest')
batch_size = 20
train_data_dir = '/content/drive/MyDrive/BoneFractureDataset/training'
validation_data_dir = '/content/drive/MyDrive/BoneFractureDataset/testing'
train_generator = datagen.flow_from_directory( train_data_dir,
target_size=(224, 224),
batch_size=batch_size,
class_mode='binary',
shuffle=True )
validation_generator = datagen.flow_from_directory(
validation_data_dir,
target_size=(224, 224),
batch_size=batch_size,
class_mode='binary',
shuffle=False
)
!ls /kaggle/input/resnet50-weights/
!stat /kaggle/input/resnet50-weights/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5
!wget https://storage.googleapis.com/tensorflow/keras-applications/resnet/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 -P /kaggle/input/resnet50-weights/
!cat /kaggle/input/resnet50-weights/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5
!ls -l /kaggle/input/resnet50-weights/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5
!wget https://storage.googleapis.com/tensorflow/keras-applications/resnet/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 -P /kaggle/input/resnet50-weights
resModel = Sequential()
resModel.add(ResNet50(
include_top=False,
pooling='avg',
weights=None,
))
resModel.add(Dense(1, activation='sigmoid'))
for layer in resModel.layers[0].layers[-50:]:
layer.trainable = True
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import ReduceLROnPlateau
optimizer = Adam(learning_rate=0.001)
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=3, min_lr=0.0001)
resModel.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])
epochs = 10
history = resModel.fit(train_generator, epochs=epochs, validation_data=validation_generator, callbacks=[reduce_lr])
evaluation = resModel.evaluate(train_generator)
print(f"Test Accuracy: {evaluation[1] * 100:.2f}%")
initial_epoch = 0
saved_history = {
'loss': history.history['loss'],
'accuracy': history.history['accuracy'],
'val_loss': history.history['val_loss'],
'val_accuracy': history.history['val_accuracy'],
}
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
from matplotlib.legend_handler import HandlerLine2D
import numpy as np
initial_epoch = 10
saved_history = {
'loss': history.history['loss'],
'accuracy': history.history['accuracy'],
'val_loss': history.history['val_loss'],
'val_accuracy': history.history['val_accuracy'],
}
!ls /kaggle/working
!ls -l /kaggle/working/saved_D201history.npy
!find / -name saved_D201history.npy
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, log_loss, jaccard_score
true_classes = [1, 0, 1, 1, 0]
predicted_classes = [1, 1, 0, 1, 0]
print(f"Accuracy: {accuracy_score(true_classes, predicted_classes)}")
print(f"Precision: {precision_score(true_classes, predicted_classes)}")
print(f"Recall: {recall_score(true_classes, predicted_classes)}")
print(f"F1 Score: {f1_score(true_classes, predicted_classes)}")
print(f"Log Loss: {log_loss(true_classes, predicted_classes)}")
print(f"Jaccard Score: {jaccard_score(true_classes, predicted_classes)}")
from sklearn.metrics import classification_report
print("\nClassification Report:")
print(classification_report(true_classes, predicted_classes,digits=4))
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
def save_and_display_gradcam(img_path, heatmap, alpha=0.7):
img = cv2.imread(img_path)
img = cv2.resize(img, (299, 299))
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
heatmap = np.uint8(255 * heatmap)
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_PLASMA)
superimposed_img = cv2.addWeighted(heatmap, alpha, img, 1 - alpha, 0)
plt.figure(figsize=(4, 4))
plt.imshow(cv2.cvtColor(superimposed_img, cv2.COLOR_BGR2RGB))
plt.title('GradCAM', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12})
plt.axis('off')
plt.tight_layout()
plt.show()
def make_gradcam_heatmap(img_array, model, last_conv_layer_name, pred_index=None):
model.layers[-1].activation = None
grad_model = tf.keras.models.Model(
[model.inputs], [model.get_layer(last_conv_layer_name).output, model.output]
)
with tf.GradientTape() as tape:
last_conv_layer_output, preds = grad_model(img_array)
if pred_index is None:
pred_index = tf.argmax(preds[0])
class_channel = preds[:, pred_index]
grads = tape.gradient(class_channel, last_conv_layer_output)
pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
last_conv_layer_output = last_conv_layer_output[0]
heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]
heatmap = tf.squeeze(heatmap)
heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
return heatmap.numpy()
import cv2
abcd = cv2.imread('/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg')
plt.imshow(abcd)