class_docstr: Apply rotation to a PIL Image. Samples rotation angle from a set of
  predefined rotation angles.
  
  Predefined rotation angles are sampled at
  equal intervals in the [0, 360) angle space where the number of angles
  is specified by `num_angles`.
  
  This transform was used in RotNet - https://arxiv.org/abs/1803.07728
docstr: Args:
      num_angles (int): Number of angles in the [0, 360) space
      num_rotations_per_img (int): Number of rotations to apply to each image.
docstr_tok: ["Args",":","num_angles","(","int",")",":","Number","of","angles","in","the","[","0",",","360",")","space","num_rotations_per_img","(","int",")",":","Number","of","rotations","to","apply","to","each","image","."]
code: def __init__(self, num_angles=4, num_rotations_per_img=1):
      """
      Args:
          num_angles (int): Number of angles in the [0, 360) space
          num_rotations_per_img (int): Number of rotations to apply to each image.
      """
      self.num_angles = num_angles
      self.num_rotations_per_img = num_rotations_per_img
      # the last angle is 360 and 1st angle is 0, both give the original image.
      # 360 is not useful so remove it
      self.angles = torch.linspace(0, 360, num_angles + 1)[:-1].tolist()
  
file_path: vissl/vissl/data/ssl_transforms/img_rotate_pil.py
imports: import logging
  from typing import Any, Dict
  import torch
  import torchvision.transforms.functional
  from classy_vision.dataset.transforms import register_transform
  from classy_vision.dataset.transforms.classy_transform import ClassyTransform
label_desc: Use image node_id 1 to create a new ImgRotatePil object from inherited base classes: ClassyTransform with example: obj = ImgRotatePil(num_angles, num_rotations_per_img)