示例#1
0
def convert_to_corners_3d(dims, depth, xyry):
    # import ipdb
    # ipdb.set_trace()
    x, y, ry = xyry[:3]
    dims_scale = xyry[-1]
    dims = dims * dims_scale
    label_boxes_3d = np.asarray([x, y, depth, dims[0], dims[1], dims[2],
                                 ry]).reshape(-1, 7)
    corners_3d = geometry_utils.boxes_3d_to_corners_3d(label_boxes_3d)
    return corners_3d
示例#2
0
    def render_image_3d(self, image, boxes_3d, label_classes, p2):
        connected_points = [[2, 4, 5], [1, 3, 6], [2, 4, 7], [1, 3, 8],
                            [1, 6, 8], [2, 5, 7], [3, 6, 8], [4, 5, 7]]
        connected_points = np.array(connected_points) - 1
        connected_points = connected_points.tolist()
        # connected_points_2d = [[1, 3], [0, 2], [1, 3], [0, 2]]

        # parse calib first
        corners_3d = geometry_utils.boxes_3d_to_corners_3d(boxes_3d[:, :-1])
        corners_2d = geometry_utils.points_3d_to_points_2d(
            corners_3d.reshape((-1, 3)), p2).reshape(-1, 8, 2)

        # bev image
        voxel_size = 0.05
        width = 80
        height = 75
        bev_width = int(height / voxel_size)
        bev_height = int(width / voxel_size)
        connected_points_2d = [[1, 3], [0, 2], [1, 3], [0, 2]]
        bev_image = np.zeros((bev_height, bev_width, 3), np.uint8)
        bev_image[...] = 255

        corners_2d = corners_2d.astype(np.int32).tolist()
        for i in range(boxes_3d.shape[0]):
            color = self.colors[label_classes[i]]
            corners_image = corners_2d[i]

            corners_bird = corners_3d[i][:4, [0, 2]]
            corners_bird = corners_bird[:, ::-1]
            corners_bird[:, 1] = corners_bird[:, 1] + 1 / 2 * width
            corners_bird = (corners_bird / voxel_size).astype(np.int)

            # render box in bev view
            for i in range(4):
                for j in range(4):
                    if j in connected_points_2d[i]:
                        start_point = (corners_bird[i][0], corners_bird[i][1])
                        end_point = (corners_bird[j][0], corners_bird[j][1])
                        cv2.line(bev_image, start_point, end_point, color, 2)

            # render box in image
            for i in range(8):
                for j in range(8):
                    if j in connected_points[i]:
                        start_point = (corners_image[i][0],
                                       corners_image[i][1])
                        end_point = (corners_image[j][0], corners_image[j][1])
                        cv2.line(image, start_point, end_point, color, 2)

        # rotate bev_image
        bev_image = cv2.rotate(bev_image, cv2.ROTATE_90_COUNTERCLOCKWISE)

        return image, bev_image
示例#3
0
def generate_mid_line(boxes_3d, p2):
    """
    Args:
        boxes_3d: shape(7), (xyz,hwl, ry)
    """
    boxes_3d = np.asarray(boxes_3d).reshape(1, -1)
    corners_3d = geometry_utils.boxes_3d_to_corners_3d(boxes_3d)

    # find the nearest line
    dist = np.linalg.norm(corners_3d, axis=-1)
    argmin = dist.argmin(axis=-1)
    corners_2d = geometry_utils.boxes_3d_to_corners_2d(boxes_3d, p2)
    row = np.arange(corners_2d.shape[0])
    mid_line_2d_tmp = corners_2d[row, argmin]
    return mid_line_2d_tmp[0]
示例#4
0
def mainv2():
    """
    self optimization
    """
    label_dir = 'results/data'
    corners_label_dir = 'results/corners'
    p2 = np.asarray([
        7.070493000000e+02, 0.000000000000e+00, 6.040814000000e+02,
        4.575831000000e+01, 0.000000000000e+00, 7.070493000000e+02,
        1.805066000000e+02, -3.454157000000e-01, 0.000000000000e+00,
        0.000000000000e+00, 1.000000000000e+00, 4.981016000000e-03
    ]).reshape(3, 4)
    visualizer = generate_visualizer()
    image_dir = '/data/object/training/image_2'
    for sample_ind, sample_name in enumerate(
            sorted(os.listdir(corners_label_dir))):
        # sample_name = '000006.txt'
        corners_label_path = os.path.join(corners_label_dir, sample_name)
        labels = read_txt(corners_label_path)
        num_instances = labels.shape[0]
        boxes_2d = labels[:, :4]
        corners_2d = labels[:, 4:4 + 16]
        dims = labels[:, 4 + 16:4 + 16 + 3]
        depth = labels[:, 4 + 16 + 3:4 + 16 + 3 + 1]
        conf = labels[:, -1:]
        ground_plane = None
        center_2d = (boxes_2d[:, :2] + boxes_2d[:, 2:]) / 2
        points_3d = geometry_utils.points_2d_to_points_3d(center_2d, depth, p2)
        center_2d = points_3d[:, :2]
        # import ipdb
        # ipdb.set_trace()
        ry = estimate_ry(corners_2d, p2)
        # location = estimate_location(corners_2d, depth, p2)

        # optimize xy
        optimized_xys = []
        for ind in range(num_instances):
            optimized_xys.append(
                optimize_xy(center_2d[ind], [1, 1, 1],
                            p2,
                            ry[ind, 0],
                            depth[ind, 0],
                            corners_2d[ind],
                            p=2).x[:2])
        optimized_xys = np.asarray(optimized_xys).reshape(-1, 2)

        # optimize rys
        # import ipdb
        # ipdb.set_trace()
        optimized_rys = []
        for ind in range(num_instances):
            optimized_rys.append(
                optimize_ry(optimized_xys[ind],
                            dims[ind],
                            p2,
                            ry[ind, 0],
                            depth[ind, 0],
                            corners_2d[ind],
                            p=1).x[0])
        optimized_rys = np.asarray(optimized_rys).reshape(-1, 1)

        boxes_3d = np.concatenate([optimized_xys[:, :2], depth, dims, ry],
                                  axis=-1)
        corners_3d = geometry_utils.boxes_3d_to_corners_3d(boxes_3d)

        # corners_3d = np.concatenate(corners_3d, axis=0)
        image_path = os.path.join(image_dir, '{}.png'.format(sample_name[:-4]))
        visualizer.render_image_corners_2d(image_path,
                                           corners_2d=None,
                                           boxes_2d=None,
                                           corners_3d=corners_3d,
                                           p2=p2)

        dets = np.concatenate([boxes_2d, boxes_3d, conf], axis=-1)
        # save to txt
        label_path = os.path.join(label_dir, '{}.txt'.format(sample_name[:-4]))
        save_dets(dets, label_path)
        sys.stdout.write('\rind: {} sample_name: {}'.format(
            sample_ind, sample_name))
        sys.stdout.flush()
示例#5
0
def box_3d_filter(box_3d, pointcloud):
    # planes = geometry_utils.boxes_3d_to_plane(box_3d[None])[0]
    corners_3d = geometry_utils.boxes_3d_to_corners_3d(box_3d[None])[0]
    point_mask = obj_utils.is_point_inside(pointcloud, corners_3d.T)

    return pointcloud.T[point_mask].T