34 특정 클래스의 데이터만 남기고 제거하는 기능
36 pkl_datas (list[dict] or str): 입력 데이터 리스트 또는 데이터의 경로, 데이터에는 'label' 항목이 포함되어 있어야함
37 active_class (list) : 남기고 싶은 데이터
38 return (list[dict]): 필터링된 데이터
41 if isinstance(pkl_datas, str):
42 with open(pkl_datas,
'rb')
as f:
43 pkl_datas = pickle.load(f)
47 for data
in pkl_datas:
48 if data[
'label']
in active_class:
49 filtered_datas.append(data)
76 데이터를 훈련용과 평가용으로 분리하는 기능
78 datas (list[dict]): 데이터 리스트
79 class_num (int): 총 클래스 수
80 max_train_data_num (int): 훈련 데이터셋 최대 수량
81 max_val_data_num (int): 평가 데이터셋 최대 수량
83 train_list (list[dict]): 훈련용 데이터셋
84 val_list (list[dict]): 평가용 데이터셋
89 for i
in range(class_num):
94 data_dict[data[
'label']].append(data)
99 for key, data_list
in data_dict.items():
100 data_num = len(data_list)
101 train_data_num = max_train_data_num
102 if data_num < max_train_data_num:
103 train_data_num = int(data_num * 0.95)
106 val_data_idx = min(data_num, train_data_num+max_val_data_num)
109 random.shuffle(data_list)
110 train_list.extend(copy.deepcopy(data_list[:train_data_num]))
111 val_list.extend(copy.deepcopy(data_list[train_data_num:val_data_idx]))
114 random.shuffle(train_list)
115 random.shuffle(val_list)
117 return train_list, val_list
131 피클 파일의 정보를 생성, 입력한 키의 원소별 파일 수량과 피클 파일에 포함된 키의 원소를 생성하는 기능
133 pkl_name_list (list[str]): 피클 데이터 파일의 이름 리스트
134 pkl_path_list (list[str]): 피클 데이터 파일 경로 리스트
136 data_info_dict = dict()
137 file_info_dict = dict()
138 for name, path
in zip(pkl_name_list, pkl_path_list):
139 pkl_list = load_pkl_data(path)
140 file_info_dict[name] = []
147 if item
not in data_info_dict:
148 data_info_dict[item] = []
151 if item
not in file_info_dict[name]:
152 file_info_dict[name].append(item)
155 if name
not in data_info_dict[item]:
156 data_info_dict[item].append(name)
159 data_info_dict = dict(sorted(data_info_dict.items()))
160 return data_info_dict, file_info_dict
212 세이프모션의 2.2 버전 행동 데이터를 훈련용과 평가용으로 분리하는 기능
214 data_folder (str): 데이터가 저장된 폴더
215 save_folder (str): 학습 및 훈련용 데이터를 저장할 폴더
216 category_info (dict): 학습 데이터의 카테고리별 클래스 수
217 total_data_num (int): 클래스별 총 데이터 수(학습+평가 데이터 수)
218 ratio (float): 학습용 데이터의 비율
222 for category, num
in category_info.items():
223 split_datas[category] = dict()
224 for label
in range(num):
226 split_datas[category][label] = dict()
227 split_datas[category][label][
'train'] = []
228 split_datas[category][label][
'val'] = []
231 folder_train = os.path.join(save_folder,
'train', category, f
'{label:02d}')
232 folder_val = os.path.join(save_folder,
'val', category, f
'{label:02d}')
233 create_directory(folder_train)
234 create_directory(folder_val)
237 for category, num
in category_info.items():
238 for label
in range(num):
240 folder = os.path.join(data_folder, category, f
'{label:02d}')
241 name_list, path_list = search_file(folder,
'.pkl')
243 data_num = min(len(path_list), total_data_num)
244 train_num = int( data_num * ratio )
246 random.shuffle(path_list)
247 split_datas[category][label][
'train'] = path_list[:train_num]
248 split_datas[category][label][
'val'] = path_list[train_num:data_num]
251 for category, num
in category_info.items():
252 for label
in range(num):
253 for mode, path_list
in split_datas[category][label].items():
254 folder = os.path.join(save_folder, mode, category, f
'{label:02d}')
255 for path
in path_list:
256 name = path.split(
'/')[-1]
257 save_path = os.path.join(folder, name)
258 shutil.copy(path, save_path)