Example #1
0
    def _compare(self, boxes1, boxes2):
        """Compute matrix of (negated) sq distances.

    Args:
      boxlist1: BoxList holding N boxes.
      boxlist2: BoxList holding M boxes.

    Returns:
      A tensor with shape [N, M] representing negated pairwise squared distance.
    """
        boxes1_bv = box_np_ops.rbbox2d_to_near_bbox(boxes1)
        boxes2_bv = box_np_ops.rbbox2d_to_near_bbox(boxes2)
        ret = box_np_ops.iou_jit(boxes1_bv, boxes2_bv, eps=0.0)
        return ret
Example #2
0
    def __call__(self, res, info):

        class_names_by_task = [t.classes for t in self.target_assigners]

        # Calculate output featuremap size
        grid_size = res["lidar"]["voxels"]["shape"]
        feature_map_size = grid_size[:2] // self.out_size_factor
        feature_map_size = [*feature_map_size, 1][::-1]

        anchors_by_task = [
            t.generate_anchors(feature_map_size) for t in self.target_assigners
        ]
        anchor_dicts_by_task = [
            t.generate_anchors_dict(feature_map_size)
            for t in self.target_assigners
        ]
        reshaped_anchors_by_task = [
            t["anchors"].reshape([-1, t["anchors"].shape[-1]])
            for t in anchors_by_task
        ]
        matched_by_task = [t["matched_thresholds"] for t in anchors_by_task]
        unmatched_by_task = [
            t["unmatched_thresholds"] for t in anchors_by_task
        ]

        bv_anchors_by_task = [
            box_np_ops.rbbox2d_to_near_bbox(anchors[:, [0, 1, 3, 4, -1]])
            for anchors in reshaped_anchors_by_task
        ]

        anchor_caches_by_task = dict(
            anchors=reshaped_anchors_by_task,
            anchors_bv=bv_anchors_by_task,
            matched_thresholds=matched_by_task,
            unmatched_thresholds=unmatched_by_task,
            anchors_dict=anchor_dicts_by_task,
        )

        if res["mode"] == "train":
            gt_dict = res["lidar"]["annotations"]

            task_masks = []
            flag = 0
            for class_name in class_names_by_task:
                task_masks.append([
                    np.where(gt_dict["gt_classes"] == class_name.index(i) + 1 +
                             flag) for i in class_name
                ])
                flag += len(class_name)

            task_boxes = []
            task_classes = []
            task_names = []
            flag2 = 0
            for idx, mask in enumerate(task_masks):
                task_box = []
                task_class = []
                task_name = []
                for m in mask:
                    task_box.append(gt_dict["gt_boxes"][m])
                    task_class.append(gt_dict["gt_classes"][m] - flag2)
                    task_name.append(gt_dict["gt_names"][m])
                task_boxes.append(np.concatenate(task_box, axis=0))
                task_classes.append(np.concatenate(task_class))
                task_names.append(np.concatenate(task_name))
                flag2 += len(mask)

            for task_box in task_boxes:
                # limit rad to [-pi, pi]
                task_box[:, -1] = box_np_ops.limit_period(task_box[:, -1],
                                                          offset=0.5,
                                                          period=np.pi * 2)

            # print(gt_dict.keys())
            gt_dict["gt_classes"] = task_classes
            gt_dict["gt_names"] = task_names
            gt_dict["gt_boxes"] = task_boxes

            res["lidar"]["annotations"] = gt_dict

        anchorss = anchor_caches_by_task["anchors"]
        anchors_bvs = anchor_caches_by_task["anchors_bv"]
        anchors_dicts = anchor_caches_by_task["anchors_dict"]

        example = {}
        example["anchors"] = anchorss

        if self.anchor_area_threshold >= 0:
            example["anchors_mask"] = []
            for idx, anchors_bv in enumerate(anchors_bvs):
                anchors_mask = None
                # slow with high resolution. recommend disable this forever.
                coors = coordinates
                dense_voxel_map = box_np_ops.sparse_sum_for_anchors_mask(
                    coors, tuple(grid_size[::-1][1:]))
                dense_voxel_map = dense_voxel_map.cumsum(0)
                dense_voxel_map = dense_voxel_map.cumsum(1)
                anchors_area = box_np_ops.fused_get_anchors_area(
                    dense_voxel_map, anchors_bv, voxel_size, pc_range,
                    grid_size)
                anchors_mask = anchors_area > anchor_area_threshold
                example["anchors_mask"].append(anchors_mask)

        if res["mode"] == "train":
            targets_dicts = []
            for idx, target_assigner in enumerate(self.target_assigners):
                if "anchors_mask" in example:
                    anchors_mask = example["anchors_mask"][idx]
                else:
                    anchors_mask = None
                targets_dict = target_assigner.assign_v2(
                    anchors_dicts[idx],
                    gt_dict["gt_boxes"][idx],
                    anchors_mask,
                    gt_classes=gt_dict["gt_classes"][idx],
                    gt_names=gt_dict["gt_names"][idx],
                )
                targets_dicts.append(targets_dict)

            example.update({
                "labels":
                [targets_dict["labels"] for targets_dict in targets_dicts],
                "reg_targets": [
                    targets_dict["bbox_targets"]
                    for targets_dict in targets_dicts
                ],
                "reg_weights": [
                    targets_dict["bbox_outside_weights"]
                    for targets_dict in targets_dicts
                ],
            })

        res["lidar"]["targets"] = example

        return res, info
