MS COCO
Simple Keypoints Dataset
Create a standard KeypointsDataset
(with optional in-memory cache) via
>>> import os
>>> root = os.path.join("dataset", "coco_test")
>>> from hybrid_learning.datasets.custom.coco import KeypointsDataset
>>> from hybrid_learning.datasets import caching
>>> keyptsdata = KeypointsDataset(
... dataset_root=os.path.join(root, "images", "train2017"),
... transforms_cache=caching.DictCache() # optional in-memory cache
... )
Restrict it to commercial licenses, certain keypoints, maximum number of (random) images, etc. as follows (note that by default the datasets are always subsetted to commercial licenses):
>>> from hybrid_learning.datasets.custom.coco import BodyParts
>>> keyptsdata.subset(
... license_ids=keyptsdata.COMMERCIAL_LICENSE_IDS, # default
... body_parts=[BodyParts.FACE],
... num=10, shuffle=True
... )
KeypointsDataset(...)
Now one can retrieve tuples with the desired properties from the dataset, which can be visualized via pyplot:
>>> img_t, anns = keyptsdata[0]
>>>
>>> from matplotlib import pyplot as plt
>>> import PIL.Image
>>> import torchvision as tv
>>> plt.imshow(tv.transforms.ToPILImage()(img_t))
<matplotlib.image.AxesImage object...>
Also other tuple transformations can be specified accepting
the input image (PIL.Image.Image
) and the ground truth
annotation (dict
).
E.g. to use pycocotools.COCO.showAnns
for visualizing the
keypoint annotations, one must not change the image size:
>>> # Change the transformation:
>>> import torchvision as tv
>>> to_tens = tv.transforms.ToTensor()
>>> keyptsdata.transforms = lambda i, gt: (to_tens(i), gt) # identity
>>>
>>> # Select the image and annotations
>>> img_t, anns = keyptsdata[0]
>>>
>>> # Show the image with annotations
>>> plt.imshow(tv.transforms.ToPILImage()(img_t))
<matplotlib.image.AxesImage object...>
>>> keyptsdata.coco.showAnns(anns)
Concept Segmentation Dataset
Given the keypoints, one can estimate the segmentation of
body parts
.
This is used in ConceptDataset
to generate (and store) segmentation masks for a given body part.
Create a standard ConceptDataset
via
>>> root = os.path.join("dataset", "coco_test")
>>> from hybrid_learning.datasets.custom.coco import ConceptDataset, BodyParts
>>> concept_data = ConceptDataset(
... body_parts=[BodyParts.FACE],
... annotations_fp=os.path.join(root, "annotations",
... "person_keypoints_train2017.json"),
... dataset_root=os.path.join(root, "images", "train2017")
... )
>>> # The masked keypoints occurring in the body parts are:
>>> sorted({kpt for body_part in concept_data.body_parts for kpt in body_part})
['left_eye', 'nose', 'right_eye']
By default, the dataset is not restricted to only samples containing
the specified body parts. For this (and restriction to the correct
license and length) one can use
subset()
:
>>> concept_data.subset(body_parts=[BodyParts.FACE])
ConceptDataset(...)
To have a look at some examples, one can use
apply_mask()
to visualize the
ground truth masks for the concept created in
annotations_to_mask()
.
>>> img_t, mask_t = concept_data[0]
>>> import torchvision as tv
>>> to_img = tv.transforms.ToPILImage()
>>> from matplotlib import pyplot as plt
>>> from hybrid_learning.datasets import apply_mask
>>> masked_img = apply_mask(to_img(img_t), to_img(mask_t), alpha=0.5)
>>> plt.imshow(masked_img)
<matplotlib.image.AxesImage object...>
The masks can also be re-generated if e.g.
transforms
or
masks_root
are changed,
or if lazy_mask_generation
was not set to False
during init.
>>> concept_data.generate_masks(force_rebuild=True, leave=False)