def create(self):
        project_dir = self._config['project_dir']
        ref_motion_db = self._config['character'].get('ref_motion_db')
        ref_motion_scale = self._config['character'].get('ref_motion_scale')
        ref_motion_file = []

        for i, mdb in enumerate(ref_motion_db):
            motions = []
            if mdb.get('cluster_info'):
                ''' Read reference motions based on the cluster labels '''
                assert mdb.get('data') is None, \
                    'This should not be specified when cluster_info is used'
                dir = mdb['cluster_info'].get('dir')
                label_file = mdb['cluster_info'].get('label_file')
                sample_id = mdb['cluster_info'].get('sample_id')
                labels = {}
                assert label_file
                if project_dir:
                    label_file = os.path.join(project_dir, label_file)
                with open(label_file, 'r') as file:
                    for line in file:
                        l = re.split('[\t|\n|,|:| ]+', line)
                        id, rank, score, filename = int(l[0]), int(
                            l[1]), float(l[2]), str(l[3])
                        if id not in labels.keys(): labels[id] = []
                        labels[id].append({
                            'rank': rank,
                            'socre': score,
                            'filename': filename
                        })
                num_cluster = len(labels.keys())
                for j in range(num_cluster):
                    if sample_id and j != sample_id:
                        continue
                    for label in labels[j]:
                        if project_dir:
                            file = os.path.join(project_dir, dir,
                                                label['filename'])
                        motions.append(file)
            else:
                ''' Read reference motions from the specified list of files and dirs '''
                ref_motion_data = mdb.get('data')
                motions = []
                if ref_motion_data.get('file'):
                    motions += ref_motion_data.get('file')
                if ref_motion_data.get('dir'):
                    for d in ref_motion_data.get('dir'):
                        if project_dir:
                            d = os.path.join(project_dir, d)
                        motions += utils.files_in_dir(d, ext=".bvh", sort=True)
                if project_dir:
                    for j in range(len(motions)):
                        motions[j] = os.path.join(project_dir, motions[j])
            ''' 
            If num_sample is specified, we use only num_sample motions 
            from the entire reference motions. 
            'random' chooses randomly, 'top' chooses the first num_sample
            '''
            num_sample = mdb.get('num_sample')
            if num_sample:
                sample_method = mdb.get('sample_method')
                if sample_method == 'random':
                    motions = random.choices(motions, k=num_sample)
                elif sample_method == 'top':
                    motions = motions[:num_sample]
                else:
                    raise NotImplementedError
            ref_motion_file.append(motions)
        ''' Load Reference Motion '''

        self._ref_motion_all = []
        self._ref_motion_file_names = []
        for i in range(self._num_agent):
            ref_motion_all, ref_motion_file_names = \
                load_motions(ref_motion_file[i],
                             self._base_motion[i].skel,
                             self._sim_agent[i]._char_info,
                             self._verbose)
            self._ref_motion_all.append(ref_motion_all)
            self._ref_motion_file_names.append(ref_motion_file_names)
        ''' Should call reset after all setups are done '''

        self.reset({'add_noise': False})

        self._initialized = True

        if self._verbose:
            print('----- Humanoid Imitation Environment Created -----')
            for i in range(self._num_agent):
                print('[Agent%d]: state(%d) and action(%d)' \
                      %(i, len(self.state(i)), self._action_space[i].dim))
            print('-------------------------------')
Example #2
0
        help="Window stride for test and validation, in frames. This is also"
        " used as training window size",
    )

    args = parser.parse_args()

    train_files = read_content(
        os.path.join(args.split_dir, "training_fnames.txt"))
    validation_files = read_content(
        os.path.join(args.split_dir, "validation_fnames.txt"))
    test_files = read_content(os.path.join(args.split_dir, "test_fnames.txt"))

    train_ftuples = []
    test_ftuples = []
    validation_ftuples = []
    for filepath in fairmotion_utils.files_in_dir(args.input_dir, ext="pkl"):
        db_name = os.path.split(os.path.dirname(filepath))[1]
        db_name = ("_".join(db_name.split("_")[1:])
                   if "AMASS" in db_name else db_name.split("_")[0])
        f = os.path.basename(filepath)
        file_id = "{}/{}".format(db_name, f)

        if file_id in train_files:
            train_ftuples.append((filepath, file_id))
        elif file_id in validation_files:
            validation_ftuples.append((filepath, file_id))
        elif file_id in test_files:
            test_ftuples.append((filepath, file_id))
        else:
            pass
Example #3
0
    parser.add_argument("--diff-threshold", type=float, default=5.0)
    parser.add_argument("--w-joint-pos", type=float, default=8.0)
    parser.add_argument("--w-joint-vel", type=float, default=2.0)
    parser.add_argument("--w-root-pos", type=float, default=0.5)
    parser.add_argument("--w-root-vel", type=float, default=1.5)
    parser.add_argument("--w-ee-pos", type=float, default=3.0)
    parser.add_argument("--w-ee-vel", type=float, default=1.0)
    parser.add_argument("--w-trajectory", type=float, default=1.0)
    parser.add_argument("--num-workers", type=int, default=10)

    args = parser.parse_args()

    # Load motions
    motion_files = args.motion_files if args.motion_files else []
    motion_files = (motion_files +
                    utils.files_in_dir(args.motion_folder, ext="bvh")
                    if args.motion_folder else motion_files)

    motions = bvh.load_parallel(
        motion_files,
        scale=args.scale,
        v_up_skel=utils.str_to_axis(args.v_up_skel),
        v_face_skel=utils.str_to_axis(args.v_face_skel),
        v_up_env=utils.str_to_axis(args.v_up_env),
    )

    skel = motions[0].skel
    motions_with_velocity = []
    for motion in motions:
        motion.set_skeleton(skel)
        motions_with_velocity.append(