Пример #1
0
    def from_dict(cls, ann_dict: dict) -> Detectron2_Annotation:
        check_required_keys(
            ann_dict,
            required_keys=['iscrowd', 'bbox', 'category_id', 'bbox_mode'])

        if ann_dict['bbox_mode'] == BoxMode.XYWH_ABS:
            bbox = BBox.from_list(ann_dict['bbox'], input_format='pminsize')
        elif ann_dict['bbox_mode'] == BoxMode.XYXY_ABS:
            bbox = BBox.from_list(ann_dict['bbox'], input_format='pminpmax')
        else:
            raise NotImplementedError
        if 'keypoints' in ann_dict:
            keypoints = Keypoint2D_List.from_list(
                value_list=ann_dict['keypoints'], demarcation=False)
        else:
            keypoints = Keypoint2D_List()

        return Detectron2_Annotation(iscrowd=ann_dict['iscrowd'],
                                     bbox=bbox,
                                     keypoints=keypoints,
                                     category_id=ann_dict['category_id'],
                                     segmentation=Segmentation.from_list(
                                         points_list=ann_dict['segmentation']
                                         if 'segmentation' in ann_dict else [],
                                         demarcation=False),
                                     bbox_mode=ann_dict['bbox_mode'])
Пример #2
0
 def from_dict(cls, ann_dict: dict, strict: bool = True) -> COCO_Annotation:
     if strict:
         check_required_keys(ann_dict,
                             required_keys=[
                                 'segmentation', 'num_keypoints', 'area',
                                 'iscrowd', 'keypoints', 'image_id', 'bbox',
                                 'category_id', 'id'
                             ])
         return COCO_Annotation(
             segmentation=Segmentation.from_list(ann_dict['segmentation'],
                                                 demarcation=False),
             num_keypoints=ann_dict['num_keypoints'],
             area=ann_dict['area'],
             iscrowd=ann_dict['iscrowd'],
             keypoints=Keypoint2D_List.from_list(ann_dict['keypoints'],
                                                 demarcation=False),
             image_id=ann_dict['image_id'],
             bbox=BBox.from_list(ann_dict['bbox'], input_format='pminsize'),
             category_id=ann_dict['category_id'],
             id=ann_dict['id'],
             keypoints_3d=Keypoint3D_List.from_list(
                 ann_dict['keypoints_3d'], demarcation=False)
             if 'keypoints_3d' in ann_dict else None,
             camera=Camera.from_dict(ann_dict['camera_params'])
             if 'camera_params' in ann_dict else None)
     else:
         check_required_keys(
             ann_dict, required_keys=['id', 'category_id', 'image_id'])
         return COCO_Annotation(
             segmentation=Segmentation.from_list(ann_dict['segmentation'],
                                                 demarcation=False)
             if 'segmentation' in ann_dict else None,
             num_keypoints=ann_dict['num_keypoints']
             if 'num_keypoints' in ann_dict else None,
             area=ann_dict['area'] if 'area' in ann_dict else None,
             iscrowd=ann_dict['iscrowd'] if 'iscrowd' in ann_dict else None,
             keypoints=Keypoint2D_List.from_list(ann_dict['keypoints'],
                                                 demarcation=False)
             if 'keypoints' in ann_dict else None,
             image_id=ann_dict['image_id'],
             bbox=BBox.from_list(ann_dict['bbox'], input_format='pminsize')
             if 'bbox' in ann_dict else None,
             category_id=ann_dict['category_id'],
             id=ann_dict['id'],
             keypoints_3d=Keypoint3D_List.from_list(
                 ann_dict['keypoints_3d'], demarcation=False)
             if 'keypoints_3d' in ann_dict else None,
             camera=Camera.from_dict(ann_dict['camera_params'])
             if 'camera_params' in ann_dict else None)
Пример #3
0
 def from_dict(self, item_dict: dict) -> BBoxKeypointResult:
     return BBoxKeypointResult(image_id=item_dict['image_id'],
                               category_id=item_dict['category_id'],
                               keypoints=Keypoint2D_List.from_list(
                                   item_dict['keypoints'],
                                   demarcation=False),
                               bbox=BBox.from_list(item_dict['bbox'],
                                                   input_format='pminsize'),
                               score=item_dict['score'])
