|
|
|
|
|
|
|
|
|
|
|
""" Misc helper functions """ |
|
|
|
import subprocess |
|
|
|
import cv2 |
|
import numpy as np |
|
import torch |
|
import torchvision.transforms as transforms |
|
|
|
|
|
class NormalizeInverse(transforms.Normalize): |
|
|
|
|
|
def __init__(self, mean, std): |
|
mean = torch.as_tensor(mean) |
|
std = torch.as_tensor(std) |
|
std_inv = 1 / (std + 1e-7) |
|
mean_inv = -mean * std_inv |
|
super(NormalizeInverse, self).__init__(mean=mean_inv, std=std_inv) |
|
|
|
def __call__(self, tensor): |
|
return super(NormalizeInverse, self).__call__(tensor.clone()) |
|
|
|
|
|
def create_folder(folder_name): |
|
try: |
|
subprocess.call(["mkdir", "-p", folder_name]) |
|
except OSError: |
|
None |
|
|
|
|
|
def save_saliency_map(image, saliency_map, filename): |
|
""" |
|
Save saliency map on image. |
|
|
|
Args: |
|
image: Tensor of size (3,H,W) |
|
saliency_map: Tensor of size (1,H,W) |
|
filename: string with complete path and file extension |
|
|
|
""" |
|
|
|
image = image.data.cpu().numpy() |
|
saliency_map = saliency_map.data.cpu().numpy() |
|
|
|
saliency_map = saliency_map - saliency_map.min() |
|
saliency_map = saliency_map / saliency_map.max() |
|
saliency_map = saliency_map.clip(0, 1) |
|
|
|
saliency_map = np.uint8(saliency_map * 255).transpose(1, 2, 0) |
|
saliency_map = cv2.resize(saliency_map, (224, 224)) |
|
|
|
image = np.uint8(image * 255).transpose(1, 2, 0) |
|
image = cv2.resize(image, (224, 224)) |
|
|
|
|
|
color_heatmap = cv2.applyColorMap(saliency_map, cv2.COLORMAP_JET) |
|
|
|
|
|
img_with_heatmap = np.float32(color_heatmap) + np.float32(image) |
|
img_with_heatmap = img_with_heatmap / np.max(img_with_heatmap) |
|
|
|
cv2.imwrite(filename, np.uint8(255 * img_with_heatmap)) |
|
|