import cv2 import numpy as np from mmpose.core.post_processing import (affine_transform, fliplr_joints, get_affine_transform, get_warp_matrix, warp_affine_joints) from mmpose.datasets.builder import PIPELINES @PIPELINES.register_module() class TopDownAffineSam: """Affine transform the image to make input. Required keys:'img', 'joints_3d', 'joints_3d_visible', 'ann_info','scale', 'rotation' and 'center'. Modified keys:'img', 'joints_3d', and 'joints_3d_visible'. Args: use_udp (bool): To use unbiased data processing. Paper ref: Huang et al. The Devil is in the Details: Delving into Unbiased Data Processing for Human Pose Estimation (CVPR 2020). """ def __init__(self, use_udp=False): self.use_udp = use_udp def __call__(self, results): image_size = results['ann_info']['image_size'] # 修改 sam_image_size = np.array([1024, 1024]) img = results['img'] joints_3d = results['joints_3d'] joints_3d_visible = results['joints_3d_visible'] c = results['center'] s = results['scale'] r = results['rotation'] # 修改 sam_img = img if self.use_udp: trans = get_warp_matrix(r, c * 2.0, image_size - 1.0, s * 200.0) # 修改 sam_trans = get_warp_matrix(r, c * 2.0, sam_image_size - 1.0, s * 200.0) if not isinstance(img, list): img = cv2.warpAffine( img, trans, (int(image_size[0]), int(image_size[1])), flags=cv2.INTER_LINEAR) # 修改 sam_img = cv2.warpAffine( sam_img, sam_trans, (int(sam_image_size[0]), int(sam_image_size[1])), flags=cv2.INTER_LINEAR) else: img = [ cv2.warpAffine( i, trans, (int(image_size[0]), int(image_size[1])), flags=cv2.INTER_LINEAR) for i in img ] # 修改 sam_img = [ cv2.warpAffine( i, sam_trans, (int(sam_image_size[0]), int(sam_image_size[1])), flags=cv2.INTER_LINEAR) for i in sam_img ] joints_3d[:, 0:2] = \ warp_affine_joints(joints_3d[:, 0:2].copy(), trans) else: trans = get_affine_transform(c, s, r, image_size) # 修改 sam_trans = get_affine_transform(c, s, r, sam_image_size) if not isinstance(img, list): img = cv2.warpAffine( img, trans, (int(image_size[0]), int(image_size[1])), flags=cv2.INTER_LINEAR) # 修改 sam_img = cv2.warpAffine( sam_img, sam_trans, (int(sam_image_size[0]), int(sam_image_size[1])), flags=cv2.INTER_LINEAR) else: img = [ cv2.warpAffine( i, trans, (int(image_size[0]), int(image_size[1])), flags=cv2.INTER_LINEAR) for i in img ] # 修改 sam_img = [ cv2.warpAffine( i, sam_trans, (int(sam_image_size[0]), int(sam_image_size[1])), flags=cv2.INTER_LINEAR) for i in sam_img ] for i in range(results['ann_info']['num_joints']): if joints_3d_visible[i, 0] > 0.0: joints_3d[i, 0:2] = affine_transform(joints_3d[i, 0:2], trans) results['img'] = img results['sam_img'] = sam_img results['joints_3d'] = joints_3d results['joints_3d_visible'] = joints_3d_visible return results