transforms.rst 4.94 KB
Newer Older
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
1
2
torchvision.transforms
======================
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
3
4
5

.. currentmodule:: torchvision.transforms

6
7
8
9
10
Transforms are common image transformations. They can be chained together using :class:`Compose`.
Additionally, there is the :mod:`torchvision.transforms.functional` module.
Functional transforms give fine-grained control over the transformations.
This is useful if you have to build a more complex transformation pipeline
(e.g. in the case of segmentation tasks).
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
11

12
13
14
15
16
All transformations accept PIL Image, Tensor Image or batch of Tensor Images as input. Tensor Image is a tensor with
``(C, H, W)`` shape, where ``C`` is a number of channels, ``H`` and ``W`` are image height and width. Batch of
Tensor Images is a tensor of ``(B, C, H, W)`` shape, where ``B`` is a number of images in the batch. Deterministic or
random transformations applied on the batch of Tensor Images identically transform all the images of the batch.

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
.. warning::

    Since v0.8.0 all random transformations are using torch default random generator to sample random parameters.
    It is a backward compatibility breaking change and user should set the random state as following:

    .. code:: python

        # Previous versions
        # import random
        # random.seed(12)

        # Now
        import torch
        torch.manual_seed(17)

    Please, keep in mind that the same seed for torch random generator and Python random generator will not
    produce the same results.

35
36

Scriptable transforms
vfdev's avatar
vfdev committed
37
---------------------
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

In order to script the transformations, please use ``torch.nn.Sequential`` instead of :class:`Compose`.

.. code:: python

    transforms = torch.nn.Sequential(
        transforms.CenterCrop(10),
        transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
    )
    scripted_transforms = torch.jit.script(transforms)

Make sure to use only scriptable transformations, i.e. that work with ``torch.Tensor`` and does not require
`lambda` functions or ``PIL.Image``.

For any custom transformations to be used with ``torch.jit.script``, they should be derived from ``torch.nn.Module``.

54

vfdev's avatar
vfdev committed
55
56
Compositions of transforms
--------------------------
57

Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
58
59
.. autoclass:: Compose

vfdev's avatar
vfdev committed
60
61
Transforms on PIL Image and torch.\*Tensor
------------------------------------------
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
62

63
.. autoclass:: CenterCrop
vfdev's avatar
vfdev committed
64
    :members:
65

66
.. autoclass:: ColorJitter
vfdev's avatar
vfdev committed
67
    :members:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
68

69
.. autoclass:: FiveCrop
vfdev's avatar
vfdev committed
70
    :members:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
71

72
.. autoclass:: Grayscale
vfdev's avatar
vfdev committed
73
    :members:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
74

75
.. autoclass:: Pad
vfdev's avatar
vfdev committed
76
    :members:
77

78
.. autoclass:: RandomAffine
vfdev's avatar
vfdev committed
79
    :members:
80

81
.. autoclass:: RandomApply
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
82

83
.. autoclass:: RandomCrop
vfdev's avatar
vfdev committed
84
    :members:
85

86
.. autoclass:: RandomGrayscale
vfdev's avatar
vfdev committed
87
    :members:
88

89
.. autoclass:: RandomHorizontalFlip
vfdev's avatar
vfdev committed
90
    :members:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
91

92
.. autoclass:: RandomPerspective
vfdev's avatar
vfdev committed
93
    :members:
94

95
.. autoclass:: RandomResizedCrop
vfdev's avatar
vfdev committed
96
    :members:
97

98
.. autoclass:: RandomRotation
vfdev's avatar
vfdev committed
99
    :members:
100

101
.. autoclass:: RandomSizedCrop
vfdev's avatar
vfdev committed
102
    :members:
103
104

.. autoclass:: RandomVerticalFlip
vfdev's avatar
vfdev committed
105
    :members:
106
107

.. autoclass:: Resize
vfdev's avatar
vfdev committed
108
    :members:
109
110

.. autoclass:: Scale
vfdev's avatar
vfdev committed
111
    :members:
112
113

.. autoclass:: TenCrop
vfdev's avatar
vfdev committed
114
    :members:
115

116
.. autoclass:: GaussianBlur
vfdev's avatar
vfdev committed
117
    :members:
118

vfdev's avatar
vfdev committed
119
Transforms on PIL Image only
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
120
121
----------------------------

vfdev's avatar
vfdev committed
122
123
124
125
126
127
128
129
.. autoclass:: RandomChoice

.. autoclass:: RandomOrder


Transforms on torch.\*Tensor only
---------------------------------

surgan12's avatar
surgan12 committed
130
.. autoclass:: LinearTransformation
vfdev's avatar
vfdev committed
131
    :members:
surgan12's avatar
surgan12 committed
132

Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
133
.. autoclass:: Normalize
vfdev's avatar
vfdev committed
134
    :members:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
135

136
.. autoclass:: RandomErasing
vfdev's avatar
vfdev committed
137
138
139
140
    :members:

.. autoclass:: ConvertImageDtype

141

Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
142
143
144
Conversion Transforms
---------------------

145
.. autoclass:: ToPILImage
vfdev's avatar
vfdev committed
146
    :members:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
147

148
.. autoclass:: ToTensor
vfdev's avatar
vfdev committed
149
150
    :members:

Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
151
152
153
154
155

Generic Transforms
------------------

.. autoclass:: Lambda
vfdev's avatar
vfdev committed
156
    :members:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
157

158
159
160
161

Functional Transforms
---------------------

162
163
164
165
Functional transforms give you fine-grained control of the transformation pipeline.
As opposed to the transformations above, functional transforms don't contain a random number
generator for their parameters.
That means you have to specify/generate all parameters, but you can reuse the functional transform.
166
167
168

Example:
you can apply a functional transform with the same parameters to multiple images like this:
169
170
171
172
173
174
175

.. code:: python

    import torchvision.transforms.functional as TF
    import random

    def my_segmentation_transforms(image, segmentation):
176
        if random.random() > 0.5:
177
178
179
180
181
182
            angle = random.randint(-30, 30)
            image = TF.rotate(image, angle)
            segmentation = TF.rotate(segmentation, angle)
        # more transforms ...
        return image, segmentation

183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204

Example:
you can use a functional transform to build transform classes with custom behavior:

.. code:: python

    import torchvision.transforms.functional as TF
    import random

    class MyRotationTransform:
        """Rotate by one of the given angles."""

        def __init__(self, angles):
            self.angles = angles

        def __call__(self, x):
            angle = random.choice(self.angles)
            return TF.rotate(x, angle)

    rotation_transform = MyRotationTransform(angles=[-30, -15, 0, 15, 30])


205
206
.. automodule:: torchvision.transforms.functional
    :members: