class_docstr: Corner cropping and multi-scale cropping.
      Two data augmentation techniques introduced in:
      Towards Good Practices for Very Deep Two-Stream ConvNets,
      http://arxiv.org/abs/1507.02159
      Limin Wang, Yuanjun Xiong, Zhe Wang and Yu Qiao
  
  Parameters:
  ----------
  size : int
      height and width required by network input, e.g., (224, 224)
  scale_ratios : list
      efficient scale jittering, e.g., [1.0, 0.875, 0.75, 0.66]
  fix_crop : bool
      use corner cropping or not. Default: True
  more_fix_crop : bool
      use more corners or not. Default: True
  max_distort : float
      maximum aspect ratio distortion, used together with scale_ratios. Default: 1
  
  Inputs:
      - **data**: a list of frames with shape [H x W x C]
  
  Outputs:
      - **out**: a list of cropped frames with shape [size x size x C]
class_docstr_tok: ["Corner","cropping","and","multi-scale","cropping",".","Two","data","augmentation","techniques","introduced","in",":","Towards","Good","Practices","for","Very","Deep","Two-Stream","ConvNets",",","http",":","\/\/arxiv.org\/abs\/1507.02159","Limin","Wang",",","Yuanjun","Xiong",",","Zhe","Wang","and","Yu","Qiao","Parameters",":","--","--","--","--","--","size",":","int","height","and","width","required","by","network","input",",","e.g.",",","(","224",",","224",")","scale_ratios",":","list","efficient","scale","jittering",",","e.g.",",","[","1.0",",","0.875",",","0.75",",","0.66","]","fix_crop",":","bool","use","corner","cropping","or","not",".","Default",":","True","more_fix_crop",":","bool","use","more","corners","or","not",".","Default",":","True","max_distort",":","float","maximum","aspect","ratio","distortion",",","used","together","with","scale_ratios",".","Default",":","1","Inputs",":","-","*","*","data","*","*",":","a","list","of","frames","with","shape","[","H","x","W","x","C","]","Outputs",":","-","*","*","out","*","*",":","a","list","of","cropped","frames","with","shape","[","size","x","size","x","C","]"]
code: def forward(self, clips):
      h, w, _ = clips[0].shape
  
      crop_size_pairs = self.fillCropSize(
          self.scale_ratios, self.max_distort, h, w
      )
      size_sel = random.choice(crop_size_pairs)
      crop_height = size_sel[0]
      crop_width = size_sel[1]
  
      if self.fix_crop:
          offsets = self.fillFixOffset(
              self.more_fix_crop, h, w, crop_height, crop_width
          )
          off_sel = random.choice(offsets)
          h_off = off_sel[0]
          w_off = off_sel[1]
      else:
          h_off = random.randint(0, h - crop_height)
          w_off = random.randint(0, w - crop_width)
  
      new_clips = []
      for cur_img in clips:
          crop_img = cur_img[
              h_off : h_off + crop_height, w_off : w_off + crop_width, :
          ]
          new_clips.append(
              self.cv2.resize(crop_img, (self.width, self.height))
          )
      return new_clips
  
imports: from __future__ import division
  import random
  import math
  import numbers
  import numpy
  from mxnet.gluon import Block
label_desc: Use image node_id 4 for calling the VideoMultiScaleCrop obj's underlying member method code with example usage: obj.forward(clips) and returns: new_clips