def dump_results(end_points, dump_dir, config, inference_switch=False): ''' Dump results. Args: end_points: dict {..., pred_mask} pred_mask is a binary mask array of size (batch_size, num_proposal) computed by running NMS and empty box removal Returns: None ''' if not os.path.exists(dump_dir): os.system('mkdir %s'%(dump_dir)) # INPUT point_clouds = end_points['point_clouds'].cpu().numpy() batch_size = point_clouds.shape[0] # NETWORK OUTPUTS seed_xyz = end_points['seed_xyz'].detach().cpu().numpy() # (B,num_seed,3) if 'vote_xyz' in end_points: aggregated_vote_xyz = end_points['aggregated_vote_xyz'].detach().cpu().numpy() vote_xyz = end_points['vote_xyz'].detach().cpu().numpy() # (B,num_seed,3) aggregated_vote_xyz = end_points['aggregated_vote_xyz'].detach().cpu().numpy() objectness_scores = end_points['objectness_scores'].detach().cpu().numpy() # (B,K,2) pred_center = end_points['center'].detach().cpu().numpy() # (B,K,3) pred_heading_class = torch.argmax(end_points['heading_scores'], -1) # B,num_proposal pred_heading_residual = torch.gather(end_points['heading_residuals'], 2, pred_heading_class.unsqueeze(-1)) # B,num_proposal,1 pred_heading_class = pred_heading_class.detach().cpu().numpy() # B,num_proposal pred_heading_residual = pred_heading_residual.squeeze(2).detach().cpu().numpy() # B,num_proposal pred_size_class = torch.argmax(end_points['size_scores'], -1) # B,num_proposal pred_size_residual = torch.gather(end_points['size_residuals'], 2, pred_size_class.unsqueeze(-1).unsqueeze(-1).repeat(1,1,1,3)) # B,num_proposal,1,3 pred_size_residual = pred_size_residual.squeeze(2).detach().cpu().numpy() # B,num_proposal,3 # OTHERS pred_mask = end_points['pred_mask'] # B,num_proposal idx_beg = 0 for i in range(batch_size): pc = point_clouds[i,:,:] objectness_prob = softmax(objectness_scores[i,:,:])[:,1] # (K,) # Dump various point clouds pc_util.write_ply(pc, os.path.join(dump_dir, '%06d_pc.ply'%(idx_beg+i))) pc_util.write_ply(seed_xyz[i,:,:], os.path.join(dump_dir, '%06d_seed_pc.ply'%(idx_beg+i))) #pc_util.write_ply_rgb(pc[:,0:3], (pc[:,3:]*256).astype(np.int8),os.path.join(dump_dir, '%06d_rgb_pc.ply'%(idx_beg+i))) #jason color if 'vote_xyz' in end_points: pc_util.write_ply(end_points['vote_xyz'][i,:,:], os.path.join(dump_dir, '%06d_vgen_pc.ply'%(idx_beg+i))) pc_util.write_ply(aggregated_vote_xyz[i,:,:], os.path.join(dump_dir, '%06d_aggregated_vote_pc.ply'%(idx_beg+i))) pc_util.write_ply(aggregated_vote_xyz[i,:,:], os.path.join(dump_dir, '%06d_aggregated_vote_pc.ply'%(idx_beg+i))) pc_util.write_ply(pred_center[i,:,0:3], os.path.join(dump_dir, '%06d_proposal_pc.ply'%(idx_beg+i))) if np.sum(objectness_prob>DUMP_CONF_THRESH)>0: pc_util.write_ply(pred_center[i,objectness_prob>DUMP_CONF_THRESH,0:3], os.path.join(dump_dir, '%06d_confident_proposal_pc.ply'%(idx_beg+i))) # Dump predicted bounding boxes if np.sum(objectness_prob>DUMP_CONF_THRESH)>0: num_proposal = pred_center.shape[1] obbs = [] for j in range(num_proposal): obb = config.param2obb(pred_center[i,j,0:3], pred_heading_class[i,j], pred_heading_residual[i,j], pred_size_class[i,j], pred_size_residual[i,j]) obbs.append(obb) if len(obbs)>0: obbs = np.vstack(tuple(obbs)) # (num_proposal, 7) pc_util.write_oriented_bbox(obbs[objectness_prob>DUMP_CONF_THRESH,:], os.path.join(dump_dir, '%06d_pred_confident_bbox.ply'%(idx_beg+i))) pc_util.write_oriented_bbox(obbs[np.logical_and(objectness_prob>DUMP_CONF_THRESH, pred_mask[i,:]==1),:], os.path.join(dump_dir, '%06d_pred_confident_nms_bbox.ply'%(idx_beg+i))) pc_util.write_oriented_bbox(obbs[pred_mask[i,:]==1,:], os.path.join(dump_dir, '%06d_pred_nms_bbox.ply'%(idx_beg+i))) pc_util.write_oriented_bbox(obbs, os.path.join(dump_dir, '%06d_pred_bbox.ply'%(idx_beg+i))) # Return if it is at inference time. No dumping of groundtruths if inference_switch: return # LABELS gt_center = end_points['center_label'].cpu().numpy() # (B,MAX_NUM_OBJ,3) gt_mask = end_points['box_label_mask'].cpu().numpy() # B,K2 gt_heading_class = end_points['heading_class_label'].cpu().numpy() # B,K2 gt_heading_residual = end_points['heading_residual_label'].cpu().numpy() # B,K2 gt_size_class = end_points['size_class_label'].cpu().numpy() # B,K2 gt_size_residual = end_points['size_residual_label'].cpu().numpy() # B,K2,3 objectness_label = end_points['objectness_label'].detach().cpu().numpy() # (B,K,) objectness_mask = end_points['objectness_mask'].detach().cpu().numpy() # (B,K,) for i in range(batch_size): if np.sum(objectness_label[i,:])>0: pc_util.write_ply(pred_center[i,objectness_label[i,:]>0,0:3], os.path.join(dump_dir, '%06d_gt_positive_proposal_pc.ply'%(idx_beg+i))) if np.sum(objectness_mask[i,:])>0: pc_util.write_ply(pred_center[i,objectness_mask[i,:]>0,0:3], os.path.join(dump_dir, '%06d_gt_mask_proposal_pc.ply'%(idx_beg+i))) pc_util.write_ply(gt_center[i,:,0:3], os.path.join(dump_dir, '%06d_gt_centroid_pc.ply'%(idx_beg+i))) pc_util.write_ply_color(pred_center[i,:,0:3], objectness_label[i,:], os.path.join(dump_dir, '%06d_proposal_pc_objectness_label.obj'%(idx_beg+i))) # Dump GT bounding boxes obbs = [] for j in range(gt_center.shape[1]): if gt_mask[i,j] == 0: continue obb = config.param2obb(gt_center[i,j,0:3], gt_heading_class[i,j], gt_heading_residual[i,j], gt_size_class[i,j], gt_size_residual[i,j]) obbs.append(obb) if len(obbs)>0: obbs = np.vstack(tuple(obbs)) # (num_gt_objects, 7) pc_util.write_oriented_bbox(obbs, os.path.join(dump_dir, '%06d_gt_bbox.ply'%(idx_beg+i))) # OPTIONALL, also dump prediction and gt details if 'batch_pred_map_cls' in end_points: for ii in range(batch_size): fout = open(os.path.join(dump_dir, '%06d_pred_map_cls.txt'%(ii)), 'w') for t in end_points['batch_pred_map_cls'][ii]: fout.write(str(t[0])+' ') fout.write(",".join([str(x) for x in list(t[1].flatten())])) fout.write(' '+str(t[2])) fout.write('\n') fout.close() if 'batch_gt_map_cls' in end_points: for ii in range(batch_size): fout = open(os.path.join(dump_dir, '%06d_gt_map_cls.txt'%(ii)), 'w') for t in end_points['batch_gt_map_cls'][ii]: fout.write(str(t[0])+' ') fout.write(",".join([str(x) for x in list(t[1].flatten())])) fout.write('\n') fout.close()
# -*- coding: utf-8 -*- import os import sys import numpy as np import pc_util BASE_DIR = os.path.dirname(__file__) sys.path.append(BASE_DIR) sys.path.append(os.path.join(BASE_DIR, "../")) data = np.load("scannet_scenes/scene0001_01.npy") scene_points = data[:, 0:3] colors = data[:, 3:6] instance_labels = data[:, 6] semantic_labels = data[:, 7] output_folder = "demo_output" if not os.path.exists(output_folder): os.mkdir(output_folder) # Write scene as OBJ file for visualization pc_util.write_ply_rgb(scene_points, colors, os.path.join(output_folder, "scene.obj")) pc_util.write_ply_color(scene_points, instance_labels, os.path.join(output_folder, "scene_instance.obj")) pc_util.write_ply_color(scene_points, semantic_labels, os.path.join(output_folder, "scene_semantic.obj"))
def build_website_from_mmdet3d_without_pred(cat, level, annotations, dataset_dir, output_dir, part_name_list): dataset_path = Path(dataset_dir) item_dir = osp.join(output_dir, 'item') shutil.rmtree(output_dir, True) mmcv.mkdir_or_exist(item_dir) num = len(annotations) num = 10 table = [] item_file_format = """<a href="./item/{page_name}" title="{page_title}"> {page_title} </a>""" color_map_item_format = """<h2 style="display:block"> <span style = "color:{color_name}"> {class_name} </span> </h2>""" bar = ProgressBar() for i in bar(range(num)): annotation = annotations[i] gt_box = annotation['annos']['gt_boxes_upright_depth'] num_gt_box = annotation['annos']['gt_num'] box_class = annotation['annos']['class'] point_file = annotation['pts_path'] instance_file = annotation['pts_instance_mask_path'] sem_file = annotation['pts_semantic_mask_path'] #annotation['class'] #annotation['name'] point_file = str(dataset_path / point_file) sem_file = str(dataset_path / instance_file) instance_file = str(dataset_path / instance_file) point = np.fromfile(point_file, np.float32).reshape(-1, 3) #print(point.shape, point_file) #exit(0) #sem = np.fromfile(sem_file).astype(int) instance = np.fromfile(instance_file, np.long) pi_path = osp.join(item_dir, f'point_instance_{i}.ply') bbox_path = osp.join(item_dir, f'gt_box_{i}.ply') json_bbox_path = osp.join(item_dir, f'gt_box_{i}.json') gt_box[:, -3:] *= 1.01 colors = write_bbox_color_json(gt_box, box_class, json_bbox_path) write_bbox_color(gt_box, box_class, bbox_path) write_ply_color(point, instance, pi_path) def rgb_to_hex(rgb): ans = '#%02x%02x%02x' % (rgb[0], rgb[1], rgb[2]) return ans rpi_path = osp.relpath(pi_path, item_dir) rbbox_path = osp.relpath(bbox_path, item_dir) rjbbox_path = osp.relpath(json_bbox_path, item_dir) next_page_rel_path = osp.relpath( osp.join(item_dir, f'{(i + 1) % num}.html'), item_dir) last_page_rel_path = osp.relpath( osp.join(item_dir, f'{(i - 1 + num) % num}.html'), item_dir) table.append([ item_file_format.format(page_name=f'{i}.html', page_title=f'Instance {i}') ] + [0 for i in range(len(part_name_list))]) color_item = '' for label in colors: c = rgb_to_hex(colors[label]) l = part_name_list[label] color_item = color_item + color_map_item_format.format( color_name=c, class_name=l) html_from_template(item_template, out_file=osp.join(item_dir, f'{i}.html'), file_path=f"'{rpi_path}', '{rjbbox_path}'", file_name="'pc_instance', 'gt_box'", file_type="'pcd', 'json_box'", color_map=color_item, last_page=last_page_rel_path, next_page=next_page_rel_path) df = pd.DataFrame(table, columns=['Obj'] + part_name_list) main_table = df.to_html(escape=False, classes="table sortable is-striped is-hoverable", border=0, index=False) html_from_template(table_template, out_file=osp.join(output_dir, 'main_page.html'), table_string=main_table, type=f'{cat}-{level}')
def build_website_from_mmdet3d(cat, level, annotations, dataset_dir, output_dir, pred, part_name_list, iou_th=(0.5, )): ret_dict, (aps, precisions, recalls, aabb_ious) = evaluate(annotations, pred, part_name_list, iou_th) #print(ret_dict) #exit(0) dataset_path = Path(dataset_dir) item_dir = osp.join(output_dir, 'item') shutil.rmtree(output_dir, True) mmcv.mkdir_or_exist(item_dir) num = len(annotations) #num = 10 table = [] data_name = [] overall_string = "" for j, part_name in enumerate(part_name_list): data_name.append(f'{part_name}_mIOU') overall_string += f"<th>{np.mean([aabb_ious[i][j] for i in aabb_ious if j in aabb_ious[i]]):.2f}</th>" for part_name in part_name_list: for iou in iou_th: data_name.append(f'{part_name}_AP @ {iou:.2f}') res = ret_dict[f'{part_name}_AP_{iou:.2f}'] overall_string += f"<th>{res:.2f}</th>" for part_name in part_name_list: for iou in iou_th: data_name.append(f'{part_name}_AR @ {iou:.2f}') res = ret_dict[f'{part_name}_rec_{iou:.2f}'] overall_string += f"<th>{res:.2f}</th>" item_file_format = """<a href="./item/{page_name}" title="{page_title}"> {page_title} </a>""" color_map_item_format = """<h2 style="display:block"> <span style = "color:{color_name}"> {class_name} </span> </h2>""" bar = ProgressBar() for i in bar(range(num)): #if i != 9: # continue annotation = annotations[i] gt_box = annotation['annos']['gt_boxes_upright_depth'] num_gt_box = annotation['annos']['gt_num'] box_class = annotation['annos']['class'] point_file = annotation['pts_path'] instance_file = annotation['pts_instance_mask_path'] sem_file = annotation['pts_semantic_mask_path'] #annotation['class'] #annotation['name'] point_file = str(dataset_path / point_file) sem_file = str(dataset_path / instance_file) instance_file = str(dataset_path / instance_file) point = np.fromfile(point_file, np.float32).reshape(-1, 3) #print(point.shape, point_file) #sem = np.fromfile(sem_file).astype(int) instance = np.fromfile(instance_file, np.long) pi_path = osp.join(item_dir, f'point_instance_{i}.ply') bbox_path = osp.join(item_dir, f'gt_box_{i}.ply') json_bbox_path = osp.join(item_dir, f'gt_box_{i}.json') colors = write_bbox_color_json(gt_box, box_class, json_bbox_path) write_bbox_color(gt_box, box_class, bbox_path) write_ply_color(point, instance, pi_path) def rgb_to_hex(rgb): ans = '#%02x%02x%02x' % (rgb[0], rgb[1], rgb[2]) return ans rpi_path = osp.relpath(pi_path, item_dir) rbbox_path = osp.relpath(bbox_path, item_dir) rjbbox_path = osp.relpath(json_bbox_path, item_dir) next_page_rel_path = osp.relpath( osp.join(item_dir, f'{(i + 1) % num}.html'), item_dir) last_page_rel_path = osp.relpath( osp.join(item_dir, f'{(i - 1 + num) % num}.html'), item_dir) table_item_i = [ item_file_format.format(page_name=f'{i}.html', page_title=f'Instance {i}') ] #for k in range(len(iou_th)): for j, part_name in enumerate(part_name_list): table_item_i.append(f'{aabb_ious[i][j]:.2f}') for k in range(len(iou_th)): for j, part_name in enumerate(part_name_list): if j in aps[k][i]: table_item_i.append(f'{float(aps[k][i][j]):.2f}') else: table_item_i.append('N/A') for k in range(len(iou_th)): for j, part_name in enumerate(part_name_list): if j in recalls[k][i]: table_item_i.append(f'{float(recalls[k][i][j][-1]):.2f}') else: table_item_i.append('N/A') boxes = pred[i]['boxes_3d'].tensor.numpy()[:, :6] boxes[:, 2] += boxes[:, 5] * 0.5 #print(boxes, gt_box) #exit(0) score = pred[i]['scores_3d'].numpy() label = pred[i]['labels_3d'].numpy() flag = score > 0.1 # flag = np.logical_and(score > 0.1, label == 0) boxes = boxes[flag] label = label[flag] #print(boxes.shape, label, score[score > 0.1]) table.append(table_item_i) #print(boxes.shape, label.shape) pred_bbox_path = osp.join(item_dir, f'pred_box_{i}.ply') json_pred_bbox_path = osp.join(item_dir, f'pred_box_{i}.json') write_bbox_color(boxes, label, pred_bbox_path) colors_ = write_bbox_color_json(boxes, label, json_pred_bbox_path) colors.update(colors_) color_item = '' for label in colors: c = rgb_to_hex(colors[label]) l = part_name_list[label] color_item = color_item + color_map_item_format.format( color_name=c, class_name=l) pred_rjbbox_path = osp.relpath(json_pred_bbox_path, item_dir) html_from_template( item2_template, out_file=osp.join(item_dir, f'{i}.html'), file_path=f"'{rpi_path}', '{rjbbox_path}', '{pred_rjbbox_path}'", file_name="'pc_instance', 'gt_box', 'pred_box'", file_type="'pcd', 'json_box', 'json_box'", color_map=color_item, last_page=last_page_rel_path, next_page=next_page_rel_path) df = pd.DataFrame(table, columns=[ 'Object', ] + data_name) main_table = df.to_html(escape=False, classes="table sortable is-striped is-hoverable", border=0, index=False) html_from_template(table_template, out_file=osp.join(output_dir, 'main_page.html'), table_string=main_table, overal_info=overall_string, type=f'{cat}-{level}')
import sys import os BASE_DIR = os.path.dirname(__file__) sys.path.append(BASE_DIR) sys.path.append(os.path.join(BASE_DIR, '../')) import numpy as np import pc_util data = np.load('scannet_scenes/scene0001_01.npy') scene_points = data[:,0:3] colors = data[:,3:6] instance_labels = data[:,6] semantic_labels = data[:,7] output_folder = 'demo_output' if not os.path.exists(output_folder): os.mkdir(output_folder) # Write scene as OBJ file for visualization pc_util.write_ply_rgb(scene_points, colors, os.path.join(output_folder, 'scene.obj')) pc_util.write_ply_color(scene_points, instance_labels, os.path.join(output_folder, 'scene_instance.obj')) pc_util.write_ply_color(scene_points, semantic_labels, os.path.join(output_folder, 'scene_semantic.obj'))
scene_name = 'scannet_train_detection_data/scene0002_00' output_folder = 'data_viz_dump' data = np.load(scene_name + '_vert.npy') scene_points = data[:, 0:3] colors = data[:, 3:] instance_labels = np.load(scene_name + '_ins_label.npy') semantic_labels = np.load(scene_name + '_sem_label.npy') instance_bboxes = np.load(scene_name + '_bbox.npy') print(np.unique(instance_labels)) print(np.unique(semantic_labels)) input() if not os.path.exists(output_folder): os.mkdir(output_folder) # Write scene as OBJ file for visualization pc_util.write_ply_rgb(scene_points, colors, os.path.join(output_folder, 'scene.obj')) pc_util.write_ply_color(scene_points, instance_labels, os.path.join(output_folder, 'scene_instance.obj')) pc_util.write_ply_color(scene_points, semantic_labels, os.path.join(output_folder, 'scene_semantic.obj')) from model_util_scannet import ScannetDatasetConfig DC = ScannetDatasetConfig() print(instance_bboxes.shape) bbox, bbox_color = DC.param2bbox(instance_bboxes, True) pc_util.write_ply_color(bbox, bbox_color, os.path.join(output_folder, 'scene_bbox.obj'))