Пример #4
0
 def from_dict(self, item_dict: dict) -> KeypointResult:
     check_required_keys(
         item_dict, required_keys=['image_id', 'category_id', 'keypoints'])
     if 'score' not in item_dict and 'score_list' not in item_dict:
         logger.error(
             f"Need to provide a dictionary with either a 'score' key or a 'score_list' key."
         )
         raise Exception
     return KeypointResult(image_id=item_dict['image_id'],
                           category_id=item_dict['category_id'],
                           keypoints=Keypoint2D_List.from_list(
                               item_dict['keypoints'], demarcation=False),
                           score=item_dict['score'])
Пример #5
0
def run(
    path: str,
    key: str = 'measure',
    show_image: bool = False,
    show_video: bool = True,
):
    dataset = COCO_Dataset.load_from_path(json_path=f'{path}/{key}-coco.json',
                                          img_dir=path,
                                          strict=False)
    # for i, coco_ann in enumerate(dataset.annotations):
    #     if i % 2 == 0:
    #         coco_ann.segmentation = Segmentation()
    #     if i % 3 == 0:
    #         coco_ann.keypoints = Keypoint2D_List()
    #         coco_ann.num_keypoints = 0
    for coco_ann in dataset.annotations:
        coco_ann.segmentation = Segmentation()
        coco_ann.keypoints = Keypoint2D_List()
        coco_ann.num_keypoints = 0
        coco_ann.keypoints_3d = None
        coco_ann.camera = None
    for coco_cat in dataset.categories:
        coco_cat.keypoints = []
        coco_cat.skeleton = []
    dataset.save_to_path('non_strict_dataset.json',
                         overwrite=True,
                         strict=False)
    dataset0 = COCO_Dataset.load_from_path('non_strict_dataset.json',
                                           strict=False)
    dataset0.images.sort(attr_name='file_name')

    if show_image:
        dataset0.save_visualization(save_dir=f'{path}_{dt_string3}_visualize',
                                    show_preview=True,
                                    kpt_idx_offset=-1,
                                    overwrite=True,
                                    show_details=True)
    if show_video:
        dataset0.save_video(
            save_path=f'{path}_{dt_string3}.mp4',
            # draw_order=['screw'],
            show_details=True,
            show_preview=True,
            kpt_idx_offset=-1,
            overwrite=True,
            fps=5,
            show_seg=True)
    logger.green('Visualisation complete')
Пример #6
0
 def get_keypoints(self, kpt_labels: List[str]) -> (Keypoint2D_List, Keypoint3D_List):
     kpts_2d = Keypoint2D_List()
     kpts_3d = Keypoint3D_List()
     
     for kpt_label in kpt_labels:
         found = False
         for contained_instance in self.contained_instance_list:
             if contained_instance.instance_type == 'kpt' and contained_instance.instance_name == kpt_label:
                 kpts_2d.append(Keypoint2D(point=contained_instance.ndds_ann_obj.projected_cuboid_centroid, visibility=2))
                 kpts_3d.append(Keypoint3D(point=contained_instance.ndds_ann_obj.cuboid_centroid, visibility=2))
                 found = True
                 break
         if not found:
             kpts_2d.append(Keypoint2D.origin())
             kpts_3d.append(Keypoint3D.origin())
     return kpts_2d, kpts_3d
Пример #7
0
    def __init__(
            self,
            id: int,
            category_id: int,
            image_id: int,  # Standard Required
            segmentation: Segmentation = None,  # Standard Optional
            bbox: BBox = None,
            area: float = None,
            keypoints: Keypoint2D_List = None,
            num_keypoints: int = None,
            iscrowd: int = 0,
            keypoints_3d: Keypoint3D_List = None,
            camera: Camera = None  # Custom Optional
    ):
        super().__init__(id=id)
        # Standard Required
        self.category_id = category_id
        self.image_id = image_id

        # Standard Optional
        self.segmentation = segmentation if segmentation is not None else Segmentation(
            [])
        if bbox is not None:
            self.bbox = bbox
        else:
            if len(self.segmentation) > 0:
                self.bbox = self.segmentation.to_bbox()
            else:
                logger.error(
                    f'A COCO_Annotation needs to be given either a bbox or a non-empty segmentation at the very least to make a valid annotation.'
                )
                logger.error(
                    f'id: {id}, category_id: {category_id}, image_id: {image_id}'
                )
                raise Exception
        self.area = area
        self.keypoints = keypoints if keypoints is not None else Keypoint2D_List(
            [])
        self.num_keypoints = num_keypoints if num_keypoints is not None else len(
            self.keypoints)
        self.iscrowd = iscrowd

        # Custom Optional
        self.keypoints_3d = keypoints_3d
        self.camera = camera
