# 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)