Spaces:
Runtime error
Runtime error
| # 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) |