Segment-Any-Anomaly / utils /visualization.py
cyk
SAA+
32faf2b
import cv2
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
import os
import seaborn as sns
##
from sklearn.manifold import TSNE
from sklearn.decomposition import PCA
##
import matplotlib.ticker as mtick
def plot_sample_cv2(names, imgs, scores_: dict, gts, save_folder=None):
# get subplot number
total_number = len(imgs)
scores = scores_.copy()
# normarlisze anomalies
for k, v in scores.items():
max_value = np.max(v)
min_value = np.min(v)
scores[k] = (scores[k] - min_value) / max_value * 255
scores[k] = scores[k].astype(np.uint8)
# draw gts
mask_imgs = []
for idx in range(total_number):
gts_ = gts[idx]
mask_imgs_ = imgs[idx].copy()
mask_imgs_[gts_ > 0.5] = (0, 0, 255)
mask_imgs.append(mask_imgs_)
# save imgs
for idx in range(total_number):
cv2.imwrite(os.path.join(save_folder, f'{names[idx]}_ori.jpg'), imgs[idx])
cv2.imwrite(os.path.join(save_folder, f'{names[idx]}_gt.jpg'), mask_imgs[idx])
for key in scores:
heat_map = cv2.applyColorMap(scores[key][idx], cv2.COLORMAP_JET)
visz_map = cv2.addWeighted(heat_map, 0.5, imgs[idx], 0.5, 0)
cv2.imwrite(os.path.join(save_folder, f'{names[idx]}_{key}.jpg'),
visz_map)
def plot_anomaly_score_distributions(scores: dict, ground_truths_list, save_folder, class_name):
ground_truths = np.stack(ground_truths_list, axis=0)
N_COUNT = 100000
for k, v in scores.items():
layer_score = np.stack(v, axis=0)
normal_score = layer_score[ground_truths == 0]
abnormal_score = layer_score[ground_truths != 0]
plt.clf()
plt.figure(figsize=(4, 3))
ax = plt.gca()
ax.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2f'))
ax.xaxis.set_major_formatter(mtick.FormatStrFormatter('%.2f'))
# with plt.style.context(['science', 'ieee', 'no-latex']):
sns.histplot(np.random.choice(normal_score, N_COUNT), color="green", bins=50, label='${d(p_n)}$',
stat='probability', alpha=.75)
sns.histplot(np.random.choice(abnormal_score, N_COUNT), color="red", bins=50, label='${d(p_a)}$',
stat='probability', alpha=.75)
plt.xlim([0, 3])
save_path = os.path.join(save_folder, f'distributions_{class_name}_{k}.jpg')
plt.savefig(save_path, bbox_inches='tight', dpi=300)
valid_feature_visualization_methods = ['TSNE', 'PCA']
def visualize_feature(features, labels, legends, n_components=3, method='TSNE'):
assert method in valid_feature_visualization_methods
assert n_components in [2, 3]
if method == 'TSNE':
model = TSNE(n_components=n_components)
elif method == 'PCA':
model = PCA(n_components=n_components)
else:
raise NotImplementedError
feat_proj = model.fit_transform(features)
if n_components == 2:
ax = scatter_2d(feat_proj, labels)
elif n_components == 3:
ax = scatter_3d(feat_proj, labels)
else:
raise NotImplementedError
plt.legend(legends)
plt.axis('off')
def scatter_3d(feat_proj, label):
plt.clf()
ax1 = plt.axes(projection='3d')
label_unique = np.unique(label)
for l in label_unique:
ax1.scatter3D(feat_proj[label == l, 0],
feat_proj[label == l, 1],
feat_proj[label == l, 2], s=5)
return ax1
def scatter_2d(feat_proj, label):
plt.clf()
ax1 = plt.axes()
label_unique = np.unique(label)
for l in label_unique:
ax1.scatter(feat_proj[label == l, 0],
feat_proj[label == l, 1], s=5)
return ax1