def noise_per_box(boxes, valid_mask, loc_noises, rot_noises):
    # boxes: [N, 5]
    # valid_mask: [N]
    # loc_noises: [N, M, 3]
    # rot_noises: [N, M]
    num_boxes = boxes.shape[0]
    num_tests = loc_noises.shape[1]
    box_corners = box_np_ops.box2d_to_corner_jit(boxes)
    current_corners = np.zeros((4, 2), dtype=boxes.dtype)
    rot_mat_T = np.zeros((2, 2), dtype=boxes.dtype)
    success_mask = -np.ones((num_boxes, ), dtype=np.int64)
    # print(valid_mask)
    for i in range(num_boxes):
        if valid_mask[i]:
            for j in range(num_tests):
                current_corners[:] = box_corners[i]
                current_corners -= boxes[i, :2]
                _rotation_box2d_jit_(current_corners, rot_noises[i, j],
                                     rot_mat_T)
                current_corners += boxes[i, :2] + loc_noises[i, j, :2]
                coll_mat = box_collision_test(current_corners.reshape(1, 4, 2),
                                              box_corners)
                coll_mat[0, i] = False
                # print(coll_mat)
                if not coll_mat.any():
                    success_mask[i] = j
                    box_corners[i] = current_corners
                    break
    return success_mask
def noise_per_box_v2_(boxes, valid_mask, loc_noises, rot_noises,
                      global_rot_noises):
    # boxes: [N, 5]
    # valid_mask: [N]
    # loc_noises: [N, M, 3]
    # rot_noises: [N, M]
    num_boxes = boxes.shape[0]
    num_tests = loc_noises.shape[1]
    box_corners = box_np_ops.box2d_to_corner_jit(boxes)
    current_corners = np.zeros((4, 2), dtype=boxes.dtype)
    current_box = np.zeros((1, 5), dtype=boxes.dtype)
    rot_mat_T = np.zeros((2, 2), dtype=boxes.dtype)
    dst_pos = np.zeros((2, ), dtype=boxes.dtype)
    success_mask = -np.ones((num_boxes, ), dtype=np.int64)
    corners_norm = np.zeros((4, 2), dtype=boxes.dtype)
    corners_norm[1, 1] = 1.0
    corners_norm[2] = 1.0
    corners_norm[3, 0] = 1.0
    corners_norm -= np.array([0.5, 0.5], dtype=boxes.dtype)
    corners_norm = corners_norm.reshape(4, 2)
    for i in range(num_boxes):
        if valid_mask[i]:
            for j in range(num_tests):
                current_box[0, :] = boxes[i]
                current_radius = np.sqrt(boxes[i, 0]**2 + boxes[i, 1]**2)
                current_grot = np.arctan2(boxes[i, 0], boxes[i, 1])
                dst_grot = current_grot + global_rot_noises[i, j]
                dst_pos[0] = current_radius * np.sin(dst_grot)
                dst_pos[1] = current_radius * np.cos(dst_grot)
                current_box[0, :2] = dst_pos
                current_box[0, -1] += dst_grot - current_grot

                rot_sin = np.sin(current_box[0, -1])
                rot_cos = np.cos(current_box[0, -1])
                rot_mat_T[0, 0] = rot_cos
                rot_mat_T[0, 1] = -rot_sin
                rot_mat_T[1, 0] = rot_sin
                rot_mat_T[1, 1] = rot_cos
                current_corners[:] = (
                    current_box[0, 2:4] * corners_norm @ rot_mat_T +
                    current_box[0, :2])
                current_corners -= current_box[0, :2]
                _rotation_box2d_jit_(current_corners, rot_noises[i, j],
                                     rot_mat_T)
                current_corners += current_box[0, :2] + loc_noises[i, j, :2]
                coll_mat = box_collision_test(current_corners.reshape(1, 4, 2),
                                              box_corners)
                coll_mat[0, i] = False
                if not coll_mat.any():
                    success_mask[i] = j
                    box_corners[i] = current_corners
                    loc_noises[i, j, :2] += dst_pos - boxes[i, :2]
                    rot_noises[i, j] += dst_grot - current_grot
                    break
    return success_mask
