def segtrack_to_bitmasks( frames: List[Frame], out_base: str, ignore_as_class: bool = False, remove_ignore: bool = False, nproc: int = 4, ) -> None: """Converting segmentation tracking poly2d to bitmasks.""" frames_list = group_and_sort(frames) categories, name_mapping, ignore_mapping = load_coco_config( mode="track", filepath=DEFAULT_COCO_CONFIG, ignore_as_class=ignore_as_class, ) out_paths: List[str] = [] colors_list: List[List[np.ndarray]] = [] poly2ds_list: List[List[List[Poly2D]]] = [] logger.info("Preparing annotations for SegTrack to Bitmasks") for video_anns in tqdm(frames_list): global_instance_id: int = 1 instance_id_maps: Dict[str, int] = dict() video_name = video_anns[0].video_name out_dir = os.path.join(out_base, video_name) if not os.path.isdir(out_dir): os.makedirs(out_dir) for image_anns in video_anns: # Bitmask in .png format image_name = image_anns.name.replace(".jpg", ".png") image_name = os.path.split(image_name)[-1] out_path = os.path.join(out_dir, image_name) out_paths.append(out_path) colors: List[np.ndarray] = [] poly2ds: List[List[Poly2D]] = [] colors_list.append(colors) poly2ds_list.append(poly2ds) labels_ = image_anns.labels if labels_ is None or len(labels_) == 0: continue # Scores higher, rendering later if labels_[0].score is not None: labels_ = sorted(labels_, key=lambda label: float(label.score)) for label in labels_: if label.poly2d is None: continue category_ignored, category_id = process_category( label.category, categories, name_mapping, ignore_mapping, ignore_as_class=ignore_as_class, ) if category_ignored and remove_ignore: continue instance_id, global_instance_id = get_bdd100k_instance_id( instance_id_maps, global_instance_id, str(label.id)) color = set_instance_color(label, category_id, instance_id, category_ignored) colors.append(color) poly2ds.append(label.poly2d) logger.info("Start Conversion for SegTrack to Bitmasks") frames_to_masks(nproc, out_paths, colors_list, poly2ds_list)
def bdd100k2coco_seg_track( mask_base: str, shape: Tuple[int, int], frames: List[Frame], categories: List[CatType], name_mapping: Optional[Dict[str, str]] = None, ignore_mapping: Optional[Dict[str, str]] = None, ignore_as_class: bool = False, remove_ignore: bool = False, mask_mode: str = "rle", nproc: int = 4, ) -> GtType: """Converting BDD100K Segmentation Tracking Set to COCO format.""" frames_list = group_and_sort(frames) videos: List[VidType] = [] images: List[ImgType] = [] video_id, image_id, ann_id = 0, 0, 0 mask_names: List[str] = [] category_ids_list: List[List[int]] = [] instance_ids_list: List[List[int]] = [] annotations_list: List[List[AnnType]] = [] for video_anns in tqdm(frames_list): global_instance_id: int = 1 instance_id_maps: Dict[str, int] = dict() video_name = video_anns[0].video_name video_id += 1 video = VidType(id=video_id, name=video_name) videos.append(video) for image_anns in video_anns: image_id += 1 image = ImgType( video_id=video_id, frame_id=image_anns.frame_index, id=image_id, file_name=os.path.join(video_name, image_anns.name), height=shape[0], width=shape[1], ) images.append(image) mask_name = os.path.join( mask_base, video_name, image_anns.name.replace(".jpg", ".png"), ) mask_names.append(mask_name) category_ids: List[int] = [] instance_ids: List[int] = [] annotations: List[AnnType] = [] for label in image_anns.labels: if label.poly_2d is None: continue category_ignored, category_id = process_category( label.category, categories, name_mapping, ignore_mapping, ignore_as_class=ignore_as_class, ) if remove_ignore and category_ignored: continue scalabel_id = str(label.id) instance_id, global_instance_id = get_bdd100k_instance_id( instance_id_maps, global_instance_id, scalabel_id) ann_id += 1 iscrowd, ignore = get_bdd100k_object_attributes( label, category_ignored) annotation = AnnType( id=ann_id, image_id=image_id, category_id=category_id, instance_id=instance_id, scalabel_id=scalabel_id, iscrowd=iscrowd, ignore=ignore, ) category_ids.append(category_id) instance_ids.append(instance_id) annotations.append(annotation) category_ids_list.append(category_ids) instance_ids_list.append(instance_ids) annotations_list.append(annotations) annotations = bitmask2coco_with_ids_parallel( annotations_list, mask_names, category_ids_list, instance_ids_list, mask_mode, nproc, ) return GtType( type="instances", categories=categories, videos=videos, images=images, annotations=annotations, )
def insseg_to_bitmasks( frames: List[Frame], out_base: str, ignore_as_class: bool = False, remove_ignore: bool = False, nproc: int = 4, ) -> None: """Converting instance segmentation poly2d to bitmasks.""" os.makedirs(out_base, exist_ok=True) categories, name_mapping, ignore_mapping = load_coco_config( mode="track", filepath=DEFAULT_COCO_CONFIG, ignore_as_class=ignore_as_class, ) out_paths: List[str] = [] colors_list: List[List[np.ndarray]] = [] poly2ds_list: List[List[List[Poly2D]]] = [] logger.info("Preparing annotations for InsSeg to Bitmasks") for image_anns in tqdm(frames): ann_id = 0 # Bitmask in .png format image_name = image_anns.name.replace(".jpg", ".png") image_name = os.path.split(image_name)[-1] out_path = os.path.join(out_base, image_name) out_paths.append(out_path) colors: List[np.ndarray] = [] poly2ds: List[List[Poly2D]] = [] colors_list.append(colors) poly2ds_list.append(poly2ds) labels_ = image_anns.labels if labels_ is None or len(labels_) == 0: continue # Scores higher, rendering later if labels_[0].score is not None: labels_ = sorted(labels_, key=lambda label: float(label.score)) for label in labels_: if label.poly2d is None: continue category_ignored, category_id = process_category( label.category, categories, name_mapping, ignore_mapping, ignore_as_class=ignore_as_class, ) if remove_ignore and category_ignored: continue ann_id += 1 color = set_instance_color(label, category_id, ann_id, category_ignored) colors.append(color) poly2ds.append(label.poly2d) logger.info("Start conversion for InsSeg to Bitmasks") frames_to_masks(nproc, out_paths, colors_list, poly2ds_list)
def bdd100k2coco_ins_seg( mask_base: str, shape: Tuple[int, int], frames: List[Frame], categories: List[CatType], name_mapping: Optional[Dict[str, str]] = None, ignore_mapping: Optional[Dict[str, str]] = None, ignore_as_class: bool = False, remove_ignore: bool = False, mask_mode: str = "rle", nproc: int = 4, ) -> GtType: """Converting BDD100K Instance Segmentation Set to COCO format.""" image_id, ann_id = 0, 0 images: List[ImgType] = [] mask_names: List[str] = [] category_ids_list: List[List[int]] = [] instance_ids_list: List[List[int]] = [] annotations_list: List[List[AnnType]] = [] logger.info("Collecting annotations...") for image_anns in tqdm(frames): instance_id = 0 image_id += 1 image = ImgType( id=image_id, file_name=image_anns.name, height=shape[0], width=shape[1], ) images.append(image) mask_name = os.path.join( mask_base, image_anns.name.replace(".jpg", ".png"), ) mask_names.append(mask_name) category_ids: List[int] = [] instance_ids: List[int] = [] annotations: List[AnnType] = [] for label in image_anns.labels: if label.poly_2d is None: continue category_ignored, category_id = process_category( label.category, categories, name_mapping, ignore_mapping, ignore_as_class=ignore_as_class, ) if category_ignored and remove_ignore: continue ann_id += 1 instance_id += 1 iscrowd, ignore = get_bdd100k_object_attributes( label, category_ignored) annotation = AnnType( id=ann_id, image_id=image_id, category_id=category_id, scalabel_id=str(label.id), iscrowd=iscrowd, ignore=ignore, ) category_ids.append(category_id) instance_ids.append(instance_id) annotations.append(annotation) category_ids_list.append(category_ids) instance_ids_list.append(instance_ids) annotations_list.append(annotations) annotations = bitmask2coco_with_ids_parallel( annotations_list, mask_names, category_ids_list, instance_ids_list, mask_mode, nproc, ) return GtType( type="instances", categories=categories, images=images, annotations=annotations, )