def __iter__(self): for batch in take_by(self._extractor, self._batch_size): inputs = np.array([item.image.data for item in batch]) inference = self._launcher.launch(inputs) for item, annotations in zip(batch, inference): yield self.wrap_item(item, annotations=annotations)
def transform_item(self, item): if not item.has_image: raise DatumaroError("Item %s: image info is required for this " "transform" % (item.id, )) h, w = item.image.size xscale = self._width / float(w) yscale = self._height / float(h) new_size = (self._height, self._width) resized_image = None if item.image.has_data: resized_image = self._lazy_resize_image(item.image, new_size) resized_annotations = [] for ann in item.annotations: if isinstance(ann, Bbox): resized_annotations.append( ann.wrap( x=ann.x * xscale, y=ann.y * yscale, w=ann.w * xscale, h=ann.h * yscale, )) elif isinstance(ann, (Polygon, Points, PolyLine)): resized_annotations.append( ann.wrap(points=[ p for t in ((x * xscale, y * yscale) for x, y in take_by(ann.points, 2)) for p in t ])) elif isinstance(ann, Mask): rescaled_mask = self._lazy_resize_mask(ann, new_size) resized_annotations.append(ann.wrap(image=rescaled_mask)) elif isinstance(ann, (Caption, Label)): resized_annotations.append(ann) else: assert False, f"Unexpected annotation type {type(ann)}" return self.wrap_item(item, image=resized_image, annotations=resized_annotations)
def _load_annotations(self, ann, image_info=None, parsed_annotations=None): if parsed_annotations is None: parsed_annotations = [] ann_id = ann['id'] attributes = ann.get('attributes', {}) if 'score' in ann: attributes['score'] = ann['score'] group = ann_id # make sure all tasks' annotations are merged if self._task is CocoTask.instances or \ self._task is CocoTask.person_keypoints or \ self._task is CocoTask.stuff: label_id = self._get_label_id(ann) attributes['is_crowd'] = bool(ann['iscrowd']) if self._task is CocoTask.person_keypoints: keypoints = ann['keypoints'] points = [] visibility = [] for x, y, v in take_by(keypoints, 3): points.append(x) points.append(y) visibility.append(v) parsed_annotations.append( Points(points, visibility, label=label_id, id=ann_id, attributes=attributes, group=group)) segmentation = ann['segmentation'] if segmentation and segmentation != [[]]: rle = None if isinstance(segmentation, list): if not self._merge_instance_polygons: # polygon - a single object can consist of multiple parts for polygon_points in segmentation: parsed_annotations.append( Polygon(points=polygon_points, label=label_id, id=ann_id, attributes=attributes, group=group)) else: # merge all parts into a single mask RLE rle = self._lazy_merged_mask(segmentation, image_info['height'], image_info['width']) elif isinstance(segmentation['counts'], list): # uncompressed RLE img_h = image_info['height'] img_w = image_info['width'] mask_h, mask_w = segmentation['size'] if img_h == mask_h and img_w == mask_w: rle = self._lazy_merged_mask([segmentation], mask_h, mask_w) else: log.warning( "item #%s: mask #%s " "does not match image size: %s vs. %s. " "Skipping this annotation.", image_info['id'], ann_id, (mask_h, mask_w), (img_h, img_w)) else: # compressed RLE rle = segmentation if rle: parsed_annotations.append( RleMask(rle=rle, label=label_id, id=ann_id, attributes=attributes, group=group)) else: x, y, w, h = ann['bbox'] parsed_annotations.append( Bbox(x, y, w, h, label=label_id, id=ann_id, attributes=attributes, group=group)) elif self._task is CocoTask.labels: label_id = self._get_label_id(ann) parsed_annotations.append( Label(label=label_id, id=ann_id, attributes=attributes, group=group)) elif self._task is CocoTask.captions: caption = ann['caption'] parsed_annotations.append( Caption(caption, id=ann_id, attributes=attributes, group=group)) else: raise NotImplementedError() return parsed_annotations