hp733's picture
Update gradcam_utils.py
695fb8b verified
# import numpy as np
# import cv2
# import tensorflow as tf
# from tensorflow.keras.preprocessing.image import img_to_array, load_img
# import matplotlib.pyplot as plt
# from matplotlib.colors import LinearSegmentedColormap
# def preprocess_image(img_path, target_size):
# img = load_img(img_path, target_size=target_size)
# img = img_to_array(img)
# img = np.expand_dims(img, axis=0)
# img = img / 255.0 # Normalize
# return img
# def make_gradcam_heatmap(model, img_tensor, last_conv_layer_name, classifier_layer_names):
# grad_model = tf.keras.models.Model(
# [model.inputs], [model.get_layer(last_conv_layer_name).output, model.output]
# )
# with tf.GradientTape() as tape:
# conv_outputs, predictions = grad_model(img_tensor)
# loss = predictions[:, 1] # Targeting class 1 for pneumonia
# grads = tape.gradient(loss, conv_outputs)
# pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
# conv_outputs = conv_outputs[0]
# heatmap = conv_outputs @ pooled_grads[..., tf.newaxis]
# heatmap = tf.squeeze(heatmap)
# heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
# heatmap = tf.where(tf.math.is_nan(heatmap), tf.zeros_like(heatmap), heatmap)
# return heatmap.numpy()
# def create_custom_colormap():
# colors = ['blue', 'green', 'yellow', 'red']
# n_bins = 256
# cmap = LinearSegmentedColormap.from_list('custom', colors, N=n_bins)
# return cmap
# def apply_custom_colormap(heatmap, cmap):
# colored_heatmap = cmap(heatmap)
# colored_heatmap = np.uint8(colored_heatmap * 255)
# return colored_heatmap
# def enhance_heatmap(heatmap, gamma=0.7, percentile=99):
# heatmap = np.power(heatmap, gamma)
# heatmap = heatmap / np.percentile(heatmap, percentile)
# heatmap = np.clip(heatmap, 0, 1)
# return heatmap
# def generate_and_merge_heatmaps(img_path, vgg_model, efficientnet_model, densenet_model, img_size=(224, 224), output_size=(5, 5)):
# img_tensor = preprocess_image(img_path, img_size)
# vgg_heatmap = make_gradcam_heatmap(vgg_model, img_tensor, 'block5_conv4', ['flatten', 'dense'])
# efficientnet_heatmap = make_gradcam_heatmap(efficientnet_model, img_tensor, 'top_conv', ['flatten', 'dense'])
# densenet_heatmap = make_gradcam_heatmap(densenet_model, img_tensor, 'conv5_block16_concat', ['flatten', 'dense'])
# vgg_heatmap_resized = cv2.resize(vgg_heatmap, img_size)
# efficientnet_heatmap_resized = cv2.resize(efficientnet_heatmap, img_size)
# densenet_heatmap_resized = cv2.resize(densenet_heatmap, img_size)
# merged_heatmap = (vgg_heatmap_resized + efficientnet_heatmap_resized + densenet_heatmap_resized) / 3.0
# enhanced_heatmap = enhance_heatmap(merged_heatmap)
# custom_cmap = create_custom_colormap()
# colored_heatmap = apply_custom_colormap(enhanced_heatmap, custom_cmap)
# img = cv2.imread(img_path)
# img = cv2.resize(img, img_size)
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# superimposed_img = cv2.addWeighted(img, 0.6, colored_heatmap[:, :, :3], 0.4, 0)
# return superimposed_img
# import numpy as np
# import cv2
# import tensorflow as tf
# from tensorflow.keras.preprocessing.image import img_to_array, load_img
# from matplotlib.colors import LinearSegmentedColormap
# def preprocess_image(img_path, target_size):
# img = load_img(img_path, target_size=target_size)
# img = img_to_array(img)
# img = np.expand_dims(img, axis=0)
# img = img / 255.0
# return img
# def make_gradcam_heatmap(model, img_tensor):
# grad_model = tf.keras.models.Model([model.input], [model.output])
# with tf.GradientTape() as tape:
# conv_outputs = model(img_tensor)
# loss = conv_outputs[:, 1] # class index 1 = pneumonia
# grads = tape.gradient(loss, conv_outputs)
# pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
# conv_outputs = conv_outputs[0]
# heatmap = conv_outputs @ pooled_grads[..., tf.newaxis]
# heatmap = tf.squeeze(heatmap)
# heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
# heatmap = tf.where(tf.math.is_nan(heatmap), tf.zeros_like(heatmap), heatmap)
# return heatmap.numpy()
# def create_custom_colormap():
# colors = ['blue', 'green', 'yellow', 'red']
# cmap = LinearSegmentedColormap.from_list('custom', colors, N=256)
# return cmap
# def apply_custom_colormap(heatmap, cmap):
# colored_heatmap = cmap(heatmap)
# return np.uint8(colored_heatmap * 255)
# def enhance_heatmap(heatmap, gamma=0.7, percentile=99):
# heatmap = np.power(heatmap, gamma)
# heatmap = heatmap / np.percentile(heatmap, percentile)
# return np.clip(heatmap, 0, 1)
# def generate_and_merge_heatmaps(img_path, vgg_model, efficientnet_model, densenet_model, img_size=(224, 224)):
# img_tensor = preprocess_image(img_path, img_size)
# vgg_heatmap = make_gradcam_heatmap(vgg_model, img_tensor)
# efficientnet_heatmap = make_gradcam_heatmap(efficientnet_model, img_tensor)
# densenet_heatmap = make_gradcam_heatmap(densenet_model, img_tensor)
# vgg_heatmap = cv2.resize(vgg_heatmap, img_size)
# efficientnet_heatmap = cv2.resize(efficientnet_heatmap, img_size)
# densenet_heatmap = cv2.resize(densenet_heatmap, img_size)
# merged = (vgg_heatmap + efficientnet_heatmap + densenet_heatmap) / 3.0
# enhanced = enhance_heatmap(merged)
# colored = apply_custom_colormap(enhanced, create_custom_colormap())
# original = cv2.imread(img_path)
# original = cv2.resize(original, img_size)
# original = cv2.cvtColor(original, cv2.COLOR_BGR2RGB)
# superimposed_img = cv2.addWeighted(original, 0.6, colored[:, :, :3], 0.4, 0)
# return superimposed_img
import numpy as np
from tf_explain.core.grad_cam import GradCAM
import tensorflow as tf
from tensorflow.keras.preprocessing.image import img_to_array
from PIL import Image
def generate_heatmap_tf_explain(image_pil, model, class_index, layer_name="block5_conv4"):
from tf_explain.core.grad_cam import GradCAM
# Preprocess image
img_array = np.array(image_pil.resize((224, 224))) / 255.0
img_array = np.expand_dims(img_array, axis=0)
# Reconstruct model to include target layer
from tensorflow.keras.models import Model
model_for_explanation = Model(inputs=model.input, outputs=model.output)
explainer = GradCAM()
explanation = explainer.explain(
validation_data=(img_array, None),
model=model_for_explanation,
class_index=class_index,
layer_name=layer_name
)
return Image.fromarray(explanation)