deeplearning / DenseNet /DenseNet.py
umaradnaan's picture
Upload 6 files
c1da662 verified
# -*- coding: utf-8 -*-
"""DenseNet.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1puXj_yhdhVZAi2D2P1mpDlDvccwU_63N
"""
import tensorflow as tf
from tensorflow.keras import Input
from tensorflow.keras.applications.densenet import DenseNet121, DenseNet169, DenseNet201
from tensorflow.keras.applications import MobileNetV3Small
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Dense, Flatten, Dropout
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, log_loss, jaccard_score
import numpy as np
import os
from PIL import Image
from shutil import copyfile
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from google.colab import drive
drive.mount('/content/drive')
train_data_dir = '/content/drive/MyDrive/BoneFractureDataset/training'
test_data_dir = '/content/drive/MyDrive/BoneFractureDataset/training'
validation_data_dir = '/content/drive/MyDrive/BoneFractureDataset/training'
IMG_WIDTH, IMG_HEIGHT = 299, 299
input_shape = (IMG_WIDTH, IMG_HEIGHT, 3)
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen = ImageDataGenerator(rescale=1./255)
train_datagen_augmented = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=False,
fill_mode='nearest'
)
train_generator = train_datagen_augmented.flow_from_directory(train_data_dir, target_size=(IMG_WIDTH, IMG_HEIGHT), batch_size=10, class_mode='categorical')
test_datagen_augmented = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=False,
fill_mode='nearest'
)
test_generator = test_datagen.flow_from_directory(test_data_dir, target_size=(IMG_WIDTH, IMG_HEIGHT), batch_size=8, class_mode='categorical', shuffle=False)
validation_datagen_augmented = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=False,
fill_mode='nearest'
)
validation_generator = validation_datagen.flow_from_directory(validation_data_dir, target_size=(IMG_WIDTH, IMG_HEIGHT), batch_size=8, class_mode='categorical', shuffle=True)
class_indices = train_generator.class_indices
print(class_indices)
classes = os.listdir(train_data_dir)
for class_name in classes:
class_path = os.path.join(train_data_dir, class_name)
num_images = len(os.listdir(class_path))
print(f"Class: {class_name}, Number of images: {num_images}")
batch = train_generator.next()
for i in range(len(batch[0])):
img = batch[0][i]
label = batch[1][i]
height, width, channels = img.shape
print(f"Image {i+1} - Shape: {width}x{height}x{channels}, Label: {label}")
classes = os.listdir(test_data_dir)
for class_name in classes:
class_path = os.path.join(test_data_dir, class_name)
num_images = len(os.listdir(class_path))
print(f"Class: {class_name}, Number of images: {num_images}")
batch = test_generator.next()
for i in range(len(batch[0])):
img = batch[0][i]
label = batch[1][i]
height, width, channels = img.shape
print(f"Image {i+1} - Shape: {width}x{height}x{channels}, Label: {label}")
classes = os.listdir(validation_data_dir)
for class_name in classes:
class_path = os.path.join(validation_data_dir, class_name)
num_images = len(os.listdir(class_path))
print(f"Class: {class_name}, Number of images: {num_images}")
batch = validation_generator.next()
for i in range(len(batch[0])):
img = batch[0][i]
label = batch[1][i]
height, width, channels = img.shape
print(f"Image {i+1} - Shape: {width}x{height}x{channels}, Label: {label}")
print("GPU is", "available" if tf.config.list_physical_devices('GPU') else "NOT available")
if tf.config.list_physical_devices('GPU'):
tf.config.experimental.set_memory_growth(tf.config.list_physical_devices('GPU')[0], True)
print("GPU device configured")
else:
print("No GPU device found")
from tensorflow.keras.callbacks import ModelCheckpoint
model_dir = '/kaggle/working/Checkpoints_densenet201'
if not os.path.exists(model_dir):
os.makedirs(model_dir)
checkpoint_path = model_dir + '/cp.ckpt'
checkpoint_dir = os.path.dirname(checkpoint_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path, save_weights_only=True, save_best_only=True, monitor="val_accuracy", mode="max", verbose=1)
checkpoint_path
from tensorflow.keras import models, layers, optimizers
def create_model(summary=True):
new_input = Input(shape=(IMG_WIDTH, IMG_HEIGHT, 3))
base_model = DenseNet201(weights='imagenet', include_top=False, input_tensor=new_input)
flat1 = Flatten()(base_model.layers[-1].output)
output = Dense(2, activation='softmax')(flat1)
model = Model(inputs=base_model.inputs, outputs=output)
model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy'])
if summary:
print(model.summary())
return model
model = create_model()
history = model.fit(train_generator, steps_per_epoch=20, epochs=20, validation_data=validation_generator, validation_steps=25, callbacks=[cp_callback])
evaluation = model.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'],
}
np.save("/kaggle/working/saved_D201history.npy", saved_history)
latest_checkpoint = tf.train.latest_checkpoint(checkpoint_dir)
print(latest_checkpoint)
if latest_checkpoint is not None:
loaded_model = create_model(summary=True)
status = loaded_model.load_weights(latest_checkpoint)
status.expect_partial()
else:
print("No checkpoint file found in the specified directory.")
previous_history = np.load("/kaggle/working/saved_D201history.npy", allow_pickle=True).item()
initial_epoch = len(previous_history['loss'])
print(initial_epoch)
loaded_model.compile(optimizer=Adam(learning_rate=1e-5), loss=tf.keras.losses.BinaryCrossentropy(), metrics=['accuracy'])
new_history = loaded_model.fit(
train_generator,
steps_per_epoch=20,
epochs=20,
initial_epoch=initial_epoch,
validation_data=validation_generator,
validation_steps=30,
callbacks=[cp_callback]
)
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
from matplotlib.legend_handler import HandlerLine2D
import numpy as np
plt.figure(figsize=(10, 6))
train_loss, = plt.plot(previous_history['loss'], label='Train Loss', color='blue')
val_loss, = plt.plot(previous_history['val_loss'], label='Validation Loss', color='orange')
train_accuracy, = plt.plot(previous_history['accuracy'], label='Train Accuracy', color='green')
val_accuracy, = plt.plot(previous_history['val_accuracy'], label='Validation Accuracy', color='red')
plt.title('Model Performance during Training', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12},pad=10)
plt.xlabel('No. of Epochs', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12})
plt.xticks(np.linspace(0, 150, num=16), fontname='Serif', weight='bold')
plt.yticks(np.linspace(0, 5, num=11), fontname='Serif', weight='bold')
plt.xlim(0, 150)
plt.ylim(0, 5)
legend_lines = [
Line2D([0], [0], color='blue', lw=3),
Line2D([0], [0], color='orange', lw=3),
Line2D([0], [0], color='green', lw=3),
Line2D([0], [0], color='red', lw=3)
]
plt.legend(legend_lines, ['Train Loss', 'Validation Loss', 'Train Accuracy', 'Validation Accuracy'],
loc='lower center', bbox_to_anchor=(0.5, 1.1), ncol=5,
prop={'family': 'Serif', 'weight': 'bold', 'size': 8}, frameon=False,
handler_map={Line2D: HandlerLine2D(numpoints=5)})
plt.gca().xaxis.labelpad = 10
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.tight_layout()
plt.show()
latest_checkpoint = tf.train.latest_checkpoint(checkpoint_dir)
print(checkpoint_dir)
if latest_checkpoint is not None:
loaded_model = create_model(summary=True)
status = loaded_model.load_weights(latest_checkpoint)
status.expect_partial()
else:
print("No checkpoint file found in the specified directory.")
loaded_model.compile(optimizer=Adam(learning_rate=1e-3), loss=tf.keras.losses.BinaryCrossentropy(), metrics=['accuracy'])
test_loss, test_acc = loaded_model.evaluate(test_generator)
print(f"Test Accuracy: {test_acc}")
# Commented out IPython magic to ensure Python compatibility.
# %whos
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)}")
print("\nClassification Report:")
print(classification_report(true_classes, predicted_classes,digits=4))
conf_matrix = confusion_matrix(true_classes, predicted_classes)
plt.figure(figsize=(6, 4.5))
custom_palette = sns.color_palette(palette='blend:#7AB,#EDA')
font = {'family': 'Serif', 'weight': 'bold', 'size': 12}
heatmap = sns.heatmap(conf_matrix, annot=True, fmt='d', cmap=custom_palette,vmin=0,vmax=350,
xticklabels=['Fractured', 'Non_fractured'], yticklabels=['Fractured', 'Non_fractured'],annot_kws={"family": "Serif",'weight': 'bold', 'size': 12})
heatmap.set_xlabel('Predicted Labels', fontdict=font)
heatmap.set_ylabel('True Labels', fontdict=font)
heatmap.set_title('Fracture Classification', fontdict=font, pad=12)
heatmap.set_xticklabels(heatmap.get_xticklabels(), fontname='Serif', fontsize=12)
heatmap.set_yticklabels(heatmap.get_yticklabels(), fontname='Serif', fontsize=12)
cbar = heatmap.collections[0].colorbar
cbar.set_label('Count', fontdict=font)
cbar.ax.tick_params(labelsize=10)
plt.gca().xaxis.labelpad = 10
plt.tight_layout()
plt.show()
import numpy as np
print(type(true_classes))
print(type(predictions))
!pip install scikit-learn
!pip install matplotlib
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
print(type(predictions))
predictions = np.array(predictions)
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()
def make_prediction_and_visualize_():
img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg'
img = cv2.imread(img_path)
img = cv2.resize(img, (299, 299))
rescaled_img = img/255.0
batch_pred = np.expand_dims(rescaled_img, 0)
last_conv_layer_name = 'conv5_block32_concat'
heatmap = make_gradcam_heatmap(batch_pred, loaded_model, last_conv_layer_name)
save_and_display_gradcam(img_path, heatmap)
make_prediction_and_visualize_()
def save_and_display_gradcam_plusplus(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_plusplus_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_output = preds[:, pred_index]
conv_output = last_conv_layer_output[0]
grads = tape.gradient(class_output, last_conv_layer_output)
pooled_grads = tf.reduce_mean(grads[0], axis=(0, 1, 2))
last_conv_layer_output = last_conv_layer_output[0]
guided_grads = tf.cast(last_conv_layer_output > 0, 'float32') * grads[0]
weights = tf.reduce_mean(guided_grads, axis=(0, 1))
heatmap = tf.reduce_sum(tf.multiply(weights, last_conv_layer_output), axis=-1)
heatmap = tf.maximum(heatmap, 0) / tf.reduce_max(heatmap)
return heatmap.numpy()
def make_prediction_and_visualize_gradcam_plusplus():
img_path = '/content/drive/MyDrive/testing/not_fractured/1-rotated1-rotated1-rotated1-rotated1.jpg'
img = cv2.imread(img_path)
img = cv2.resize(img, (299, 299))
rescaled_img = img / 255.0
batch_pred = np.expand_dims(rescaled_img, 0)
last_conv_layer_name = 'conv5_block32_concat'
heatmap = make_gradcam_plusplus_heatmap(batch_pred, loaded_model, last_conv_layer_name)
save_and_display_gradcam_plusplus(img_path, heatmap)
make_prediction_and_visualize_gradcam_plusplus()
def save_and_display_scorecam(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('ScoreCAM', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12})
plt.axis('off')
plt.tight_layout()
plt.show()
import tensorflow as tf
def make_scorecam_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_output = preds[:, pred_index]
conv_output = last_conv_layer_output[0]
grads = tape.gradient(class_output, last_conv_layer_output)
guided_grads = tf.cast(grads[0] > 0, 'float32') * grads[0]
weights = tf.reduce_mean(guided_grads, axis=(0, 1))
cam = tf.reduce_sum(tf.multiply(weights, conv_output), axis=-1)
cam = tf.maximum(cam, 0)
cam /= tf.reduce_max(cam)
return cam.numpy()
def make_prediction_and_visualize_scorecam():
img_path = '/content/drive/MyDrive/BoneFractureDataset/training/fractured/10.jpg'
img = cv2.imread(img_path)
img = cv2.resize(img, (299, 299))
rescaled_img = img/255.0
batch_pred = np.expand_dims(rescaled_img, 0)
last_conv_layer_name = 'conv5_block32_concat'
heatmap = make_scorecam_heatmap(batch_pred, loaded_model, last_conv_layer_name)
save_and_display_scorecam(img_path, heatmap)
make_prediction_and_visualize_scorecam()
def save_and_display_faster_scorecam(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('Faster ScoreCAM', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12})
plt.axis('off')
plt.tight_layout()
plt.show()
def faster_scorecam_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_output = preds[:, pred_index]
conv_output = last_conv_layer_output[0]
grads = tape.gradient(class_output, last_conv_layer_output)[0]
weights = tf.reduce_mean(grads, axis=(0, 1))
weights = tf.reshape(weights, (1, 1, -1))
conv_output = tf.expand_dims(conv_output, axis=0)
conv_output = tf.expand_dims(conv_output, axis=-1)
cam = tf.matmul(weights, conv_output)
cam = tf.squeeze(cam)
cam = tf.maximum(cam, 0)
cam /= tf.reduce_max(cam)
return cam.numpy()
def make_prediction_and_visualize_faster_scorecam():
img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg'
img = cv2.imread(img_path)
img = cv2.resize(img, (299, 299))
rescaled_img = img/255.0
batch_pred = np.expand_dims(rescaled_img, 0)
last_conv_layer_name = 'conv5_block32_concat'
heatmap = faster_scorecam_heatmap(batch_pred, loaded_model, last_conv_layer_name)
save_and_display_faster_scorecam(img_path, heatmap)
make_prediction_and_visualize_faster_scorecam()
def save_and_display_layercam(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('LayerCAM', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12})
plt.axis('off')
plt.tight_layout()
plt.show()
import tensorflow as tf
def generate_layercam_heatmap(img_array, model, last_conv_layer_name, target_class_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 target_class_index is None:
target_class_index = tf.argmax(preds[0])
class_output = preds[:, target_class_index]
conv_output = last_conv_layer_output[0]
grads = tape.gradient(class_output, last_conv_layer_output)[0]
weights = tf.reduce_mean(grads, axis=(0, 1))
weights = tf.reshape(weights, (1, 1, -1))
conv_output = tf.expand_dims(conv_output, axis=0)
conv_output = tf.expand_dims(conv_output, axis=-1)
cam = tf.matmul(weights, conv_output)
cam = tf.squeeze(cam)
cam = tf.maximum(cam, 0)
cam /= tf.reduce_max(cam)
return cam.numpy()
def make_prediction_and_visualize_layercam():
img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg'
img = cv2.imread(img_path)
img = cv2.resize(img, (299, 299))
rescaled_img = img/255.0
batch_pred = np.expand_dims(rescaled_img, 0)
last_conv_layer_name = 'conv5_block32_concat'
heatmap = generate_layercam_heatmap(batch_pred, loaded_model, last_conv_layer_name)
save_and_display_layercam(img_path, heatmap)
make_prediction_and_visualize_layercam()
def save_and_display_saliency_map(img_path, saliency_map):
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
saliency_map = cv2.resize(saliency_map, (img.shape[1], img.shape[0]))
saliency_map = (saliency_map - saliency_map.min()) / (saliency_map.max() - saliency_map.min())
heatmap = cv2.applyColorMap(np.uint8(255 * saliency_map), cv2.COLORMAP_JET)
heatmap = cv2.cvtColor(heatmap, cv2.COLOR_BGR2RGB)
alpha = 0.4
blended = cv2.addWeighted(img, alpha, heatmap, 1 - alpha, 0)
plt.figure(figsize=(4, 4))
plt.imshow(blended)
plt.title('Vanilla Saliency', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12})
plt.axis('off')
plt.tight_layout()
plt.show()
def generate_vanilla_saliency_map(img_array, model):
img_tensor = tf.convert_to_tensor(img_array)
img_tensor = tf.expand_dims(img_tensor, axis=0)
with tf.GradientTape() as tape:
tape.watch(img_tensor)
preds = model(img_tensor)
top_pred_index = tf.argmax(preds[0])
top_class_score = preds[:, top_pred_index]
grads = tape.gradient(top_class_score, img_tensor)
saliency_map = tf.abs(grads)
saliency_map = tf.reduce_max(saliency_map, axis=-1)
return saliency_map[0].numpy()
def make_prediction_and_visualize_vanilla_saliency():
img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg'
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (299, 299))
img = img / 255.0
saliency_map = generate_vanilla_saliency_map(img, loaded_model)
save_and_display_saliency_map(img_path, saliency_map)
make_prediction_and_visualize_vanilla_saliency()
def save_and_display_SmoothGrad(img_path, saliency_map):
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
saliency_map = cv2.resize(saliency_map, (img.shape[1], img.shape[0]))
saliency_map = (saliency_map - saliency_map.min()) / (saliency_map.max() - saliency_map.min())
heatmap = cv2.applyColorMap(np.uint8(255 * saliency_map), cv2.COLORMAP_JET)
heatmap = cv2.cvtColor(heatmap, cv2.COLOR_BGR2RGB)
alpha = 0.4
blended = cv2.addWeighted(img, alpha, heatmap, 1 - alpha, 0)
plt.figure(figsize=(4, 4))
plt.imshow(blended)
plt.title('Smooth Grad', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12})
plt.axis('off')
plt.tight_layout()
plt.show()
def generate_smoothgrad_saliency_map(img_array, model, n=50, sigma=1.0):
img_tensor = tf.convert_to_tensor(img_array)
img_tensor = tf.expand_dims(img_tensor, axis=0)
img_tensor = tf.cast(img_tensor, dtype=tf.float32)
with tf.GradientTape() as tape:
tape.watch(img_tensor)
preds = model(img_tensor)
top_pred_index = tf.argmax(preds[0])
top_class_score = preds[:, top_pred_index]
total_gradients = tf.zeros_like(img_tensor)
for _ in range(n):
noise = tf.random.normal(shape=img_tensor.shape, mean=0.0, stddev=sigma)
perturbed_img = img_tensor + noise
with tf.GradientTape() as perturbed_tape:
perturbed_tape.watch(perturbed_img)
perturbed_preds = model(perturbed_img)
perturbed_top_class_score = perturbed_preds[:, top_pred_index]
perturbed_grads = perturbed_tape.gradient(perturbed_top_class_score, perturbed_img)
total_gradients += perturbed_grads
averaged_gradients = total_gradients / n
saliency_map = tf.abs(averaged_gradients)
saliency_map = tf.reduce_max(saliency_map, axis=-1)
return saliency_map[0].numpy()
def make_prediction_and_visualize_smoothgrad_saliency():
img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg'
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (299, 299))
img = img / 255.0
heatmap = generate_smoothgrad_saliency_map(img, loaded_model)
save_and_display_SmoothGrad(img_path, heatmap)
make_prediction_and_visualize_smoothgrad_saliency()