Beispiel #1
0
def inference_mono_3d_detector(model, image, ann_file):
    """Inference image with the monocular 3D detector.

    Args:
        model (nn.Module): The loaded detector.
        image (str): Image files.
        ann_file (str): Annotation files.

    Returns:
        tuple: Predicted results and data from pipeline.
    """
    cfg = model.cfg
    device = next(model.parameters()).device  # model device
    # build the data pipeline
    test_pipeline = deepcopy(cfg.data.test.pipeline)
    test_pipeline = Compose(test_pipeline)
    box_type_3d, box_mode_3d = get_box_type(cfg.data.test.box_type_3d)
    # get data info containing calib
    data_infos = mmcv.load(ann_file)
    # find the info corresponding to this image
    for x in data_infos['images']:
        if osp.basename(x['file_name']) != osp.basename(image):
            continue
        img_info = x
        break
    data = dict(
        img_prefix=osp.dirname(image),
        img_info=dict(filename=osp.basename(image)),
        box_type_3d=box_type_3d,
        box_mode_3d=box_mode_3d,
        img_fields=[],
        bbox3d_fields=[],
        pts_mask_fields=[],
        pts_seg_fields=[],
        bbox_fields=[],
        mask_fields=[],
        seg_fields=[])

    # camera points to image conversion
    if box_mode_3d == Box3DMode.CAM:
        data['img_info'].update(dict(cam_intrinsic=img_info['cam_intrinsic']))

    data = test_pipeline(data)

    data = collate([data], samples_per_gpu=1)
    if next(model.parameters()).is_cuda:
        # scatter to specified GPU
        data = scatter(data, [device.index])[0]
    else:
        # this is a workaround to avoid the bug of MMDataParallel
        data['img_metas'] = data['img_metas'][0].data
        data['img'] = data['img'][0].data

    # forward the model
    with torch.no_grad():
        result = model(return_loss=False, rescale=True, **data)
    return result, data
    def datapipelinefrompcd(self, config, pcd):
        # build the data pipeline
        point_cloud_range = [0, -39.68, -3, 69.12, 39.68, 1]
        class_names = ['Pedestrian', 'Cyclist', 'Car']
        my_pipeline = [
            #dict(type='LoadPointsFromFile', coord_type='LIDAR', load_dim=4, use_dim=4),
            dict(type='MultiScaleFlipAug3D',
                 img_scale=(1333, 800),
                 pts_scale_ratio=1,
                 flip=False,
                 transforms=[
                     dict(type='GlobalRotScaleTrans',
                          rot_range=[0, 0],
                          scale_ratio_range=[1., 1.],
                          translation_std=[0, 0, 0]),
                     dict(type='RandomFlip3D'),
                     dict(type='PointsRangeFilter',
                          point_cloud_range=point_cloud_range),
                     dict(type='DefaultFormatBundle3D',
                          class_names=class_names,
                          with_label=False),
                     dict(type='Collect3D', keys=['points'])
                 ])
        ]
        #lidarpoints=LiDARPoints(torch.from_numpy(pcd[1,:]))
        lidarpoints = LiDARPoints(pcd[:, :4], points_dim=4)
        self.test_pipeline = my_pipeline  #deepcopy(config.data.test.pipeline)
        self.test_pipeline = Compose(self.test_pipeline)
        box_type_3d, box_mode_3d = get_box_type(config.data.test.box_type_3d)
        data = dict(
            pts_filename=[],  #pcd,
            box_type_3d=box_type_3d,
            box_mode_3d=box_mode_3d,
            sweeps=[],
            # set timestamp = 0
            timestamp=[0],
            img_fields=[],
            bbox3d_fields=[],
            pts_mask_fields=[],
            pts_seg_fields=[],
            bbox_fields=[],
            mask_fields=[],
            seg_fields=[],
            points=lidarpoints)

        data = self.test_pipeline(data)
        #data['points']=pcd
        data = collate([data], samples_per_gpu=1)

        return data
 def datafrompcd(self, config, pcd):
     box_type_3d, box_mode_3d = get_box_type(config.data.test.box_type_3d)
     datadict = {}
     datadict['points'] = pcd
     datadict['img_metas'] = dict(flip=False,
                                  pcd_horizontal_flip=False,
                                  pcd_vertical_flip=False,
                                  box_mode_3d=box_mode_3d,
                                  box_type_3d=box_type_3d,
                                  pcd_trans=[0., 0., 0.],
                                  pcd_scale_factor=1.0,
                                  pts_filename='',
                                  transformation_3d_flow=['R', 'S', 'T'])
     data = [datadict]
     return data
