예제 #1
0
            os.makedirs(to_file)
        files = os.listdir(from_file)
        for f in files:
            if os.path.isdir(from_file + '\\' + f):
                copydirs(from_file + '\\' + f, to_file + '\\' + f)
            else:
                if '.git' not in from_file:
                    shutil.copy(from_file + '\\' + f, to_file + '\\' + f)

    copydirs('.\\', log_dir + '\\src')

    ## initilize the skeleton ##
    skeleton_mocap = Skeleton(offsets=opt['data']['offsets'],
                              parents=opt['data']['parents'])
    skeleton_mocap.cuda()
    skeleton_mocap.remove_joints(opt['data']['joints_to_remove'])

    ## load train data ##
    lafan_data_train = LaFan1(opt['data']['data_dir'], \
                              seq_len = opt['model']['seq_length'], \
                              offset = opt['data']['offset'],\
                              train = True, debug=opt['train']['debug'])
    x_mean = lafan_data_train.x_mean.cuda()
    x_std = lafan_data_train.x_std.cuda().view(1, 1,
                                               opt['model']['num_joints'], 3)
    if opt['train']['debug']:
        opt['data']['num_workers'] = 1
    lafan_loader_train = DataLoader(lafan_data_train, \
                                    batch_size=opt['train']['batch_size'], \
                                    shuffle=True, num_workers=opt['data']['num_workers'])
예제 #2
0
파일: human36m.py 프로젝트: uuuque/p2pvg
class Human36mDataset(Dataset):
    def __init__(self,
                 data_root,
                 max_seq_len,
                 delta_len,
                 n_breakpoints=0,
                 speed_range=[1, 1],
                 acc_range=[-1, 1],
                 train=True,
                 remove_static_joints=True,
                 mode='train'):
        # Set arguments
        self.data_root = osp.abspath(osp.expanduser(data_root))
        self.max_seq_len = max_seq_len
        self.delta_len = delta_len
        self.speed_range = speed_range
        self.n_breakpoints = n_breakpoints
        self.acc_range = acc_range
        self.remove_static_joints = remove_static_joints
        self.train = train
        self.subseq_len = self.delta_len * 2
        self.skeleton = Skeleton(
            parents=[
                -1, 0, 1, 2, 3, 4, 0, 6, 7, 8, 9, 0, 11, 12, 13, 14, 12, 16,
                17, 18, 19, 20, 19, 22, 12, 24, 25, 26, 27, 28, 27, 30
            ],
            joints_left=[6, 7, 8, 9, 10, 16, 17, 18, 19, 20, 21, 22, 23],
            joints_right=[1, 2, 3, 4, 5, 24, 25, 26, 27, 28, 29, 30, 31])
        assert mode in [
            'train', 'test'
        ], 'Invalid mode for Human36mDataset. Must be \'train\' or \'test\'.'
        self.mode = mode

        # Read dataset
        self.raw_data = read_human36m(self.data_root, self.mode)

        # Reformat data
        self.data = reformat_data(self.raw_data)

        # Filter out sequence that is shorter than `max_seq_len`
        self.data['pose']['3d'] = list(
            filter(lambda x: x.shape[0] >= self.max_seq_len,
                   self.data['pose']['3d']))
        self.data['pose']['2d'] = list(
            filter(lambda x: x.shape[0] >= self.max_seq_len,
                   self.data['pose']['2d']))

        # Remove static joints
        if self.remove_static_joints:
            # Bring the skeleton to 17 joints instead of the original 32
            self.remove_joints(
                [4, 5, 9, 10, 11, 16, 20, 21, 22, 23, 24, 28, 29, 30, 31])

            # Rewire shoulders to the correct parents
            self.skeleton._parents[11] = 8
            self.skeleton._parents[14] = 8

        # Preprocess data; NOTE: make sure index of pivot joint is correct, if used.
        align_and_normalize_dataset_v2(self.data)

    def __getitem__(self, idx):
        # Fetch data
        pose_2d = self.data['pose']['2d'][idx]
        pose_3d = self.data['pose']['3d'][idx]
        camera_view = self.data['camera_view'][idx]

        # Crop a sub-sequence
        total_len = pose_3d.shape[0]
        start = np.random.randint(low=0,
                                  high=total_len -
                                  self.speed_range[1] * self.max_seq_len + 1)
        pose_2d_cropped, pose_3d_cropped, speed = [], [], []
        if self.n_breakpoints > 0:  # Varying video speed
            start_offset = 5
            bps = [0, self.max_seq_len] + list(
                np.random.randint(low=1 + start_offset,
                                  high=self.max_seq_len - start_offset,
                                  size=self.n_breakpoints))
            bps = sorted(bps)
            speed.append(
                np.random.randint(low=self.speed_range[0],
                                  high=self.speed_range[1] + 1))
            for bp_i, bp in enumerate(bps[1:]):
                end = start + (bp - bps[bp_i]) * speed[-1]
                pose_2d_cropped.append(pose_2d[start:end:speed[-1]].copy())
                pose_3d_cropped.append(pose_3d[start:end:speed[-1]].copy())
                next_speed = min(
                    max(
                        speed[-1] + np.random.randint(
                            low=self.acc_range[0], high=self.acc_range[1] + 1),
                        1), self.speed_range[1])
                speed.append(next_speed)
                start = end
            speed = speed[:-1]  # The last speed not used
        else:  # Constant video speed
            bps = []
            speed = np.random.randint(low=self.speed_range[0],
                                      high=self.speed_range[1] + 1)
            pose_2d_cropped.append(
                pose_2d[start:start + self.max_seq_len * speed:speed].copy())
            pose_3d_cropped.append(
                pose_3d[start:start + self.max_seq_len * speed:speed].copy())
        pose_2d_cropped = np.concatenate(pose_2d_cropped, 0)
        pose_3d_cropped = np.concatenate(pose_3d_cropped, 0)

        # Pack data
        data = {
            'pose_2d': pose_2d_cropped,
            'pose_3d': pose_3d_cropped,
            'camera_view': camera_view,
            'speed': speed,
            'breakpoints': bps
        }

        return data

    def get_seq_len(self):
        seq_len = np.random.randint(low=self.max_seq_len - 2 * self.delta_len,
                                    high=self.max_seq_len + 1)
        return seq_len

    def remove_joints(self, joints_to_remove):
        kept_joints = self.skeleton.remove_joints(joints_to_remove)
        for seq_i in range(len(self.data['pose']['3d'])):
            self.data['pose']['3d'][seq_i] = self.data['pose']['3d'][
                seq_i][:, kept_joints]
            self.data['pose']['2d'][seq_i] = self.data['pose']['2d'][
                seq_i][:, kept_joints]

    def __len__(self):
        return len(self.data['pose']['2d'])