|
|
""" |
|
|
Vis utilities. Code adapted from LOST: https://github.com/valeoai/LOST |
|
|
""" |
|
|
import cv2 |
|
|
import numpy as np |
|
|
from PIL import Image |
|
|
import cv2 |
|
|
import scipy |
|
|
import numpy as np |
|
|
import torch |
|
|
import torch.nn as nn |
|
|
|
|
|
from utils import unnormalize_images |
|
|
import matplotlib.pyplot as plt |
|
|
|
|
|
def visualize_img(image): |
|
|
image = image.clone().detach().cpu().numpy() |
|
|
|
|
|
print(f'image shape: {image.shape}') |
|
|
image = np.uint8(image*256) |
|
|
cv2.imwrite('./test/test_img.png', image) |
|
|
|
|
|
def visualize_fms(image, mask, seed, im_name, dim, scales, folder, save=True): |
|
|
w_featmap, h_featmap = dim |
|
|
image = image.clone().detach().cpu().numpy() |
|
|
image = np.uint8(np.transpose(image, (1,2,0))*256) |
|
|
mask = mask.reshape(w_featmap,h_featmap) |
|
|
|
|
|
mask = mask.reshape(w_featmap*h_featmap) |
|
|
mask[seed] = 3 |
|
|
mask = mask.reshape(w_featmap, h_featmap) |
|
|
mask = scipy.ndimage.zoom(mask, scales, order=0, mode='nearest') |
|
|
if save: |
|
|
pltname1 = f"{folder}/LOST_{im_name}.png" |
|
|
|
|
|
cv2.imwrite(pltname1, image) |
|
|
|
|
|
pltname2 = f"{folder}/Mask_{im_name}.png" |
|
|
plt.imsave(fname=pltname2, arr=mask) |
|
|
|
|
|
|
|
|
def visualize_eigvec(eigvec, folder, im_name, dim, scales, save=True): |
|
|
print(f'eigvec shape: {eigvec.shape}, scales: {scales}, dim: {dim}') |
|
|
eigvec = scipy.ndimage.zoom(eigvec, scales, order=0, mode='nearest') |
|
|
if save: |
|
|
pltname= f"{folder}/{im_name}_ours_att.jpg" |
|
|
plt.imsave(fname=pltname, arr=eigvec, cmap='cividis') |
|
|
|
|
|
def visualize_predictions_gt(image, pred, gt, im_name, seed, dim, scales, folder, output_name='ours_box', save=True): |
|
|
""" |
|
|
Visualization of the predicted box and the corresponding seed patch. |
|
|
""" |
|
|
image = unnormalize_images(image) |
|
|
image = image[0].clone().detach().cpu().numpy() |
|
|
image = np.transpose(image, (1,2,0)) |
|
|
image = np.uint8(image*256) |
|
|
image = np.ascontiguousarray(image, dtype=np.uint8) |
|
|
|
|
|
|
|
|
cv2.rectangle( |
|
|
image, |
|
|
(int(pred[0]), int(pred[1])), |
|
|
(int(pred[2]), int(pred[3])), |
|
|
(255, 0, 0), 2 |
|
|
) |
|
|
|
|
|
if len(gt>1): |
|
|
for i in range(len(gt)): |
|
|
cv2.rectangle( |
|
|
image, |
|
|
(int(gt[i][0]), int(gt[i][1])), |
|
|
(int(gt[i][2]), int(gt[i][3])), |
|
|
(0, 0, 255), 3, |
|
|
) |
|
|
|
|
|
if save: |
|
|
pltname = f"{folder}/{im_name}_{output_name}.jpg" |
|
|
Image.fromarray(image).save(pltname) |
|
|
|
|
|
return image |
|
|
|
|
|
def visualize_attn_LOST(A, dims, scales, folder, im_name): |
|
|
""" |
|
|
Visualization of the maps presented in Figure 2 of the paper. |
|
|
""" |
|
|
w_featmap, h_featmap = dims |
|
|
|
|
|
|
|
|
binA = A.copy() |
|
|
binA[binA < 0] = 0 |
|
|
binA[binA > 0] = 1 |
|
|
|
|
|
|
|
|
im_deg = ( |
|
|
nn.functional.interpolate( |
|
|
torch.from_numpy(1 / binA.sum(-1)).reshape(1, 1, w_featmap, h_featmap), |
|
|
scale_factor=scales, |
|
|
mode="nearest", |
|
|
)[0][0].cpu().numpy() |
|
|
) |
|
|
plt.imsave(fname=f"{folder}/{im_name}_lost_attn.jpg", arr=im_deg, cmap='cividis') |
|
|
|
|
|
|