Beispiel #4
0
def inference_detector(model, pcd):
    """Inference point cloud with the detector.

    Args:
        model (nn.Module): The loaded detector.
        pcd (str): Point cloud files.

    Returns:
        tuple: Predicted results and data from pipeline.
    """
    cfg = model.cfg
    device = next(model.parameters()).device  # model device
    # build the data pipeline
    test_pipeline = deepcopy(cfg.data.test.pipeline)
    test_pipeline = Compose(test_pipeline)
    box_type_3d, box_mode_3d = get_box_type(cfg.data.test.box_type_3d)
    data = dict(
        pts_filename=pcd,
        box_type_3d=box_type_3d,
        box_mode_3d=box_mode_3d,
        # for ScanNet demo we need axis_align_matrix
        ann_info=dict(axis_align_matrix=np.eye(4)),
        sweeps=[],
        # set timestamp = 0
        timestamp=[0],
        img_fields=[],
        bbox3d_fields=[],
        pts_mask_fields=[],
        pts_seg_fields=[],
        bbox_fields=[],
        mask_fields=[],
        seg_fields=[])
    data = test_pipeline(data)
    data = collate([data], samples_per_gpu=1)
    if next(model.parameters()).is_cuda:
        # scatter to specified GPU
        data = scatter(data, [device.index])[0]
    else:
        # this is a workaround to avoid the bug of MMDataParallel
        data['img_metas'] = data['img_metas'][0].data
        data['points'] = data['points'][0].data
    # forward the model
    with torch.no_grad():
        result = model(return_loss=False, rescale=True, **data)
    return result, data
 def datapipelinefromlidarfile(self, config, pts_filename):
     # build the data pipeline
     self.test_pipeline = deepcopy(config.data.test.pipeline)
     self.test_pipeline = Compose(self.test_pipeline)
     box_type_3d, box_mode_3d = get_box_type(config.data.test.box_type_3d)
     data = dict(
         pts_filename=pts_filename,  #pcd,
         box_type_3d=box_type_3d,
         box_mode_3d=box_mode_3d,
         sweeps=[],
         # set timestamp = 0
         timestamp=[0],
         img_fields=[],
         bbox3d_fields=[],
         pts_mask_fields=[],
         pts_seg_fields=[],
         bbox_fields=[],
         mask_fields=[],
         seg_fields=[])
     return data
Beispiel #6
0
def inference_detector(model, pcd):
    """Inference point cloud with the detector.

    Args:
        model (nn.Module): The loaded detector.
        pcd (str): Point cloud files.

    Returns:
        tuple: Predicted results and data from pipeline.
    """
    cfg = model.cfg
    device = next(model.parameters()).device  # model device
    # build the data pipeline
    test_pipeline = deepcopy(cfg.data.test.pipeline)
    test_pipeline = Compose(test_pipeline)
    box_type_3d, box_mode_3d = get_box_type(cfg.data.test.box_type_3d)
    data = dict(pts_filename=pcd,
                box_type_3d=box_type_3d,
                box_mode_3d=box_mode_3d,
                img_fields=[],
                bbox3d_fields=[],
                pts_mask_fields=[],
                pts_seg_fields=[],
                bbox_fields=[],
                mask_fields=[],
                seg_fields=[])
    data = test_pipeline(data)
    data = collate([data], samples_per_gpu=1)
    if next(model.parameters()).is_cuda:
        # scatter to specified GPU
        data = scatter(data, [device.index])[0]
    else:
        raise NotImplementedError('Not support cpu-only currently')

    # forward the model
    with torch.no_grad():
        result = model(return_loss=False, rescale=True, **data)
    return result, data
Beispiel #7
0
def inference_multi_modality_detector(model, pcd, image, ann_file):
    """Inference point cloud with the multi-modality detector.

    Args:
        model (nn.Module): The loaded detector.
        pcd (str): Point cloud files.
        image (str): Image files.
        ann_file (str): Annotation files.

    Returns:
        tuple: Predicted results and data from pipeline.
    """
    cfg = model.cfg
    device = next(model.parameters()).device  # model device
    # build the data pipeline
    test_pipeline = deepcopy(cfg.data.test.pipeline)
    test_pipeline = Compose(test_pipeline)
    box_type_3d, box_mode_3d = get_box_type(cfg.data.test.box_type_3d)
    # get data info containing calib
    data_infos = mmcv.load(ann_file)
    image_idx = int(re.findall(r'\d+', image)[-1])  # xxx/sunrgbd_000017.jpg
    for x in data_infos:
        if int(x['image']['image_idx']) != image_idx:
            continue
        info = x
        break
    data = dict(pts_filename=pcd,
                img_prefix=osp.dirname(image),
                img_info=dict(filename=osp.basename(image)),
                box_type_3d=box_type_3d,
                box_mode_3d=box_mode_3d,
                img_fields=[],
                bbox3d_fields=[],
                pts_mask_fields=[],
                pts_seg_fields=[],
                bbox_fields=[],
                mask_fields=[],
                seg_fields=[])
    data = test_pipeline(data)

    # TODO: this code is dataset-specific. Move lidar2img and
    #       depth2img to .pkl annotations in the future.
    # LiDAR to image conversion
    if box_mode_3d == Box3DMode.LIDAR:
        rect = info['calib']['R0_rect'].astype(np.float32)
        Trv2c = info['calib']['Tr_velo_to_cam'].astype(np.float32)
        P2 = info['calib']['P2'].astype(np.float32)
        lidar2img = P2 @ rect @ Trv2c
        data['img_metas'][0].data['lidar2img'] = lidar2img
    # Depth to image conversion
    elif box_mode_3d == Box3DMode.DEPTH:
        rt_mat = info['calib']['Rt']
        # follow Coord3DMode.convert_point
        rt_mat = np.array([[1, 0, 0], [0, 0, -1], [0, 1, 0]
                           ]) @ rt_mat.transpose(1, 0)
        depth2img = info['calib']['K'] @ rt_mat
        data['img_metas'][0].data['depth2img'] = depth2img

    data = collate([data], samples_per_gpu=1)
    if next(model.parameters()).is_cuda:
        # scatter to specified GPU
        data = scatter(data, [device.index])[0]
    else:
        # this is a workaround to avoid the bug of MMDataParallel
        data['img_metas'] = data['img_metas'][0].data
        data['points'] = data['points'][0].data
        data['img'] = data['img'][0].data

    # forward the model
    with torch.no_grad():
        result = model(return_loss=False, rescale=True, **data)
    return result, data