Esempio n. 1
0
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()
Esempio n. 2
0
# -*- 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"))
Esempio n. 3
0
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}')
Esempio n. 4
0
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}')
Esempio n. 5
0
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'))
Esempio n. 6
0
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'))