AndreasLH's picture
upload repo
56bd2b5
# Copyright (c) Meta Platforms, Inc. and affiliates
import warnings
warnings.filterwarnings("ignore", message="Overwriting tiny_vit_21m_512 in registry")
warnings.filterwarnings("ignore", message="Overwriting tiny_vit_21m_384 in registry")
warnings.filterwarnings("ignore", message="Overwriting tiny_vit_21m_224 in registry")
warnings.filterwarnings("ignore", message="Overwriting tiny_vit_11m_224 in registry")
warnings.filterwarnings("ignore", message="Overwriting tiny_vit_5m_224 in registry")
import os
import numpy as np
import torch
import pickle
from matplotlib import pyplot as plt
from matplotlib.patches import PathPatch
from matplotlib.path import Path
def create_striped_patch(ax, x_start, x_end, color, alpha=0.3):
ylim = ax.get_ylim()
stripe_height = (ylim[1] - ylim[0]) / 20 # Adjust stripe height as needed
vertices = []
codes = []
for y in np.arange(ylim[0], ylim[1], stripe_height * 2):
vertices.extend([(x_start, y), (x_end, y + stripe_height), (x_end, y + stripe_height * 2), (x_start, y + stripe_height)])
codes.extend([Path.MOVETO, Path.LINETO, Path.LINETO, Path.LINETO])
path = Path(vertices, codes)
patch = PathPatch(path, facecolor=color, edgecolor='none', alpha=alpha, hatch='/')
ax.add_patch(patch)
color_palette = ['#008dff','#ff73bf','#c701ff','#4ecb8d','#ff9d3a','#f0c571','#384860','#d83034']
proposal_function = 'full'
print('loading ...')
with open('output/pkl_files/outputs_'+str(proposal_function)+'.pkl', 'rb') as file:
outputs = pickle.load(file)
print('... done')
# Create output folder
if not os.path.exists('ProposalNetwork/output/MABO_'+str(proposal_function)):
os.makedirs('ProposalNetwork/output/MABO_'+str(proposal_function)) # This is maybe unnecessary
os.makedirs('ProposalNetwork/output/MABO_'+str(proposal_function)+'/vis/')
# mean over all the outputs
Iou2D = np.concatenate([np.array(sublist) for sublist in (x[1] for x in outputs)])
score_seg = np.concatenate([np.array(sublist) for sublist in (x[2] for x in outputs)])
score_dim = np.concatenate([np.array(sublist) for sublist in (x[3] for x in outputs)])
score_combined = np.concatenate([np.array(sublist) for sublist in (x[4] for x in outputs)])
score_random = np.concatenate([np.array(sublist) for sublist in (x[5] for x in outputs)])
score_point_cloud = np.concatenate([np.array(sublist) for sublist in (x[6] for x in outputs)])
score_seg_mod = np.concatenate([np.array(sublist) for sublist in (x[10] for x in outputs)])
score_corners = np.concatenate([np.array(sublist) for sublist in (x[11] for x in outputs)])
stat_empty_boxes = np.array([x[7] for x in outputs])
combinations = np.mean(np.concatenate([np.array(sublist) for sublist in (x[12] for x in outputs)]),axis=0)
#logger.info('Percentage of cubes with no intersection:',np.mean(stat_empty_boxes))
print('Percentage of cubes with no intersection:',np.mean(stat_empty_boxes))
print('combination scores:',combinations)
print('best combination is C'+str(np.argmax(combinations)+1))
Iou2D = Iou2D.mean(axis=0)
score_seg = score_seg.mean(axis=0)
score_dim = score_dim.mean(axis=0)
score_combined = score_combined.mean(axis=0)
score_random = score_random.mean(axis=0)
score_point_cloud = score_point_cloud.mean(axis=0)
score_seg_mod = score_seg_mod.mean(axis=0)
score_corners = score_corners.mean(axis=0)
total_num_instances = np.sum([x[0].gt_boxes3D.shape[0] for x in outputs])
print('Avg IoU of chosen cube:', score_combined[0])
print('Best possible IoU:', score_combined[-1])
x_range = np.arange(1,1001)
plt.figure(figsize=(8,5))
plt.plot(x_range,score_combined, linestyle='-',c=color_palette[6], label='combined')
plt.plot(x_range,Iou2D, linestyle='-',c=color_palette[4],label='2D IoU')
plt.plot(x_range,score_seg_mod, linestyle='-',c=color_palette[0],label='mod. segment')
plt.plot(x_range,score_corners, linestyle='-',c=color_palette[7],label='corner dist.')
plt.plot(x_range,score_seg, linestyle='-',c=color_palette[2],label='segment')
plt.plot(x_range,score_dim, linestyle='-',c=color_palette[5],label='dimensions')
plt.plot(x_range,score_random, linestyle='-',c='grey',label='random')
plt.plot(x_range,score_point_cloud, linestyle='-',c=color_palette[3],label='point cloud')
plt.grid(True)
plt.xscale('log')
plt.xticks([1, 10, 100, 1000], ['1', '10', '100', '1000'])
plt.xlim(left=1, right=len(Iou2D))
plt.xlabel('Number of Proposals')
plt.ylabel('3D IoU')
plt.legend()
plt.title('Average Best Overlap vs Number of Proposals ({} images, {} instances)'.format(4815,total_num_instances))
f_name = os.path.join('ProposalNetwork/output/MABO_'+str(proposal_function), 'MABO_'+str(proposal_function)+'.png')
plt.savefig(f_name, dpi=300, bbox_inches='tight')
plt.close()
print('saved to ', f_name)
# Statistics
stats = torch.cat([x[8] for x in outputs],dim=0)
print('Percentage inside searched area:', ((stats >= 0) & (stats <= 1)).float().mean(dim=0) * 100)
num_bins = 40
titles = ['x','y','z']
plt.figure(figsize=(15, 5))
plt.suptitle("Distribution of Ground Truths in Normalised Searched Range", fontsize=20)
for i,title in enumerate(titles):
ax = plt.subplot(1, 3, 1+i)
plt.hist(stats[:,i].numpy(), bins=num_bins, color=color_palette[6],density=True, zorder=2)
plt.axvline(x=0, color='#97a6c4',zorder=2)
plt.axvline(x=1, color='#97a6c4',zorder=2)
create_striped_patch(ax, 0, 1, '#97a6c4', alpha=0.8)
plt.title(title)
f_name = os.path.join('ProposalNetwork/output/MABO_'+str(proposal_function), 'stats_center_'+str(proposal_function)+'.png')
plt.savefig(f_name, dpi=300, bbox_inches='tight')
plt.close()
print('saved to ', f_name)
if proposal_function == 'xy' or proposal_function == 'z':
num_bins = [600,300,200]
elif proposal_function == 'dim' or proposal_function == 'rotation' or proposal_function == 'full':
num_bins = [300,700,70]
else:
num_bins = [200, 200, 200]
plt.figure(figsize=(15, 5))
plt.suptitle("Distribution of Ground Truths in Normalised Searched Range", fontsize=20)
for i,title in enumerate(titles):
ax = plt.subplot(1, 3, 1+i)
plt.hist(stats[:,i].numpy(), bins=num_bins[i], color=color_palette[6],density=True, zorder=2)
plt.axvline(x=0, color='#97a6c4', zorder=2)
plt.axvline(x=1, color='#97a6c4', zorder=2)
create_striped_patch(ax, 0, 1, '#97a6c4', alpha=0.8)
plt.xlim([max(-1,min(stats[:,i])),min(2,max(stats[:,i]))])
plt.title(title)
f_name = os.path.join('ProposalNetwork/output/MABO_'+str(proposal_function), 'stats_center_zoom_'+str(proposal_function)+'.png')
plt.savefig(f_name, dpi=300, bbox_inches='tight')
plt.close()
print('saved to ', f_name)
num_bins = 40
titles = ['w','h','l']
plt.figure(figsize=(15, 5))
plt.suptitle("Distribution of Ground Truths in Normalised Searched Range", fontsize=20)
for i,title in enumerate(titles):
ax = plt.subplot(1, 3, 1+i)
plt.hist(stats[:,3+i].numpy(), bins=num_bins, color=color_palette[6],density=True, zorder=2)
plt.axvline(x=0, color='#97a6c4', zorder=2)
plt.axvline(x=1, color='#97a6c4', zorder=2)
create_striped_patch(ax, 0, 1, '#97a6c4', alpha=0.8)
plt.title(title)
f_name = os.path.join('ProposalNetwork/output/MABO_'+str(proposal_function), 'stats_dim_'+str(proposal_function)+'.png')
plt.savefig(f_name, dpi=300, bbox_inches='tight')
plt.close()
print('saved to ', f_name)
if proposal_function == 'rotation' or proposal_function == 'aspect':
num_bins = [120,90,130]
plt.figure(figsize=(15, 5))
plt.suptitle("Distribution of Ground Truths in Normalised Searched Range", fontsize=20)
for i,title in enumerate(titles):
ax = plt.subplot(1, 3, 1+i)
plt.hist(stats[:,3+i].numpy(), bins=num_bins[i], color=color_palette[6],density=True, zorder=2)
plt.axvline(x=0, color='#97a6c4', zorder=2)
plt.axvline(x=1, color='#97a6c4', zorder=2)
create_striped_patch(ax, 0, 1, '#97a6c4', alpha=0.8)
plt.xlim([max(-0.2,min(stats[:,i])),min(1.5,max(stats[:,i]))])
plt.title(title)
f_name = os.path.join('ProposalNetwork/output/MABO_'+str(proposal_function), 'stats_dim_zoom_'+str(proposal_function)+'.png')
plt.savefig(f_name, dpi=300, bbox_inches='tight')
plt.close()
print('saved to ', f_name)
num_bins = 40
titles = ['rx','ry','rz']
plt.figure(figsize=(15, 5))
plt.suptitle("Distribution of Ground Truths in Normalised Searched Range", fontsize=20)
for i,title in enumerate(titles):
ax = plt.subplot(1, 3, 1+i)
plt.hist(stats[:,6+i].numpy(), bins=num_bins, color=color_palette[6],density=True, zorder=2)
plt.axvline(x=0, color='#97a6c4', zorder=2)
plt.axvline(x=1, color='#97a6c4', zorder=2)
create_striped_patch(ax, 0, 1, '#97a6c4', alpha=0.8)
plt.title(title)
f_name = os.path.join('ProposalNetwork/output/MABO_'+str(proposal_function), 'stats_rot_'+str(proposal_function)+'.png')
plt.savefig(f_name, dpi=300, bbox_inches='tight')
plt.close()
print('saved to ', f_name)
titles = ['x','y','z','w','h','l','rx','ry','rz']
stats_off = np.concatenate([np.array(sublist) for sublist in (x[9] for x in outputs)])
plt.figure(figsize=(15, 15))
for i,title in enumerate(titles):
plt.subplot(3, 3, 1+i)
plt.scatter(stats_off[:,1+i],stats_off[:,0], color=color_palette[6])
plt.title(title)
f_name = os.path.join('ProposalNetwork/output/MABO_'+str(proposal_function), 'stats_off_'+str(proposal_function)+'.png')
plt.savefig(f_name, dpi=300, bbox_inches='tight')
plt.close()
print('saved to ', f_name)
plt.figure(figsize=(15, 15))
for i,title in enumerate(titles):
plt.subplot(3, 3, 1+i)
plt.scatter(stats_off[:,1+i],stats_off[:,0], color=color_palette[6])
plt.title(title)
plt.xlim([0,2])
plt.ylim([0,1])
f_name = os.path.join('ProposalNetwork/output/MABO_'+str(proposal_function), 'stats_off_zoom_'+str(proposal_function)+'.png')
plt.savefig(f_name, dpi=300, bbox_inches='tight')
plt.close()
print('saved to ', f_name)