예제 #3
0
def noise_per_box_group(boxes, valid_mask, loc_noises, rot_noises, group_nums):
    # WARNING: this function need boxes to be sorted by group id.
    # boxes: [N, 5]
    # valid_mask: [N]
    # loc_noises: [N, M, 3]
    # rot_noises: [N, M]
    num_groups = group_nums.shape[0]
    num_boxes = boxes.shape[0]
    num_tests = loc_noises.shape[1]
    box_corners = box_np_ops.box2d_to_corner_jit(boxes)
    max_group_num = group_nums.max()
    current_corners = np.zeros((max_group_num, 4, 2), dtype=boxes.dtype)
    rot_mat_T = np.zeros((2, 2), dtype=boxes.dtype)
    success_mask = -np.ones((num_boxes,), dtype=np.int64)
    # print(valid_mask)
    idx = 0
    for num in group_nums:
        if valid_mask[idx]:
            for j in range(num_tests):
                for i in range(num):
                    current_corners[i] = box_corners[i + idx]
                    current_corners[i] -= boxes[i + idx, :2]
                    _rotation_box2d_jit_(
                        current_corners[i], rot_noises[idx + i, j], rot_mat_T
                    )
                    current_corners[i] += (
                        boxes[i + idx, :2] + loc_noises[i + idx, j, :2]
                    )
                coll_mat = box_collision_test(
                    current_corners[:num].reshape(num, 4, 2), box_corners
                )
                for i in range(num):  # remove self-coll
                    coll_mat[i, idx : idx + num] = False
                if not coll_mat.any():
                    for i in range(num):
                        success_mask[i + idx] = j
                        box_corners[i + idx] = current_corners[i]
                    break
        idx += num
    return success_mask
예제 #4
0
def noise_per_box(boxes, valid_mask, loc_noises, rot_noises):
    '''
        This func aims to perform loc and rot noise no bev gt boxes, each gt box has 100 times chance to perform
        the randomly generated noice on its corresponding box; if a box fails after max times, no noise performed
        and return the original box.
         - boxes: [N, 5], [x,y,w,l,ry],
         - valid_mask: [N],
         - loc_noises: [N, M, 3], M=num_try,
         - rot_noises: [N, M].
    '''

    num_boxes = boxes.shape[0]
    num_tests = loc_noises.shape[1]  # num_try: 100
    box_corners = box_np_ops.box2d_to_corner_jit(
        boxes)  # rotation has been performed
    current_corners = np.zeros((4, 2), dtype=boxes.dtype)
    rot_mat_T = np.zeros((2, 2), dtype=boxes.dtype)
    success_mask = -np.ones((num_boxes, ), dtype=np.int64)  # default: -1
    # print(valid_mask)
    for i in range(num_boxes):
        if valid_mask[
                i]:  # only perform noise on object of targeted class, but un-targeted objects are considered into collison test.
            for j in range(num_tests):
                current_corners[:] = box_corners[i]
                current_corners -= boxes[
                    i, :2]  # see last line of box2d_to_corner_jit
                _rotation_box2d_jit_(current_corners, rot_noises[i, j],
                                     rot_mat_T)  # rotation with rot_noises,
                current_corners += boxes[i, :2] + loc_noises[
                    i, j, :2]  # translation with loc_noises,
                coll_mat = box_collision_test(current_corners.reshape(
                    1, 4, 2), box_corners)  # [1, num_valid_box]
                coll_mat[0, i] = False
                if not coll_mat.any(
                ):  # no collision; if loop ends without break -> no noise performed.
                    success_mask[i] = j  # index of selected noise
                    box_corners[i] = current_corners  # i-th box updated
                    break
    return success_mask
