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: Instantiates ImgRotatePil from configuration.
  
  Args:
      config (Dict): arguments for for the transform
  
  Returns:
      ImgRotatePil instance.
docstr_tok: ["Instantiates","ImgRotatePil","from","configuration",".","Args",":","config","(","Dict",")",":","arguments","for","for","the","transform","Returns",":","ImgRotatePil","instance","."]
code: def from_config(cls, config: Dict[str, Any]) -> "ImgRotatePil":
      """
      Instantiates ImgRotatePil from configuration.
  
      Args:
          config (Dict): arguments for for the transform
  
      Returns:
          ImgRotatePil instance.
      """
      num_angles = config.get("num_angles", 4)
      num_rotations_per_img = config.get("num_rotations_per_img", 1)
      assert (
          num_rotations_per_img == 1
      ), "Only num_rotations_per_img=1 allowed"
      logging.info(f"ImgRotatePil | Using num_angles: {num_angles}")
      logging.info(
          f"ImgRotatePil | Using num_rotations_per_img: {num_rotations_per_img}"
      )
      return cls(
          num_angles=num_angles,
          num_rotations_per_img=num_rotations_per_img,
      )
  
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 3 for calling the ImgRotatePil obj's underlying member method code with example usage: obj.from_config(cls, config) and returns: cls