class_docstr: apply affine transform to image and coords
  Args:
      trainsize (list): [w, h], the standard size used to train
      use_udp (bool): whether to use Unbiased Data Processing.
      records(dict): the dict contained the image and coords
  Returns:
      records (dict): contain the image and coords after tranformed
class_docstr_tok: ["apply","affine","transform","to","image","and","coords","Args",":","trainsize","(","list",")",":","[","w",",","h","]",",","the","standard","size","used","to","train","use_udp","(","bool",")",":","whether","to","use","Unbiased","Data","Processing",".","records","(","dict",")",":","the","dict","contained","the","image","and","coords","Returns",":","records","(","dict",")",":","contain","the","image","and","coords","after","tranformed"]
code: def __call__(self, image, im_info):
      rot = 0
      imshape = im_info["im_shape"][::-1]
      center = (
          im_info["center"] if "center" in im_info else imshape / 2.0
      )
      scale = im_info["scale"] if "scale" in im_info else imshape
      if self.use_udp:
          trans = get_warp_matrix(
              rot,
              center * 2.0,
              [self.trainsize[0] - 1.0, self.trainsize[1] - 1.0],
              scale,
          )
          image = cv2.warpAffine(
              image,
              trans,
              (int(self.trainsize[0]), int(self.trainsize[1])),
              flags=cv2.INTER_LINEAR,
          )
      else:
          trans = get_affine_transform(
              center, scale, rot, self.trainsize
          )
          image = cv2.warpAffine(
              image,
              trans,
              (int(self.trainsize[0]), int(self.trainsize[1])),
              flags=cv2.INTER_LINEAR,
          )
  
      return image, im_info
  
imports: import numpy
  import cv2
  import copy
label_desc: Use image node_id 2 for calling the TopDownEvalAffine obj's underlying member method code with example usage: obj.__call__(image, im_info) and returns: image,  im_info