coco.py 3.67 KB
Newer Older
soumith's avatar
soumith committed
1
2
import os
import os.path
3
from typing import Any, Callable, Optional, Tuple, List
soumith's avatar
soumith committed
4

5
6
7
8
from PIL import Image

from .vision import VisionDataset

9

10
11
class CocoDetection(VisionDataset):
    """`MS Coco Detection <https://cocodataset.org/#detection-2016>`_ Dataset.
12

13
14
15
16
17
18
19
    Args:
        root (string): Root directory where images are downloaded to.
        annFile (string): Path to json annotation file.
        transform (callable, optional): A function/transform that  takes in an PIL image
            and returns a transformed version. E.g, ``transforms.ToTensor``
        target_transform (callable, optional): A function/transform that takes in the
            target and transforms it.
20
21
        transforms (callable, optional): A function/transform that takes input sample and its target as entry
            and returns a transformed version.
22
    """
23

Philip Meier's avatar
Philip Meier committed
24
    def __init__(
25
26
27
28
29
30
        self,
        root: str,
        annFile: str,
        transform: Optional[Callable] = None,
        target_transform: Optional[Callable] = None,
        transforms: Optional[Callable] = None,
31
    ) -> None:
32
        super().__init__(root, transforms, transform, target_transform)
soumith's avatar
soumith committed
33
        from pycocotools.coco import COCO
34

soumith's avatar
soumith committed
35
        self.coco = COCO(annFile)
36
        self.ids = list(sorted(self.coco.imgs.keys()))
soumith's avatar
soumith committed
37

38
39
40
    def _load_image(self, id: int) -> Image.Image:
        path = self.coco.loadImgs(id)[0]["file_name"]
        return Image.open(os.path.join(self.root, path)).convert("RGB")
soumith's avatar
soumith committed
41

42
    def _load_target(self, id: int) -> List[Any]:
43
        return self.coco.loadAnns(self.coco.getAnnIds(id))
soumith's avatar
soumith committed
44

45
46
47
48
    def __getitem__(self, index: int) -> Tuple[Any, Any]:
        id = self.ids[index]
        image = self._load_image(id)
        target = self._load_target(id)
soumith's avatar
soumith committed
49

50
        if self.transforms is not None:
51
            image, target = self.transforms(image, target)
soumith's avatar
soumith committed
52

53
        return image, target
soumith's avatar
soumith committed
54

Philip Meier's avatar
Philip Meier committed
55
    def __len__(self) -> int:
soumith's avatar
soumith committed
56
57
        return len(self.ids)

58

59
60
class CocoCaptions(CocoDetection):
    """`MS Coco Captions <https://cocodataset.org/#captions-2015>`_ Dataset.
61
62
63
64
65
66
67
68

    Args:
        root (string): Root directory where images are downloaded to.
        annFile (string): Path to json annotation file.
        transform (callable, optional): A function/transform that  takes in an PIL image
            and returns a transformed version. E.g, ``transforms.ToTensor``
        target_transform (callable, optional): A function/transform that takes in the
            target and transforms it.
69
70
        transforms (callable, optional): A function/transform that takes input sample and its target as entry
            and returns a transformed version.
71

72
    Example:
soumith's avatar
soumith committed
73

74
75
76
77
78
79
80
        .. code:: python

            import torchvision.datasets as dset
            import torchvision.transforms as transforms
            cap = dset.CocoCaptions(root = 'dir where images are',
                                    annFile = 'json annotation file',
                                    transform=transforms.ToTensor())
81

82
83
            print('Number of samples: ', len(cap))
            img, target = cap[3] # load 4th sample
soumith's avatar
soumith committed
84

85
86
            print("Image Size: ", img.size())
            print(target)
soumith's avatar
soumith committed
87

88
        Output: ::
soumith's avatar
soumith committed
89

90
91
92
93
94
95
96
            Number of samples: 82783
            Image Size: (3L, 427L, 640L)
            [u'A plane emitting smoke stream flying over a mountain.',
            u'A plane darts across a bright blue sky behind a mountain covered in snow',
            u'A plane leaves a contrail above the snowy mountain top.',
            u'A mountain that has a plane flying overheard in the distance.',
            u'A mountain view with a plume of smoke in the background']
soumith's avatar
soumith committed
97

98
99
    """

100
    def _load_target(self, id: int) -> List[str]:
101
        return [ann["caption"] for ann in super()._load_target(id)]