Example #1
0
def iou_rotate_calculate1(boxes1, boxes2, use_gpu=True, gpu_id=0):

    # start = time.time()
    if use_gpu:
        ious = rbbx_overlaps(boxes1, boxes2, gpu_id)
    else:
        area1 = boxes1[:, 2] * boxes1[:, 3]
        area2 = boxes2[:, 2] * boxes2[:, 3]
        ious = []
        for i, box1 in enumerate(boxes1):
            temp_ious = []
            r1 = ((box1[0], box1[1]), (box1[2], box1[3]), box1[4])
            for j, box2 in enumerate(boxes2):
                r2 = ((box2[0], box2[1]), (box2[2], box2[3]), box2[4])

                int_pts = cv2.rotatedRectangleIntersection(r1, r2)[1]
                if int_pts is not None:
                    order_pts = cv2.convexHull(int_pts, returnPoints=True)

                    int_area = cv2.contourArea(order_pts)

                    inter = int_area * 1.0 / (area1[i] + area2[j] - int_area + 1e-5)
                    temp_ious.append(inter)
                else:
                    temp_ious.append(0.0)
            ious.append(temp_ious)

    # print('{}s'.format(time.time() - start))

    return np.array(ious, dtype=np.float32)
Example #2
0
    def refine_anchor_target_layer(self,
                                   gt_boxes_r,
                                   gt_encode_label,
                                   anchors,
                                   pos_threshold,
                                   neg_threshold,
                                   gpu_id=0):

        anchor_states = np.zeros((anchors.shape[0], ))
        labels = np.zeros((anchors.shape[0], self.cfgs.CLASS_NUM))
        if gt_boxes_r.shape[0]:
            # [N, M]

            # if cfgs.ANGLE_RANGE == 180:
            #     gt_boxes_r_ = coordinate_present_convert(gt_boxes_r[:, :-1], 1)
            #
            #     overlaps = rbbx_overlaps(np.ascontiguousarray(anchors, dtype=np.float32),
            #                              np.ascontiguousarray(gt_boxes_r_, dtype=np.float32), gpu_id)
            # else:
            overlaps = rbbx_overlaps(
                np.ascontiguousarray(anchors, dtype=np.float32),
                np.ascontiguousarray(gt_boxes_r[:, :-1], dtype=np.float32),
                gpu_id)

            # overlaps = np.clip(overlaps, 0.0, 1.0)

            argmax_overlaps_inds = np.argmax(overlaps, axis=1)
            max_overlaps = overlaps[np.arange(overlaps.shape[0]),
                                    argmax_overlaps_inds]

            # compute box regression targets
            target_boxes = gt_boxes_r[argmax_overlaps_inds]
            target_encode_label = gt_encode_label[argmax_overlaps_inds]

            positive_indices = max_overlaps >= pos_threshold
            ignore_indices = (max_overlaps > neg_threshold) & ~positive_indices
            anchor_states[ignore_indices] = -1
            anchor_states[positive_indices] = 1

            # compute target class labels
            labels[positive_indices,
                   target_boxes[positive_indices, -1].astype(int) - 1] = 1
        else:
            # no annotations? then everything is background
            target_boxes = np.zeros((anchors.shape[0], gt_boxes_r.shape[1]))
            target_encode_label = np.zeros(
                (anchors.shape[0], gt_encode_label.shape[1]))

        if self.cfgs.ANGLE_RANGE == 180:
            anchors = coordinate_present_convert(anchors, mode=-1)
            target_boxes = coordinate_present_convert(target_boxes, mode=-1)

        target_delta = bbox_transform.rbbox_transform(
            ex_rois=anchors,
            gt_rois=target_boxes,
            scale_factors=self.cfgs.ANCHOR_SCALE_FACTORS)

        return np.array(labels, np.float32), np.array(target_delta[:, :-1], np.float32), \
               np.array(anchor_states, np.float32), np.array(target_boxes, np.float32), \
               np.array(target_encode_label, np.float32)
    def anchor_target_layer(self, gt_boxes_h_batch, gt_boxes_r_batch, anchor_batch, gpu_id=0):

        all_labels, all_target_delta, all_anchor_states, all_target_boxes, all_target_encode_label = [], [], [], [], []
        for i in range(self.cfgs.BATCH_SIZE):
            anchors = np.array(anchor_batch[i], np.float32)
            gt_boxes_h = gt_boxes_h_batch[i, :, :]
            gt_boxes_r = gt_boxes_r_batch[i, :, :]
            anchor_states = np.zeros((anchors.shape[0],))
            labels = np.zeros((anchors.shape[0], self.cfgs.CLASS_NUM))
            if gt_boxes_r.shape[0]:
                # [N, M]

                if self.cfgs.METHOD == 'H':
                    overlaps = bbox_overlaps(np.ascontiguousarray(anchors, dtype=np.float),
                                             np.ascontiguousarray(gt_boxes_h, dtype=np.float))
                else:
                    overlaps = rbbx_overlaps(np.ascontiguousarray(anchors, dtype=np.float32),
                                             np.ascontiguousarray(gt_boxes_r[:, :-1], dtype=np.float32), gpu_id)

                argmax_overlaps_inds = np.argmax(overlaps, axis=1)
                max_overlaps = overlaps[np.arange(overlaps.shape[0]), argmax_overlaps_inds]

                # compute box regression targets
                target_boxes = gt_boxes_r[argmax_overlaps_inds]

                positive_indices = max_overlaps >= self.cfgs.IOU_POSITIVE_THRESHOLD
                ignore_indices = (max_overlaps > self.cfgs.IOU_NEGATIVE_THRESHOLD) & ~positive_indices

                anchor_states[ignore_indices] = -1
                anchor_states[positive_indices] = 1

                # compute target class labels
                labels[positive_indices, target_boxes[positive_indices, -1].astype(int) - 1] = 1
            else:
                # no annotations? then everything is background
                target_boxes = np.zeros((anchors.shape[0], gt_boxes_r.shape[1]))

            if self.cfgs.METHOD == 'H':
                x_c = (anchors[:, 2] + anchors[:, 0]) / 2
                y_c = (anchors[:, 3] + anchors[:, 1]) / 2
                h = anchors[:, 2] - anchors[:, 0] + 1
                w = anchors[:, 3] - anchors[:, 1] + 1
                theta = -90 * np.ones_like(x_c)
                anchors = np.vstack([x_c, y_c, w, h, theta]).transpose()

            if self.cfgs.ANGLE_RANGE == 180:
                anchors = coordinate_present_convert(anchors, mode=-1)
                target_boxes = coordinate_present_convert(target_boxes, mode=-1)
            target_delta = bbox_transform.rbbox_transform(ex_rois=anchors, gt_rois=target_boxes)

            all_labels.append(labels)
            all_target_delta.append(target_delta)
            all_anchor_states.append(anchor_states)
            all_target_boxes.append(target_boxes)

        return np.array(all_labels, np.float32), np.array(all_target_delta, np.float32), \
               np.array(all_anchor_states, np.float32), np.array(all_target_boxes, np.float32), \
    def anchor_target_layer(self, gt_boxes_h, gt_boxes_r, anchors, gpu_id=0):

        anchor_states = np.zeros((anchors.shape[0], ))
        labels = np.zeros((anchors.shape[0], self.cfgs.CLASS_NUM))
        if gt_boxes_r.shape[0]:
            # [N, M]

            if self.cfgs.METHOD == 'H':
                overlaps = bbox_overlaps(
                    np.ascontiguousarray(anchors, dtype=np.float),
                    np.ascontiguousarray(gt_boxes_h, dtype=np.float))
            else:
                overlaps = rbbx_overlaps(
                    np.ascontiguousarray(anchors, dtype=np.float32),
                    np.ascontiguousarray(gt_boxes_r[:, :-1], dtype=np.float32),
                    gpu_id)

            argmax_overlaps_inds = np.argmax(overlaps, axis=1)
            max_overlaps = overlaps[np.arange(overlaps.shape[0]),
                                    argmax_overlaps_inds]

            # compute box regression targets
            target_boxes = gt_boxes_r[argmax_overlaps_inds]

            positive_indices = max_overlaps >= self.cfgs.IOU_POSITIVE_THRESHOLD
            ignore_indices = (max_overlaps > self.cfgs.IOU_NEGATIVE_THRESHOLD
                              ) & ~positive_indices

            anchor_states[ignore_indices] = -1
            anchor_states[positive_indices] = 1

            # compute target class labels
            labels[positive_indices,
                   target_boxes[positive_indices, -1].astype(int) - 1] = 1
        else:
            # no annotations? then everything is background
            target_boxes = np.zeros((anchors.shape[0], gt_boxes_r.shape[1]))

        # if self.cfgs.METHOD == 'H':
        #     w = anchors[:, 2] - anchors[:, 0] + 1
        #     h = anchors[:, 3] - anchors[:, 1] + 1
        #     x1 = anchors[:, 0]
        #     y1 = anchors[:, 1]
        #     x2 = anchors[:, 2]
        #     y2 = anchors[:, 1]
        #     x3 = anchors[:, 2]
        #     y3 = anchors[:, 3]
        #     x4 = anchors[:, 0]
        #     y4 = anchors[:, 3]
        #     anchors = np.stack([x1, y1, x2, y2, x3, y3, x4, y4, w, h]).transpose()
        #
        # target_delta = bbox_transform.qbbox_transform(ex_rois=anchors, gt_rois=target_boxes)

        return np.array(labels, np.float32), np.array(
            anchor_states, np.float32), np.array(target_boxes, np.float32)
    def anchor_target_layer(self, gt_boxes_h, gt_boxes_r, anchors, gpu_id=0):

        anchor_states = np.zeros((anchors.shape[0], ))
        labels = np.zeros((anchors.shape[0], self.cfgs.CLASS_NUM))
        if gt_boxes_r.shape[0]:
            # [N, M]

            if self.cfgs.METHOD == 'H':
                overlaps = bbox_overlaps(
                    np.ascontiguousarray(anchors, dtype=np.float),
                    np.ascontiguousarray(gt_boxes_h, dtype=np.float))
            else:
                overlaps = rbbx_overlaps(
                    np.ascontiguousarray(anchors, dtype=np.float32),
                    np.ascontiguousarray(gt_boxes_r[:, :-1], dtype=np.float32),
                    gpu_id)

            argmax_overlaps_inds = np.argmax(overlaps, axis=1)
            max_overlaps = overlaps[np.arange(overlaps.shape[0]),
                                    argmax_overlaps_inds]

            # compute box regression targets
            target_boxes = gt_boxes_r[argmax_overlaps_inds]

            positive_indices = max_overlaps >= self.cfgs.IOU_POSITIVE_THRESHOLD
            ignore_indices = (max_overlaps > self.cfgs.IOU_NEGATIVE_THRESHOLD
                              ) & ~positive_indices

            anchor_states[ignore_indices] = -1
            anchor_states[positive_indices] = 1

            # compute target class labels
            labels[positive_indices,
                   target_boxes[positive_indices, -1].astype(int) - 1] = 1
        else:
            # no annotations? then everything is background
            target_boxes = np.zeros((anchors.shape[0], gt_boxes_r.shape[1]))

        if self.cfgs.METHOD == 'H':
            x_c = (anchors[:, 2] + anchors[:, 0]) / 2
            y_c = (anchors[:, 3] + anchors[:, 1]) / 2
            h = anchors[:, 2] - anchors[:, 0] + 1
            w = anchors[:, 3] - anchors[:, 1] + 1
            theta = -90 * np.ones_like(x_c)
            anchors = np.vstack([x_c, y_c, w, h, theta]).transpose()

        target_delta = bbox_transform.rbbox_transform(ex_rois=anchors,
                                                      gt_rois=target_boxes)

        return np.array(labels, np.float32), np.array(target_delta, np.float32), \
               np.array(anchor_states, np.float32), np.array(target_boxes, np.float32)
    def refine_anchor_target_layer(self,
                                   gt_boxes_r,
                                   anchors,
                                   pos_threshold,
                                   neg_threshold,
                                   gpu_id=0):

        anchor_states = np.zeros((anchors.shape[0], ))
        labels = np.zeros((anchors.shape[0], self.cfgs.CLASS_NUM))
        if gt_boxes_r.shape[0]:
            # [N, M]

            # overlaps = get_iou_matrix(np.ascontiguousarray(anchors, dtype=np.float32),
            #                           np.ascontiguousarray(gt_boxes_r[:, :-1], dtype=np.float32))
            #
            overlaps = rbbx_overlaps(
                np.ascontiguousarray(anchors, dtype=np.float32),
                np.ascontiguousarray(gt_boxes_r[:, :-1], dtype=np.float32),
                gpu_id)

            argmax_overlaps_inds = np.argmax(overlaps, axis=1)
            max_overlaps = overlaps[np.arange(overlaps.shape[0]),
                                    argmax_overlaps_inds]

            # compute box regression targets
            target_boxes = gt_boxes_r[argmax_overlaps_inds]

            positive_indices = max_overlaps >= pos_threshold
            ignore_indices = (max_overlaps > neg_threshold) & ~positive_indices

            anchor_states[ignore_indices] = -1
            anchor_states[positive_indices] = 1

            # compute target class labels
            labels[positive_indices,
                   target_boxes[positive_indices, -1].astype(int) - 1] = 1
        else:
            # no annotations? then everything is background
            target_boxes = np.zeros((anchors.shape[0], gt_boxes_r.shape[1]))

        target_delta = bbox_transform.rbbox_transform(
            ex_rois=anchors,
            gt_rois=target_boxes,
            scale_factors=self.cfgs.ANCHOR_SCALE_FACTORS)

        return np.array(labels, np.float32), np.array(target_delta, np.float32), \
               np.array(anchor_states, np.float32), np.array(target_boxes, np.float32)
Example #7
0
        # ar = (8 / (math.pi ** 2)) * (np.arctan(boxes1[:, 2]/boxes1[:, 3]) - np.arctan(boxes2[:, 2]/boxes2[:, 3])) \
        #      * ((boxes1[:, 2] - w_temp) * boxes1[:, 3])
        # cious = ious - d / c - alpha * ar
        cious = (ious - d / c) * np.abs(np.cos(boxes1[:, 4] - boxes2[:, 4]))
    else:
        cious = []

    return np.reshape(np.array(cious, dtype=np.float32), [-1, 1])

if __name__ == '__main__':

    boxes1 = np.array([
        [150, 150, 1e-15, 5, -45],
    ], np.float32)

    boxes2 = np.array([
        [50, 50, 5, 1e-15, -45]], np.float32)

    from libs.box_utils.overlaps_cython.overlaps_cython import rbox_overlaps

    overlaps = rbox_overlaps(np.array(boxes1, dtype=np.float32),
                             np.array(boxes2, dtype=np.float32))

    print(overlaps)

    print(rbbx_overlaps(boxes1, boxes2, 3))