Пример #8
0
            keypoints.append(item.keypoints)
            bbox.append(item.bbox)
            segmentation.append(item.segmentation)

    # print(segmentation)
    image, keypoints, bbox, poly = handler(image=img,
                                           keypoints=keypoints,
                                           bounding_boxes=bbox,
                                           polygons=segmentation)
    kpts_aug_list = keypoints[0].to_numpy(demarcation=True)[:, :2].reshape(
        ann_instance, keypoints_num, 2)
    kpts_aug_list = [[[x, y, 2] for x, y in kpts_aug]
                     for kpts_aug in kpts_aug_list]
    keypoints = [
        Keypoint2D_List.from_list(kpts_aug, demarcation=True)
        for kpts_aug in kpts_aug_list
    ]

    # print(image, keypoints, bbox, poly)
    cv2.imshow("a", image)
    cv2.waitKey(500)
    # break

    # print(results)

    #     preview0 = concat_n_images(img_list=resize(images=img_buffer), orientation=0)
    #     preview1 = concat_n_images(img_list=resize(images=results), orientation=0)
    #     preview = concat_n_images(img_list=[preview0, preview1], orientation=1)
    #     img_buffer = []
    #     quit_flag = cv_simple_image_viewer(img=preview, preview_width=1000)
Пример #9
0
assert kpt2d_0 - pt2d_1 == Keypoint2D(point=kpt2d_0.point - pt2d_1,
                                      visibility=kpt2d_0.visibility)
assert kpt2d_0 - const_int == Keypoint2D(point=kpt2d_0.point - const_int,
                                         visibility=kpt2d_0.visibility)
assert kpt2d_0 - kpt2d_1 == Keypoint2D(point=kpt2d_0.point - kpt2d_1.point,
                                       visibility=int(
                                           max(kpt2d_0.visibility,
                                               kpt2d_1.visibility)))
assert kpt2d_0 * const_int == Keypoint2D(point=kpt2d_0.point * const_int,
                                         visibility=kpt2d_0.visibility)
assert kpt2d_0 / const_int == Keypoint2D(point=kpt2d_0.point / const_int,
                                         visibility=kpt2d_0.visibility)

print(f'Keypoint2D Test Passed')

kpt2d_list_0 = Keypoint2D_List(kpt_list=[kpt2d_0 for i in range(5)])

assert kpt2d_list_0 + kpt2d_1 == Keypoint2D_List(
    [kpt + kpt2d_1 for kpt in kpt2d_list_0])
assert kpt2d_list_0 + pt2d_1 == Keypoint2D_List(
    [kpt + pt2d_1 for kpt in kpt2d_list_0])
assert kpt2d_list_0 + const_int == Keypoint2D_List(
    [kpt + const_int for kpt in kpt2d_list_0])
assert kpt2d_list_0 - kpt2d_1 == Keypoint2D_List(
    [kpt - kpt2d_1 for kpt in kpt2d_list_0])
assert kpt2d_list_0 - pt2d_1 == Keypoint2D_List(
    [kpt - pt2d_1 for kpt in kpt2d_list_0])
assert kpt2d_list_0 - const_int == Keypoint2D_List(
    [kpt - const_int for kpt in kpt2d_list_0])
assert kpt2d_list_0 * const_int == Keypoint2D_List(
    [kpt * const_int for kpt in kpt2d_list_0])
