cflow-ad/visualize.py

148 lines
6.3 KiB
Python

import os
import datetime
import numpy as np
from skimage import morphology
from skimage.segmentation import mark_boundaries
import matplotlib.pyplot as plt
import matplotlib
from utils import *
OUT_DIR = './viz/'
norm = matplotlib.colors.Normalize(vmin=0.0, vmax=255.0)
cm = 1/2.54
dpi = 300
def denormalization(x, norm_mean, norm_std):
mean = np.array(norm_mean)
std = np.array(norm_std)
x = (((x.transpose(1, 2, 0) * std) + mean) * 255.).astype(np.uint8)
return x
def export_hist(c, gts, scores, threshold):
print('Exporting histogram...')
plt.rcParams.update({'font.size': 4})
image_dirs = os.path.join(OUT_DIR, c.model)
os.makedirs(image_dirs, exist_ok=True)
Y = scores.flatten()
Y_label = gts.flatten()
fig = plt.figure(figsize=(4*cm, 4*cm), dpi=dpi)
ax = plt.Axes(fig, [0., 0., 1., 1.])
fig.add_axes(ax)
plt.hist([Y[Y_label==1], Y[Y_label==0]], 500, density=True, color=['r', 'g'], label=['ANO', 'TYP'], alpha=0.75, histtype='barstacked')
image_file = os.path.join(image_dirs, 'hist_images_' + datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S"))
fig.savefig(image_file, dpi=dpi, format='svg', bbox_inches = 'tight', pad_inches = 0.0)
plt.close()
def export_groundtruth(c, test_img, gts):
image_dirs = os.path.join(OUT_DIR, c.model, 'gt_images_' + datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S"))
# images
if not os.path.isdir(image_dirs):
print('Exporting grountruth...')
os.makedirs(image_dirs, exist_ok=True)
num = len(test_img)
kernel = morphology.disk(4)
for i in range(num):
img = test_img[i]
img = denormalization(img, c.norm_mean, c.norm_std)
# gts
gt_mask = gts[i].astype(np.float64)
gt_mask = morphology.opening(gt_mask, kernel)
gt_mask = (255.0*gt_mask).astype(np.uint8)
gt_img = mark_boundaries(img, gt_mask, color=(1, 0, 0), mode='thick')
#
fig = plt.figure(figsize=(2*cm, 2*cm), dpi=dpi)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(gt_img)
image_file = os.path.join(image_dirs, '{:08d}'.format(i))
fig.savefig(image_file, dpi=dpi, format='svg', bbox_inches = 'tight', pad_inches = 0.0)
plt.close()
def export_scores(c, test_img, scores, threshold):
image_dirs = os.path.join(OUT_DIR, c.model, 'sc_images_' + datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S"))
# images
if not os.path.isdir(image_dirs):
print('Exporting scores...')
os.makedirs(image_dirs, exist_ok=True)
num = len(test_img)
kernel = morphology.disk(4)
scores_norm = 1.0/scores.max()
for i in range(num):
img = test_img[i]
img = denormalization(img, c.norm_mean, c.norm_std)
# scores
score_mask = np.zeros_like(scores[i])
score_mask[scores[i] > threshold] = 1.0
score_mask = morphology.opening(score_mask, kernel)
score_mask = (255.0*score_mask).astype(np.uint8)
score_img = mark_boundaries(img, score_mask, color=(1, 0, 0), mode='thick')
score_map = (255.0*scores[i]*scores_norm).astype(np.uint8)
#
fig_img, ax_img = plt.subplots(2, 1, figsize=(2*cm, 4*cm))
for ax_i in ax_img:
ax_i.axes.xaxis.set_visible(False)
ax_i.axes.yaxis.set_visible(False)
ax_i.spines['top'].set_visible(False)
ax_i.spines['right'].set_visible(False)
ax_i.spines['bottom'].set_visible(False)
ax_i.spines['left'].set_visible(False)
#
plt.subplots_adjust(hspace = 0.1, wspace = 0.1)
ax_img[0].imshow(img, cmap='gray', interpolation='none')
ax_img[0].imshow(score_map, cmap='jet', norm=norm, alpha=0.5, interpolation='none')
ax_img[1].imshow(score_img)
image_file = os.path.join(image_dirs, '{:08d}'.format(i))
fig_img.savefig(image_file, dpi=dpi, format='svg', bbox_inches = 'tight', pad_inches = 0.0)
plt.close()
def export_test_images(c, test_img, gts, scores, threshold):
image_dirs = os.path.join(OUT_DIR, c.model, 'images_' + datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S"))
cm = 1/2.54
# images
if not os.path.isdir(image_dirs):
print('Exporting images...')
os.makedirs(image_dirs, exist_ok=True)
num = len(test_img)
font = {'family': 'serif', 'color': 'black', 'weight': 'normal', 'size': 8}
kernel = morphology.disk(4)
scores_norm = 1.0/scores.max()
for i in range(num):
img = test_img[i]
img = denormalization(img, c.norm_mean, c.norm_std)
# gts
gt_mask = gts[i].astype(np.float64)
print('GT:', i, gt_mask.sum())
gt_mask = morphology.opening(gt_mask, kernel)
gt_mask = (255.0*gt_mask).astype(np.uint8)
gt_img = mark_boundaries(img, gt_mask, color=(1, 0, 0), mode='thick')
# scores
score_mask = np.zeros_like(scores[i])
score_mask[scores[i] > threshold] = 1.0
print('SC:', i, score_mask.sum())
score_mask = morphology.opening(score_mask, kernel)
score_mask = (255.0*score_mask).astype(np.uint8)
score_img = mark_boundaries(img, score_mask, color=(1, 0, 0), mode='thick')
score_map = (255.0*scores[i]*scores_norm).astype(np.uint8)
#
fig_img, ax_img = plt.subplots(3, 1, figsize=(2*cm, 6*cm))
for ax_i in ax_img:
ax_i.axes.xaxis.set_visible(False)
ax_i.axes.yaxis.set_visible(False)
ax_i.spines['top'].set_visible(False)
ax_i.spines['right'].set_visible(False)
ax_i.spines['bottom'].set_visible(False)
ax_i.spines['left'].set_visible(False)
#
plt.subplots_adjust(hspace = 0.1, wspace = 0.1)
ax_img[0].imshow(gt_img)
ax_img[1].imshow(score_map, cmap='jet', norm=norm)
ax_img[2].imshow(score_img)
image_file = os.path.join(image_dirs, '{:08d}'.format(i))
fig_img.savefig(image_file, dpi=dpi, format='svg', bbox_inches = 'tight', pad_inches = 0.0)
plt.close()