def noise_per_box_group_v2_(boxes, valid_mask, loc_noises, rot_noises,
                            group_nums, global_rot_noises):
    # WARNING: this function need boxes to be sorted by group id.
    # boxes: [N, 5]
    # valid_mask: [N]
    # loc_noises: [N, M, 3]
    # rot_noises: [N, M]
    num_boxes = boxes.shape[0]
    num_tests = loc_noises.shape[1]
    box_corners = box_np_ops.box2d_to_corner_jit(boxes)
    max_group_num = group_nums.max()
    current_box = np.zeros((1, 5), dtype=boxes.dtype)
    current_corners = np.zeros((max_group_num, 4, 2), dtype=boxes.dtype)
    dst_pos = np.zeros((max_group_num, 2), dtype=boxes.dtype)

    current_grot = np.zeros((max_group_num, ), dtype=boxes.dtype)
    dst_grot = np.zeros((max_group_num, ), dtype=boxes.dtype)

    rot_mat_T = np.zeros((2, 2), dtype=boxes.dtype)
    success_mask = -np.ones((num_boxes, ), dtype=np.int64)
    corners_norm = np.zeros((4, 2), dtype=boxes.dtype)
    corners_norm[1, 1] = 1.0
    corners_norm[2] = 1.0
    corners_norm[3, 0] = 1.0
    corners_norm -= np.array([0.5, 0.5], dtype=boxes.dtype)
    corners_norm = corners_norm.reshape(4, 2)

    # print(valid_mask)
    idx = 0
    for num in group_nums:
        if valid_mask[idx]:
            for j in range(num_tests):
                for i in range(num):
                    current_box[0, :] = boxes[i + idx]
                    current_radius = np.sqrt(current_box[0, 0]**2 +
                                             current_box[0, 1]**2)
                    current_grot[i] = np.arctan2(current_box[0, 0],
                                                 current_box[0, 1])
                    dst_grot[i] = current_grot[i] + global_rot_noises[idx + i,
                                                                      j]
                    dst_pos[i, 0] = current_radius * np.sin(dst_grot[i])
                    dst_pos[i, 1] = current_radius * np.cos(dst_grot[i])
                    current_box[0, :2] = dst_pos[i]
                    current_box[0, -1] += dst_grot[i] - current_grot[i]

                    rot_sin = np.sin(current_box[0, -1])
                    rot_cos = np.cos(current_box[0, -1])
                    rot_mat_T[0, 0] = rot_cos
                    rot_mat_T[0, 1] = -rot_sin
                    rot_mat_T[1, 0] = rot_sin
                    rot_mat_T[1, 1] = rot_cos
                    current_corners[i] = (
                        current_box[0, 2:4] * corners_norm @ rot_mat_T +
                        current_box[0, :2])
                    current_corners[i] -= current_box[0, :2]

                    _rotation_box2d_jit_(current_corners[i],
                                         rot_noises[idx + i, j], rot_mat_T)
                    current_corners[i] += (current_box[0, :2] +
                                           loc_noises[i + idx, j, :2])
                coll_mat = box_collision_test(
                    current_corners[:num].reshape(num, 4, 2), box_corners)
                for i in range(num):  # remove self-coll
                    coll_mat[i, idx:idx + num] = False
                if not coll_mat.any():
                    for i in range(num):
                        success_mask[i + idx] = j
                        box_corners[i + idx] = current_corners[i]
                        loc_noises[i + idx,
                                   j, :2] += dst_pos[i] - boxes[i + idx, :2]
                        rot_noises[i + idx, j] += dst_grot[i] - current_grot[i]
                    break
        idx += num
    return success_mask