Пример #10
0
    def from_dict(cls, ann_dict: dict, strict: bool = True) -> COCO_Annotation:
        if strict:
            check_required_keys(ann_dict,
                                required_keys=[
                                    'segmentation', 'num_keypoints', 'area',
                                    'iscrowd', 'keypoints', 'image_id', 'bbox',
                                    'category_id', 'id'
                                ])
            return COCO_Annotation(
                segmentation=Segmentation.from_list(ann_dict['segmentation'],
                                                    demarcation=False),
                num_keypoints=ann_dict['num_keypoints'],
                area=ann_dict['area'],
                iscrowd=ann_dict['iscrowd'],
                keypoints=Keypoint2D_List.from_list(ann_dict['keypoints'],
                                                    demarcation=False),
                image_id=ann_dict['image_id'],
                bbox=BBox.from_list(ann_dict['bbox'], input_format='pminsize'),
                category_id=ann_dict['category_id'],
                id=ann_dict['id'],
                keypoints_3d=Keypoint3D_List.from_list(
                    ann_dict['keypoints_3d'], demarcation=False)
                if 'keypoints_3d' in ann_dict else None,
                camera=Camera.from_dict(ann_dict['camera_params'])
                if 'camera_params' in ann_dict else None)
        else:
            check_required_keys(
                ann_dict, required_keys=['id', 'category_id', 'image_id'])
            if 'segmentation' not in ann_dict:
                seg = None
            elif ann_dict['iscrowd'] == 1 and type(
                    ann_dict['segmentation']) == dict:
                compressed_rle = mask.frPyObjects(
                    ann_dict['segmentation'],
                    ann_dict['segmentation']['size'][0],
                    ann_dict['segmentation']['size'][1])
                seg_mask = mask.decode(compressed_rle)
                contours, _ = cv2.findContours(seg_mask, cv2.RETR_EXTERNAL,
                                               cv2.CHAIN_APPROX_SIMPLE)
                seg = Segmentation.from_contour(contour_list=contours)
            else:
                seg = Segmentation.from_list(ann_dict['segmentation'],
                                             demarcation=False)

            return COCO_Annotation(
                segmentation=seg,
                num_keypoints=ann_dict['num_keypoints']
                if 'num_keypoints' in ann_dict else None,
                area=ann_dict['area'] if 'area' in ann_dict else None,
                iscrowd=ann_dict['iscrowd'] if 'iscrowd' in ann_dict else None,
                keypoints=Keypoint2D_List.from_list(ann_dict['keypoints'],
                                                    demarcation=False)
                if 'keypoints' in ann_dict else None,
                image_id=ann_dict['image_id'],
                bbox=BBox.from_list(ann_dict['bbox'], input_format='pminsize')
                if 'bbox' in ann_dict else None,
                category_id=ann_dict['category_id'],
                id=ann_dict['id'],
                keypoints_3d=Keypoint3D_List.from_list(
                    ann_dict['keypoints_3d'], demarcation=False)
                if 'keypoints_3d' in ann_dict else None,
                camera=Camera.from_dict(ann_dict['camera_params'])
                if 'camera_params' in ann_dict else None)
