51 def make_model_input(self, data_list, clip_len=20, device='cuda:0'):
52 """
53 args:
54 data_list (list[dict]) : 행동인식 모델의 입력으로 사용할 원천 데이터(dict type)를 담고있는 리스트
55 데이터 구성
56 keypoints (np.array) : 스켈레톤 좌표(x, y) 및 스코어, shape (17, 3)
57 TODO -> image_features (np.array or Tensor): 영상 특징
58 clip_len (int) : data_list에서 샘플링하는 수량
59 device (str) : inference에 사용할 디바이스
60 return (dict) :
61 모델의 입력에 사용될 데이터
62 pose_heatmap or pose_heatmap_for_action, pose_heatmap_for_pose (Tensor): 스켈레톤 좌표를 사용해서 생성한 이미지
63 shape (1, 17, clip_len, 64, 64) or (1, 17, clip_len_pose=6, 64, 64)
64 TODO -> image_features (Tensor) : 영상특징, shape (1, C, clip_len, 1)
65 """
66
67
68
69 sample = dict()
70
71 kps = []
72 for anno in data_list:
73 kps.append(anno['keypoints'])
74
75 kps = np.array([kps])
76 sample['keypoint'] = kps[..., :2]
77 sample['keypoint_score'] = kps[..., 2]
78
79 sample = pose_sampling(sample, clip_len=clip_len)
80 sample = pose_compact(sample)
81 sample = pose_resize(sample, scale=(64, 64))
82
83 if len(self.backbone.keys()) == 1:
84
85 sample = make_pose_heatmap(sample)
86
87 sample['pose_heatmap'] = torch.from_numpy(sample['pose_heatmap']).to(device).unsqueeze(0)
88 else:
89
90
91 clip_len_pose = 6
92
93
94 sample_pose = copy.deepcopy(sample)
95
96
97 frames = sample_pose['keypoint'].shape[1]
98 start = (frames - clip_len_pose)//2
99 end = start+clip_len_pose
100 sample_pose['keypoint'] = sample_pose['keypoint'][:,start:end, :, : ]
101 sample_pose['keypoint_score'] = sample_pose['keypoint_score'][:,start:end, : ]
102 sample_pose = pose_compact(sample_pose)
103 sample_pose = pose_resize(sample_pose, scale=(64, 64))
104
105
106 sample = make_pose_heatmap(sample)
107 sample_pose = make_pose_heatmap(sample_pose)
108 sample['pose_heatmap_for_action'] = torch.from_numpy(sample['pose_heatmap']).to(device).unsqueeze(0)
109 sample['pose_heatmap_for_pose'] = torch.from_numpy(sample_pose['pose_heatmap']).to(device).unsqueeze(0)
110
111 return sample
112