예제 #6
0
def noise_per_box(boxes, boxes_1, boxes_2, boxes_3, valid_mask, loc_noises,
                  rot_noises):
    # boxes: [N, 5]
    # valid_mask: [N]
    # loc_noises: [N, M, 3]
    # rot_noises: [N, M]
    num_boxes = boxes.shape[0]
    num_tests = loc_noises.shape[1]

    box_corners = box_np_ops.box2d_to_corner_jit(boxes)
    box_corners_1 = box_np_ops.box2d_to_corner_jit(boxes_1)
    box_corners_2 = box_np_ops.box2d_to_corner_jit(boxes_2)
    box_corners_3 = box_np_ops.box2d_to_corner_jit(boxes_3)

    current_corners = np.zeros((4, 2), dtype=boxes.dtype)
    current_corners_1 = np.zeros((4, 2), dtype=boxes.dtype)
    current_corners_2 = np.zeros((4, 2), dtype=boxes.dtype)
    current_corners_3 = np.zeros((4, 2), dtype=boxes.dtype)

    rot_mat_T = np.zeros((2, 2), dtype=boxes.dtype)
    success_mask = -np.ones((num_boxes, ), dtype=np.int64)
    # print(valid_mask)
    for i in range(num_boxes):
        if valid_mask[i]:
            for j in range(num_tests):
                # T
                current_corners[:] = box_corners[i]
                current_corners -= boxes[i, :2]
                _rotation_box2d_jit_(current_corners, rot_noises[i, j],
                                     rot_mat_T)
                current_corners += boxes[i, :2] + loc_noises[i, j, :2]
                coll_mat = box_collision_test(current_corners.reshape(1, 4, 2),
                                              box_corners)
                coll_mat[0, i] = False

                # T-1
                center = boxes_1[i, :2] - boxes[i, :2]
                _rotation_box2d_jit_(center.reshape((1, 2)), rot_noises[i, j],
                                     rot_mat_T)
                current_corners_1[:] = box_corners_1[i]
                current_corners_1 -= boxes_1[i, :2]
                _rotation_box2d_jit_(current_corners_1, rot_noises[i, j],
                                     rot_mat_T)
                current_corners_1 += boxes[i, :2] + loc_noises[
                    i, j, :2] + center[:2]
                coll_mat_1 = box_collision_test(
                    current_corners_1.reshape(1, 4, 2), box_corners_1)
                coll_mat_1[0, i] = False

                # T+1
                center = boxes_2[i, :2] - boxes[i, :2]
                _rotation_box2d_jit_(center.reshape((1, 2)), rot_noises[i, j],
                                     rot_mat_T)
                current_corners_2[:] = box_corners_2[i]
                current_corners_2 -= boxes_2[i, :2]
                _rotation_box2d_jit_(current_corners_2, rot_noises[i, j],
                                     rot_mat_T)
                current_corners_2 += boxes[i, :2] + loc_noises[
                    i, j, :2] + center[:2]
                coll_mat_2 = box_collision_test(
                    current_corners_2.reshape(1, 4, 2), box_corners_2)
                coll_mat_2[0, i] = False

                # T-2
                center = boxes_3[i, :2] - boxes[i, :2]
                _rotation_box2d_jit_(center.reshape((1, 2)), rot_noises[i, j],
                                     rot_mat_T)
                current_corners_3[:] = box_corners_3[i]
                current_corners_3 -= boxes_3[i, :2]
                _rotation_box2d_jit_(current_corners_3, rot_noises[i, j],
                                     rot_mat_T)
                current_corners_3 += boxes[i, :2] + loc_noises[
                    i, j, :2] + center[:2]
                coll_mat_3 = box_collision_test(
                    current_corners_3.reshape(1, 4, 2), box_corners_3)
                coll_mat_3[0, i] = False

                coll_mat = coll_mat * coll_mat_1 * coll_mat_2 * coll_mat_3

                # print(coll_mat)
                if not coll_mat.any():
                    success_mask[i] = j
                    box_corners[i] = current_corners
                    box_corners_1[i] = current_corners_1
                    box_corners_2[i] = current_corners_2
                    box_corners_3[i] = current_corners_3
                    break
    return success_mask