coco.py 3.65 KB
Newer Older
1
from .vision import VisionDataset
soumith's avatar
soumith committed
2
3
4
from PIL import Image
import os
import os.path
5
from typing import Any, Callable, Optional, Tuple, List
soumith's avatar
soumith committed
6

7

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

11
12
13
14
15
16
17
    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.
18
19
        transforms (callable, optional): A function/transform that takes input sample and its target as entry
            and returns a transformed version.
20
    """
21

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

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

36
37
38
    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
39

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

43
44
45
46
    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
47

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

51
        return image, target
soumith's avatar
soumith committed
52

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

56

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

    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.
67
68
        transforms (callable, optional): A function/transform that takes input sample and its target as entry
            and returns a transformed version.
69

70
    Example:
soumith's avatar
soumith committed
71

72
73
74
75
76
77
78
        .. 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())
79

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

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

86
        Output: ::
soumith's avatar
soumith committed
87

88
89
90
91
92
93
94
            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
95

96
97
98
99
    """

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