Example #3
0
    def __call__(self, res, info):

        # 需要检测的物体类别
        class_names_by_task = [t.classes for t in self.target_assigners]

        # Calculate output featuremap size
        grid_size = res["lidar"]["voxels"]["shape"]
        feature_map_size = grid_size[:2] // self.out_size_factor
        feature_map_size = [*feature_map_size, 1][::-1]    # z轴的size是1

        # 生成不同类的不同anchor
        # anchors list
        anchors_by_task = [
            t.generate_anchors(feature_map_size) for t in self.target_assigners
        ]
        # anchors 类别有dict
        anchor_dicts_by_task = [
            t.generate_anchors_dict(feature_map_size)
            for t in self.target_assigners
        ]
        # reshape乘n*7的形式
        reshaped_anchors_by_task = [
            t["anchors"].reshape([-1, t["anchors"].shape[-1]])
            for t in anchors_by_task
        ]
        matched_by_task = [t["matched_thresholds"] for t in anchors_by_task]
        unmatched_by_task = [
            t["unmatched_thresholds"] for t in anchors_by_task
        ]

        # bev下的anchor
        bv_anchors_by_task = [
            box_np_ops.rbbox2d_to_near_bbox(anchors[:, [0, 1, 3, 4, -1]])
            for anchors in reshaped_anchors_by_task
        ]

        # 整合为字典
        anchor_caches_by_task = dict(
            anchors=reshaped_anchors_by_task,
            anchors_bv=bv_anchors_by_task,
            matched_thresholds=matched_by_task,
            unmatched_thresholds=unmatched_by_task,
            anchors_dict=anchor_dicts_by_task,
        )

        if res["mode"] == "train":
            # 得到当前帧的标注
            gt_dict = res["lidar"]["annotations"]

            task_masks = []
            flag = 0
            # 不同任务的不同类gt,得到mask,task_id:[]
            for class_name in class_names_by_task:
                task_masks.append([
                    np.where(gt_dict["gt_classes"] == class_name.index(i) + 1 +
                             flag) for i in class_name
                ])
                flag += len(class_name)

            # task存储
            task_boxes = []
            task_boxes_1 = []
            task_boxes_2 = []
            task_classes = []
            task_names = []
            flag2 = 0
            for idx, mask in enumerate(task_masks):
                task_box = []
                task_box_1 = []
                task_box_2 = []
                task_class = []
                task_name = []
                for m in mask:
                    # mask 应用
                    # TODO: 在这里应用mask时需要把前后两帧的label加入
                    task_box.append(gt_dict["gt_boxes"][m])
                    task_box_1.append(gt_dict["gt_boxes_1"][m])
                    task_box_2.append(gt_dict["gt_boxes_2"][m])
                    task_class.append(gt_dict["gt_classes"][m] - flag2)
                    task_name.append(gt_dict["gt_names"][m])
                task_boxes.append(np.concatenate(task_box, axis=0))
                task_boxes_1.append(np.concatenate(task_box_1, axis=0))
                task_boxes_2.append(np.concatenate(task_box_2, axis=0))
                task_classes.append(np.concatenate(task_class))
                task_names.append(np.concatenate(task_name))
                flag2 += len(mask)

            for task_box, task_box_1, task_box_2 in zip(
                    task_boxes, task_boxes_1, task_boxes_2):
                # TODO:将朝向角限制在-pi~pi
                # limit rad to [-pi, pi]
                task_box[:, -1] = box_np_ops.limit_period(task_box[:, -1],
                                                          offset=0.5,
                                                          period=np.pi * 2)
                task_box_1[:, -1] = box_np_ops.limit_period(task_box_1[:, -1],
                                                            offset=0.5,
                                                            period=np.pi * 2)
                task_box_2[:, -1] = box_np_ops.limit_period(task_box_2[:, -1],
                                                            offset=0.5,
                                                            period=np.pi * 2)

            # print(gt_dict.keys())
            # 对应的gt_boxes_1
            gt_dict["gt_classes"] = task_classes
            gt_dict["gt_names"] = task_names
            gt_dict["gt_boxes"] = task_boxes
            gt_dict["gt_boxes_1"] = task_boxes_1
            gt_dict["gt_boxes_2"] = task_boxes_2

            res["lidar"]["annotations"] = gt_dict

        anchorss = anchor_caches_by_task["anchors"]
        anchors_bvs = anchor_caches_by_task["anchors_bv"]
        anchors_dicts = anchor_caches_by_task["anchors_dict"]

        example = {}
        # anchor是reshape出来的D*H*W*7
        example["anchors"] = anchorss

        if self.anchor_area_threshold >= 0:
            # 暂时没有用到
            example["anchors_mask"] = []
            for idx, anchors_bv in enumerate(anchors_bvs):
                anchors_mask = None
                # slow with high resolution. recommend disable this forever.
                coors = coordinates
                dense_voxel_map = box_np_ops.sparse_sum_for_anchors_mask(
                    coors, tuple(grid_size[::-1][1:]))
                dense_voxel_map = dense_voxel_map.cumsum(0)
                dense_voxel_map = dense_voxel_map.cumsum(1)
                anchors_area = box_np_ops.fused_get_anchors_area(
                    dense_voxel_map, anchors_bv, voxel_size, pc_range,
                    grid_size)
                anchors_mask = anchors_area > anchor_area_threshold
                example["anchors_mask"].append(anchors_mask)

        if res["mode"] == "train":
            targets_dicts = []
            # 主体部分,利用anchors和gt_boxes得到target
            # TODO: 修改的核心部分
            for idx, target_assigner in enumerate(self.target_assigners):
                if "anchors_mask" in example:
                    anchors_mask = example["anchors_mask"][idx]
                else:
                    anchors_mask = None
                targets_dict = target_assigner.assign_v3(
                    anchors_dicts[idx],
                    gt_dict["gt_boxes"][idx],
                    gt_dict["gt_boxes_1"][idx],
                    gt_dict["gt_boxes_2"][idx],
                    anchors_mask,
                    gt_classes=gt_dict["gt_classes"][idx],
                    gt_names=gt_dict["gt_names"][idx],
                )
                targets_dicts.append(targets_dict)

            example.update({
                "labels":
                [targets_dict["labels"] for targets_dict in targets_dicts],
                "reg_targets": [
                    targets_dict["bbox_targets"]
                    for targets_dict in targets_dicts
                ],
                "reg_targets_1": [
                    targets_dict["bbox_targets_1"]
                    for targets_dict in targets_dicts
                ],
                "reg_targets_2": [
                    targets_dict["bbox_targets_2"]
                    for targets_dict in targets_dicts
                ],
                "reg_weights": [
                    targets_dict["bbox_outside_weights"]
                    for targets_dict in targets_dicts
                ],
            })

        res["lidar"]["targets"] = example

        return res, info