Пример #11
0
    def to_coco(self,
                img_dir: str = None,
                mask_dir: str = None,
                coco_license: COCO_License = None,
                check_paths: bool = True,
                mask_lower_bgr: Tuple[int] = None,
                mask_upper_bgr: Tuple[int] = (255, 255, 255),
                show_pbar: bool = True) -> COCO_Dataset:
        dataset = COCO_Dataset.new(
            description='Dataset converted from Linemod to COCO format.')
        dataset.licenses.append(
            coco_license if coco_license is not None else COCO_License(
                url=
                'https://github.com/cm107/annotation_utils/blob/master/LICENSE',
                name='MIT License',
                id=len(dataset.licenses)))
        coco_license0 = dataset.licenses[-1]
        for linemod_image in self.images:
            file_name = get_filename(linemod_image.file_name)
            img_path = linemod_image.file_name if img_dir is None else f'{img_dir}/{file_name}'
            if file_exists(img_path):
                date_captured = get_ctime(img_path)
            else:
                if check_paths:
                    raise FileNotFoundError(
                        f"Couldn't find image at {img_path}")
                date_captured = ''
            coco_image = COCO_Image(license_id=coco_license0.id,
                                    file_name=file_name,
                                    coco_url=img_path,
                                    width=linemod_image.width,
                                    height=linemod_image.height,
                                    date_captured=date_captured,
                                    flickr_url=None,
                                    id=linemod_image.id)
            dataset.images.append(coco_image)

        pbar = tqdm(total=len(self.annotations),
                    unit='annotation(s)') if show_pbar else None
        if pbar is not None:
            pbar.set_description('Converting Linemod to COCO')
        for linemod_ann in self.annotations:
            mask_filename = get_filename(linemod_ann.mask_path)
            if mask_dir is not None:
                mask_path = f'{mask_dir}/{mask_filename}'
                if not file_exists(mask_path):
                    if check_paths:
                        raise FileNotFoundError(
                            f"Couldn't find mask at {mask_path}")
                    else:
                        seg = Segmentation()
                else:
                    seg = Segmentation.from_mask_path(mask_path,
                                                      lower_bgr=mask_lower_bgr,
                                                      upper_bgr=mask_upper_bgr)
            elif file_exists(linemod_ann.mask_path):
                seg = Segmentation.from_mask_path(linemod_ann.mask_path,
                                                  lower_bgr=mask_lower_bgr,
                                                  upper_bgr=mask_upper_bgr)
            elif img_dir is not None and file_exists(
                    f'{img_dir}/{mask_filename}'):
                seg = Segmentation.from_mask_path(f'{img_dir}/{mask_filename}',
                                                  lower_bgr=mask_lower_bgr,
                                                  upper_bgr=mask_upper_bgr)
            elif not check_paths:
                seg = Segmentation()
            else:
                raise FileNotFoundError(f"""
                    Couldn't resolve mask_path for calculating segmentation.
                    Please either specify mask_dir or correct the mask paths
                    in your linemod dataset.
                    linemod_ann.id: {linemod_ann.id}
                    linemod_ann.mask_path: {linemod_ann.mask_path}
                    """)
            if len(seg) > 0:
                bbox = seg.to_bbox()
            else:
                xmin = int(
                    linemod_ann.corner_2d.to_numpy(demarcation=True)[:,
                                                                     0].min())
                xmax = int(
                    linemod_ann.corner_2d.to_numpy(demarcation=True)[:,
                                                                     0].max())
                ymin = int(
                    linemod_ann.corner_2d.to_numpy(demarcation=True)[:,
                                                                     1].min())
                ymax = int(
                    linemod_ann.corner_2d.to_numpy(demarcation=True)[:,
                                                                     1].max())
                bbox = BBox(xmin=xmin, ymin=ymin, xmax=xmax, ymax=ymax)

            keypoints = Keypoint2D_List.from_point_list(linemod_ann.fps_2d,
                                                        visibility=2)
            keypoints_3d = Keypoint3D_List.from_point_list(linemod_ann.fps_3d,
                                                           visibility=2)
            num_keypoints = len(keypoints)

            if linemod_ann.category_id not in [
                    cat.id for cat in dataset.categories
            ]:
                linemod_cat = self.categories.get_obj_from_id(
                    linemod_ann.category_id)
                cat_keypoints = list(
                    'abcdefghijklmnopqrstuvwxyz'.upper())[:num_keypoints]
                cat_keypoints_idx_list = [
                    idx for idx in range(len(cat_keypoints))
                ]
                cat_keypoints_idx_list_shift_left = cat_keypoints_idx_list[
                    1:] + cat_keypoints_idx_list[:1]
                dataset.categories.append(
                    COCO_Category(
                        id=linemod_ann.category_id,
                        supercategory=linemod_cat.supercategory,
                        name=linemod_cat.name,
                        keypoints=cat_keypoints,
                        skeleton=[[start_idx, end_idx]
                                  for start_idx, end_idx in zip(
                                      cat_keypoints_idx_list,
                                      cat_keypoints_idx_list_shift_left)]))

            coco_ann = COCO_Annotation(
                id=linemod_ann.id,
                category_id=linemod_ann.category_id,
                image_id=linemod_ann.image_id,
                segmentation=seg,
                bbox=bbox,
                area=bbox.area(),
                keypoints=keypoints,
                num_keypoints=num_keypoints,
                iscrowd=0,
                keypoints_3d=keypoints_3d,
                camera=COCO_Camera(f=[linemod_ann.K.fx, linemod_ann.K.fy],
                                   c=[linemod_ann.K.cx, linemod_ann.K.cy],
                                   T=[0, 0]))
            dataset.annotations.append(coco_ann)
            if pbar is not None:
                pbar.update()
        if pbar is not None:
            pbar.close()
        return dataset
Пример #12
0
from common_utils.common_types.keypoint import Keypoint2D_List

dataset = COCO_Dataset.load_from_path(
    json_path=
    '/home/clayton/workspace/prj/data_keep/data/toyota/dataset/sim/20200228/28_02_2020_11_18_30_coco-data/HSR-coco.json',
    img_dir=
    '/home/clayton/workspace/prj/data_keep/data/toyota/dataset/sim/20200228/28_02_2020_11_18_30_coco-data'
)
# for i, coco_ann in enumerate(dataset.annotations):
#     if i % 2 == 0:
#         coco_ann.segmentation = Segmentation()
#     if i % 3 == 0:
#         coco_ann.keypoints = Keypoint2D_List()
#         coco_ann.num_keypoints = 0
for coco_ann in dataset.annotations:
    coco_ann.segmentation = Segmentation()
    coco_ann.keypoints = Keypoint2D_List()
    coco_ann.num_keypoints = 0
    coco_ann.keypoints_3d = None
    coco_ann.camera = None
for coco_cat in dataset.categories:
    coco_cat.keypoints = []
    coco_cat.skeleton = []
dataset.save_to_path('non_strict_dataset.json', overwrite=True, strict=False)
dataset0 = COCO_Dataset.load_from_path('non_strict_dataset.json', strict=False)
dataset0.images.sort(attr_name='file_name')
dataset0.save_visualization(save_dir='test_vis',
                            show_preview=True,
                            kpt_idx_offset=-1,
                            overwrite=True,
                            show_details=True)