def __call__(self, image: Image, target: TargetType): w, h = image.size image_id = target["image_id"] image_id = torch.tensor([image_id]) annotations = target.pop("annotations") annotations = [ obj for obj in annotations if obj.get("iscrowd", 0) == 0 ] boxes = [obj["bbox"] for obj in annotations] # guard against no boxes via resizing boxes = torch.as_tensor(boxes, dtype=torch.float32).reshape(-1, 4) boxes[:, 2:] += boxes[:, :2] boxes[:, 0::2].clamp_(min=0, max=w) boxes[:, 1::2].clamp_(min=0, max=h) classes = [obj["category_id"] for obj in annotations] classes = torch.tensor(classes, dtype=torch.int64) segmentations = [obj["segmentation"] for obj in annotations] masks = convert_segmentation_to_mask(segmentations, h, w) keypoints = None if annotations and "keypoints" in annotations[0]: keypoints = [obj["keypoints"] for obj in annotations] keypoints = torch.as_tensor(keypoints, dtype=torch.float32) num_keypoints = keypoints.shape[0] if num_keypoints: keypoints = keypoints.view(num_keypoints, -1, 3) keep = (boxes[:, 3] > boxes[:, 1]) & (boxes[:, 2] > boxes[:, 0]) boxes = boxes[keep] classes = classes[keep] masks = masks[keep] if keypoints is not None: keypoints = keypoints[keep] target["boxes"] = boxes target["labels"] = classes target["masks"] = masks target["image_id"] = image_id if keypoints is not None: target["keypoints"] = keypoints # conversion to coco api area = torch.tensor([obj["area"] for obj in annotations]) iscrowd = torch.tensor([obj.get("iscrowd", 0) for obj in annotations]) target["area"] = area target["iscrowd"] = iscrowd return image, target
def __call__(self, image: PILImage.Image, annotation: Dict[str, Any]) -> Tuple[PILImage.Image, PILImage.Image]: w, h = image.size segmentations = [obj["segmentation"] for obj in annotation] cats = [obj["category_id"] for obj in annotation] if segmentations: masks = convert_segmentation_to_mask(segmentations, h, w) cats = torch.as_tensor(cats, dtype=masks.dtype) # merge all instance masks into a single segmentation map # with its corresponding categories target, _ = (masks * cats[:, None, None]).max(dim=0) # discard overlapping instances target[masks.sum(0) > 1] = 255 else: target = torch.zeros((h, w), dtype=torch.uint8) target = PILImage.fromarray(target.numpy()) return image, target
def __call__(self, image: PILImage.Image, target: TargetType) -> Tuple[PILImage.Image, TargetType]: w, h = image.size image_id = target["image_id"] image_id = torch.tensor([image_id]) annotations = target.pop("annotations") segmentations = [obj["segmentation"] for obj in annotations] cats = [obj["category_id"] for obj in annotations] if segmentations: masks = convert_segmentation_to_mask(segmentations, h, w) cats = torch.as_tensor(cats, dtype=masks.dtype) # merge all instance masks into a single segmentation map # with its corresponding categories mask, _ = (masks * cats[:, None, None]).max(dim=0) # discard overlapping instances mask[masks.sum(0) > 1] = 255 else: mask = torch.zeros((h, w), dtype=torch.uint8) target["mask"] = mask target["image_id"] = image_id return image, target