Safemotion Lib
Loading...
Searching...
No Matches
Functions
utils_data Namespace Reference

Functions

 check_json_format (path_format, json_file_name)
 
 check_json_version (json_file_name)
 
 join (path_list)
 
 make_dataset_folder_path (json_file_name, ret_img_folder=False, json_version=None)
 
 make_image_base_path (json_version, anno_path)
 
 make_image_folder (json_version, anno_path)
 
 load_annotation (anno_path)
 
 save_json (path, dataset)
 
 load_json (path)
 
 check_and_init_dataset (dataset, check_list, default_value)
 
 check_and_init_dictionary (dictionary, check_list, default_value)
 
 make_dummy_annotation (anno_id, image_id, track_id=0)
 
 load_scenario (json_version, scenario_num)
 
 load_label_map (label_map_ver, label_key)
 
 search_json_by_path_format (folder, data_root=None)
 
 load_pkl_data (pkl_path)
 
 save_pkl_data (pkl_data, save_path)
 
 dataset_class_filtering (pkl_datas, active_class)
 
 print_data_num_per_class (data_list, labelmap)
 
 split_train_and_val (datas, class_num, max_train_data_num, max_val_data_num)
 
 remove_items (original_list, remove_items)
 
 make_pkl_info (pkl_name_list, pkl_path_list, key='label')
 
 split_train_and_val_v22 (data_folder, save_folder, category_info, total_data_num=100, ratio=0.8)
 
 load_labelmap (path)
 

Function Documentation

◆ check_and_init_dataset()

utils_data.check_and_init_dataset ( dataset,
check_list,
default_value )
어노테이션 데이터를 확인해서 필요한 정보를 초기화 하는 기능
args:
    dataset (dict): 어노테이션 데이터
    check_list (list[str]): 확인하는 정보, 어노테이션 데이터에 해당 키가 없으면 default_value로 초기화 시켜줌
    default_value : 초기화 값
return (dict): 어노테이션 데이터

Definition at line 201 of file utils_data.py.

201def check_and_init_dataset(dataset, check_list, default_value):
202 """
203 어노테이션 데이터를 확인해서 필요한 정보를 초기화 하는 기능
204 args:
205 dataset (dict): 어노테이션 데이터
206 check_list (list[str]): 확인하는 정보, 어노테이션 데이터에 해당 키가 없으면 default_value로 초기화 시켜줌
207 default_value : 초기화 값
208 return (dict): 어노테이션 데이터
209 """
210 for idx, anno in enumerate(dataset['annotations']):
211 for check_key, init_val in zip(check_list, default_value):
212 if not (check_key in anno):
213 dataset['annotations'][idx][check_key] = init_val
214 return dataset
215

◆ check_and_init_dictionary()

utils_data.check_and_init_dictionary ( dictionary,
check_list,
default_value )
데이터를 확인해서 필요한 정보를 초기화 하는 기능
args:
    dictionary (dict): 데이터
    check_list (list[str]): 확인하는 정보, 데이터에 해당 키가 없으면 default_value로 초기화 시켜줌
    default_value : 초기화 값
return (dict): 데이터

Definition at line 216 of file utils_data.py.

216def check_and_init_dictionary(dictionary, check_list, default_value):
217 """
218 데이터를 확인해서 필요한 정보를 초기화 하는 기능
219 args:
220 dictionary (dict): 데이터
221 check_list (list[str]): 확인하는 정보, 데이터에 해당 키가 없으면 default_value로 초기화 시켜줌
222 default_value : 초기화 값
223 return (dict): 데이터
224 """
225 for key, val in zip(check_list, default_value):
226 if not key in dictionary:
227 dictionary[key] = val
228 return dictionary
229

◆ check_json_format()

utils_data.check_json_format ( path_format,
json_file_name )
json 파일 이름이 해당 포맷에 부합하는지 확인하는 기능
args:
    path_format : 확인하려는 포맷
    json_file_name : 확인하려는 파일 이름
return (bool): 부합여부

Definition at line 11 of file utils_data.py.

11def check_json_format(path_format, json_file_name):
12 """
13 json 파일 이름이 해당 포맷에 부합하는지 확인하는 기능
14 args:
15 path_format : 확인하려는 포맷
16 json_file_name : 확인하려는 파일 이름
17 return (bool): 부합여부
18 """
19 try :
20 for pf in path_format:
21 filename_re = re.compile(pf)
22 str_format = filename_re.search(json_file_name).group()
23 except:
24 return False
25
26 return True
27

◆ check_json_version()

utils_data.check_json_version ( json_file_name)
json_file_name 이름으로 버전을 확인하는 기능
return (int): json 파일의 버전

Definition at line 28 of file utils_data.py.

28def check_json_version(json_file_name):
29 """
30 json_file_name 이름으로 버전을 확인하는 기능
31 return (int): json 파일의 버전
32 """
33 for key, path_format in PATH_FORMAT.items():
34 if check_json_format(path_format, json_file_name):
35 return key
36 return None
37

◆ dataset_class_filtering()

utils_data.dataset_class_filtering ( pkl_datas,
active_class )
특정 클래스의 데이터만 남기고 제거하는 기능
args:
    pkl_datas (list[dict] or str): 입력 데이터 리스트 또는 데이터의 경로, 데이터에는 'label' 항목이 포함되어 있어야함
    active_class (list) : 남기고 싶은 데이터
return (list[dict]): 필터링된 데이터

Definition at line 32 of file utils_data.py.

32def dataset_class_filtering(pkl_datas, active_class):
33 """
34 특정 클래스의 데이터만 남기고 제거하는 기능
35 args:
36 pkl_datas (list[dict] or str): 입력 데이터 리스트 또는 데이터의 경로, 데이터에는 'label' 항목이 포함되어 있어야함
37 active_class (list) : 남기고 싶은 데이터
38 return (list[dict]): 필터링된 데이터
39 """
40
41 if isinstance(pkl_datas, str): #pkl_datas가 문자열이면 데이터 로드
42 with open(pkl_datas, 'rb') as f:
43 pkl_datas = pickle.load(f)
44
45 #데이터 필터링
46 filtered_datas = []
47 for data in pkl_datas:
48 if data['label'] in active_class: #남길 데이터인지 확인
49 filtered_datas.append(data)
50 return filtered_datas
51

◆ join()

utils_data.join ( path_list)
os.path.join 기능 커스텀, 플랫폼에 따라 다르게 동작함
args:
    path_list (list): 이어붙이려는 폴더 및 경로 리스트
return (str) : path_list를 결합한 경로

Definition at line 38 of file utils_data.py.

38def join(path_list):
39 """
40 os.path.join 기능 커스텀, 플랫폼에 따라 다르게 동작함
41 args:
42 path_list (list): 이어붙이려는 폴더 및 경로 리스트
43 return (str) : path_list를 결합한 경로
44 """
45 if platform.system().lower() == 'windows':
46 return "/".join(path_list)
47 else:
48 path_list_tmp = [path_list[0]]
49 for p in path_list[1:]:
50 p_list = p.split('/')
51 if '' in p_list:
52 p_list.remove('')
53 path_list_tmp.extend(p_list)
54 return os.path.join(*path_list_tmp)
55

◆ load_annotation()

utils_data.load_annotation ( anno_path)
어노테이션 파일을 로드해서 기본 정보를 반환하는 기능
args:
    anno_path (str): json 파일 경로
return:
    json_version (int): json 파일 버전
    label_map_version  (int): 레이블맵 버전
    base_path (str): 데이터가 저장된 기본 경로
    image_base_path (str): 이미지가 저장된 기본 경로
    dataset (dict): 어노테이션 데이터

Definition at line 151 of file utils_data.py.

151def load_annotation(anno_path):
152 """
153 어노테이션 파일을 로드해서 기본 정보를 반환하는 기능
154 args:
155 anno_path (str): json 파일 경로
156 return:
157 json_version (int): json 파일 버전
158 label_map_version (int): 레이블맵 버전
159 base_path (str): 데이터가 저장된 기본 경로
160 image_base_path (str): 이미지가 저장된 기본 경로
161 dataset (dict): 어노테이션 데이터
162 """
163 with open(anno_path, "r") as json_file:
164 dataset = json.load(json_file)
165
166 json_version = int(float(dataset["info"]["version"])*10)
167 label_map_version = int(float(dataset["info"]["label_map_version"])*10)
168 base_path, image_base_path = make_image_base_path(json_version, anno_path)
169 dataset = check_and_init_dataset(dataset, CHECK_LIST[json_version]["keys"], CHECK_LIST[json_version]["default_value"])
170
171 return json_version, label_map_version, base_path, image_base_path, dataset
172

◆ load_json()

utils_data.load_json ( path)
어노테이션 데이터를 로드하는 기능
args:
    path (str): 어노테이션 경로
return (dict): 어노테이션 데이터

Definition at line 186 of file utils_data.py.

186def load_json(path):
187 """
188 어노테이션 데이터를 로드하는 기능
189 args:
190 path (str): 어노테이션 경로
191 return (dict): 어노테이션 데이터
192 """
193 try:
194 with open(path, "r") as json_file:
195 data = json.load(json_file)
196 except Exception as e:
197 data = None
198
199 return data
200

◆ load_label_map()

utils_data.load_label_map ( label_map_ver,
label_key )

Definition at line 298 of file utils_data.py.

298def load_label_map(label_map_ver, label_key):
299 file_name = LABEL_FILE_INFO[label_map_ver][label_key]['file_name']
300 splitStr = LABEL_FILE_INFO[label_map_ver][label_key]['keys']
301 path = os.path.join(LABEL_BASE, file_name)
302
303 labels = dict.fromkeys(splitStr)
304 with open(path, "r", encoding='UTF-8') as txt_file:
305 lines = txt_file.readlines()
306
307 key = splitStr[0]
308
309 for line in lines:
310 line = line.strip()
311 if len(line) < 1:
312 continue
313
314 if line in splitStr:
315 key = line
316 labels[key] = []
317 continue
318
319 labels[key].append(line)
320
321 return labels, splitStr
322
323

◆ load_labelmap()

utils_data.load_labelmap ( path)
레이블 맵을 로드하는 기능
args:
    path (str): 레이블 맵이 저장된 경로, 레이블 맵 파일은 1라인에 클래스 명이 기록되어 있어야함
return (list[str]): 레이블 맵

Definition at line 260 of file utils_data.py.

260def load_labelmap(path):
261 """
262 레이블 맵을 로드하는 기능
263 args:
264 path (str): 레이블 맵이 저장된 경로, 레이블 맵 파일은 1라인에 클래스 명이 기록되어 있어야함
265 return (list[str]): 레이블 맵
266 """
267 label_map = [x.strip() for x in open(path).readlines()]
268 return label_map

◆ load_pkl_data()

utils_data.load_pkl_data ( pkl_path)
pkl 데이터를 로드하는 기능
args:
    pkl_path (str): pkl 데이터가 저장된 경로
return: pkl 데이터

Definition at line 11 of file utils_data.py.

11def load_pkl_data(pkl_path):
12 """
13 pkl 데이터를 로드하는 기능
14 args:
15 pkl_path (str): pkl 데이터가 저장된 경로
16 return: pkl 데이터
17 """
18 with open(pkl_path, 'rb') as f:
19 pkl_datas = pickle.load(f)
20 return pkl_datas
21

◆ load_scenario()

utils_data.load_scenario ( json_version,
scenario_num )

Definition at line 285 of file utils_data.py.

285def load_scenario(json_version, scenario_num):
286 path = os.path.join(SCENARIO_FILE_BASE, SCENARIO_FILE[json_version])
287 with open(path, "r", encoding="UTF8") as file:
288 lines = file.readlines()
289 lines = [line.rstrip() for line in lines]
290
291 sceneLine = []
292 for i in lines:
293 tmp_i = i.split(".")
294 if tmp_i[0] == scenario_num:
295 sceneLine.append(tmp_i[1])
296 return sceneLine
297

◆ make_dataset_folder_path()

utils_data.make_dataset_folder_path ( json_file_name,
ret_img_folder = False,
json_version = None )
json파일 이름으로 json 파일이 저장된 폴더와 이미지 폴더를 만드는 기능
args:
    json_file_name (str): json 파일 이름 
    ret_img_folder (bool): 이미지 폴더 반환 여부
    json_version (bool): json 파일 버전, 설정하지 않으면 json 파일 이름으로 json 파일 버전을 확인함
return (str): json 파일이 저장된 폴더경로, 이미지 경로

Definition at line 56 of file utils_data.py.

56def make_dataset_folder_path(json_file_name, ret_img_folder=False, json_version=None):
57 """
58 json파일 이름으로 json 파일이 저장된 폴더와 이미지 폴더를 만드는 기능
59 args:
60 json_file_name (str): json 파일 이름
61 ret_img_folder (bool): 이미지 폴더 반환 여부
62 json_version (bool): json 파일 버전, 설정하지 않으면 json 파일 이름으로 json 파일 버전을 확인함
63 return (str): json 파일이 저장된 폴더경로, 이미지 경로
64 """
65 if json_version is None:
66 json_version = check_json_version(json_file_name)
67
68 path_format = PATH_FORMAT[json_version]
69 dataset_path_list = []
70 for pf in path_format:
71 filename_re = re.compile(pf)
72 str_format = filename_re.search(json_file_name).group()
73 dataset_path_list.append(str_format)
74
75 json_path_list = dataset_path_list[:2]
76 json_folder = join(json_path_list)
77 image_folder = join(dataset_path_list)
78
79
80 if ret_img_folder:
81 return json_folder, image_folder
82 else:
83 return json_folder
84

◆ make_dummy_annotation()

utils_data.make_dummy_annotation ( anno_id,
image_id,
track_id = 0 )
더미데이터를 생성하는 기능
args:
    anno_id (int): 어노테이션 아이디
    image_id (int): 이미지 아이디
    track_id (int): 추적 아이디
return (dict): 더미 데이터

Definition at line 230 of file utils_data.py.

230def make_dummy_annotation(anno_id, image_id, track_id=0):
231 """
232 더미데이터를 생성하는 기능
233 args:
234 anno_id (int): 어노테이션 아이디
235 image_id (int): 이미지 아이디
236 track_id (int): 추적 아이디
237 return (dict): 더미 데이터
238 """
239 tmp_annotation = {
240 "id": anno_id,
241 "image_id": image_id,
242 "category_id": 1,
243 "iscrowd": 0,
244 "keypoints": [
245 [178.87325418994442, 168.6456005586591, 1.0],
246 [197.7807262569836, 135.67562849162016, 1.0],
247 [149.12639664804487, 140.08938547486025, 1.0],
248 [241.84322625698292, 161.00872905027938, 1.0],
249 [121.84322625698292, 161.00872905027938, 1.0],
250 [218.3100558659221, 205.59811452513907, 1.0],
251 [151.26187150837973, 209.51885474860308, 1.0],
252 [274.60125698323964, 257.7213687150835, 1.0],
253 [112.21508379888269, 268.0677374301673, 1.0],
254 [320.4018854748606, 337.25139664804476, 1.0],
255 [87.6002094972066, 346.36592178770945, 1.0],
256 [246.41445530726241, 379.5006983240222, 1.0],
257 [175.2807262569836, 380.26012569832403, 1.0],
258 [283.3463687150843, 503.20949720670353, 1.0],
259 [168.83449720670387, 514.8495111731842, 1.0],
260 [316.25453910614533, 637.7988826815641, 1.0],
261 [157.21508379888246, 641.4738128491614, 1.0],
262 ],
263 "area": 903482.25,
264 "bbox": [32.3882681564246, 17.625698324022324, 391.0, 710.0],
265 "ageclass": 0,
266 "genderclass": 0,
267 "upperclass": 0,
268 "uppercolor": [255.0, 255.0, 255.0],
269 "lowerclass": 0,
270 "lowercolor": [255.0, 255.0, 255.0],
271 "hatvisible": 0,
272 "hatcolor": [-1.0, -1.0, -1.0],
273 "bagvisible": 0,
274 "bagcolor": [-1.0, -1.0, -1.0],
275 "action_id": {'action': 0, 'pose':0, 'hand':0, 'foot':0},
276 "mutual_action": 0,
277 "mutual_action_target": [],
278 "abnormal_id": 0,
279 "dangerzone": [0, 0, 0, 0, 0, 0, 0, 0],
280 "track_id": track_id,
281 "ismodify": 0,
282 }
283 return tmp_annotation
284

◆ make_image_base_path()

utils_data.make_image_base_path ( json_version,
anno_path )
데이터셋이 저장된 기본 경로를 생성하는 기능
ver 11
    json 파일 저장 경로 : base_path/annotation/P/C/json_name
    이미지 파일 저장 경로 : base_path/images/P/C/A/R/img_name
args:
    json_version (int): json 파일 버전
    anno_path (str): json 파일 경로
return:
    base_path : 데이터(json, 이미지)가 저장된 폴더
    image_base_path : 이미지가 저장된 기본 경로(base_path/images)

Definition at line 85 of file utils_data.py.

85def make_image_base_path(json_version, anno_path):
86 """
87 데이터셋이 저장된 기본 경로를 생성하는 기능
88 ver 11
89 json 파일 저장 경로 : base_path/annotation/P/C/json_name
90 이미지 파일 저장 경로 : base_path/images/P/C/A/R/img_name
91 args:
92 json_version (int): json 파일 버전
93 anno_path (str): json 파일 경로
94 return:
95 base_path : 데이터(json, 이미지)가 저장된 폴더
96 image_base_path : 이미지가 저장된 기본 경로(base_path/images)
97 """
98 split_dataset = anno_path.split("/")
99 json_file_name = split_dataset[-1]
100 if json_version == 10:
101 base_path_list = split_dataset[:-3]
102 image_base_path_list = copy.deepcopy(base_path_list)
103 elif json_version == 11:
104 base_path_list = split_dataset[:-4]
105 image_base_path_list = copy.deepcopy(base_path_list)
106 image_base_path_list.append('images')
107
108 path_format = PATH_FORMAT[json_version]
109 for pf in path_format:
110 filename_re = re.compile(pf)
111 str_format = filename_re.search(json_file_name).group()
112 image_base_path_list.append(str_format)
113
114 if platform.system().lower() == 'windows':
115 image_base_path = "/".join(image_base_path_list)
116 base_path = "/".join(base_path_list)
117 else:
118 image_base_path = os.path.join("/", *image_base_path_list)
119 base_path = os.path.join("/", *base_path_list)
120
121 return base_path, image_base_path
122

◆ make_image_folder()

utils_data.make_image_folder ( json_version,
anno_path )
어노테이션 파일에 대응하는 이미지가 저장된 경로를 생성하는 기능
image_base_path 뒤에 붙는 폴더
args:
    json_version (int): json 파일 버전
    anno_path (str): json 파일 경로
return:
    image_folder_path : 이미지가 저장된 폴더

Definition at line 123 of file utils_data.py.

123def make_image_folder(json_version, anno_path):
124 """
125 어노테이션 파일에 대응하는 이미지가 저장된 경로를 생성하는 기능
126 image_base_path 뒤에 붙는 폴더
127 args:
128 json_version (int): json 파일 버전
129 anno_path (str): json 파일 경로
130 return:
131 image_folder_path : 이미지가 저장된 폴더
132 """
133 split_dataset = anno_path.split("/")
134 json_file_name = split_dataset[-1]
135
136 image_folder_path_list = []
137 path_format = PATH_FORMAT[json_version]
138 for pf in path_format:
139 filename_re = re.compile(pf)
140 str_format = filename_re.search(json_file_name).group()
141 image_folder_path_list.append(str_format)
142
143 if platform.system().lower() == 'windows':
144 image_folder_path = "/".join(image_folder_path_list)
145 else:
146 image_folder_path = os.path.join(*image_folder_path_list)
147
148 return image_folder_path
149
150

◆ make_pkl_info()

utils_data.make_pkl_info ( pkl_name_list,
pkl_path_list,
key = 'label' )
피클 파일의 정보를 생성, 입력한 키의 원소별 파일 수량과 피클 파일에 포함된 키의 원소를 생성하는 기능
args:
    pkl_name_list (list[str]): 피클 데이터 파일의 이름 리스트
    pkl_path_list (list[str]): 피클 데이터 파일 경로 리스트

Definition at line 129 of file utils_data.py.

129def make_pkl_info(pkl_name_list, pkl_path_list, key='label'):
130 """
131 피클 파일의 정보를 생성, 입력한 키의 원소별 파일 수량과 피클 파일에 포함된 키의 원소를 생성하는 기능
132 args:
133 pkl_name_list (list[str]): 피클 데이터 파일의 이름 리스트
134 pkl_path_list (list[str]): 피클 데이터 파일 경로 리스트
135 """
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] = [] #파일에 포함된 키 데이터 초기화
141
142 #정보 생성
143 for pkl in pkl_list:
144 item = pkl[key] #키의 원소
145
146 #원소별 파일 초기화
147 if item not in data_info_dict:
148 data_info_dict[item] = []
149
150 #파일에 포함된 원소 추가
151 if item not in file_info_dict[name]:
152 file_info_dict[name].append(item)
153
154 #원소별 파일 추가
155 if name not in data_info_dict[item]:
156 data_info_dict[item].append(name)
157
158 #정렬
159 data_info_dict = dict(sorted(data_info_dict.items()))
160 return data_info_dict, file_info_dict
161
162
163# def select_items(pkl_folder, ratio=0.2):
164# #하나에 클립에 여러개의 라벨이 있을 수 있음
165# #최소한의 클립으로 여러 라벨이 골고루 커버가능하도록 함
166# pkl_name_list, pkl_path_list = search_file(pkl_folder, '.pkl')
167# label_info, file_info = make_pkl_info(pkl_name_list, pkl_path_list)
168
169# # 클립 수로 오름차순으로 정렬
170# sorted_data = copy.deepcopy(dict(sorted(label_info.items(), key=lambda item: len(item[1]))))
171# item_dict = {}
172# select_item_list = []
173# for key in label_info.keys():
174# item_dict[key] = []
175
176# while True:
177# #클립 수가 가장 적은 라벨 선택
178# label = list(sorted_data.keys())[0]
179# clip_list = sorted_data[label]
180
181# #선택할 클립의 수 결정
182# sample_size = max(1, int(len(clip_list)*ratio)) # 선택해야하는 클립 수
183# sample_size = max(0, sample_size - len(item_dict[label])) # 선택해야하는 클립 수에 이미 선택된 클립수를 뺌
184
185# #클립 선택
186# selected_clip = random.sample(clip_list, sample_size)
187# select_item_list.extend(selected_clip)
188# for clip in selected_clip:
189# l_list = file_info[clip]
190# for l in l_list:
191# item_dict[l].append(clip)
192
193# #선택된 클립 제거
194# for key, value_list in sorted_data.items():
195# sorted_data[key] = [val for val in value_list if val not in selected_clip]
196
197# del sorted_data[label]
198
199# if not sorted_data:
200# break
201
202# # 클립 수로 오름차순으로 정렬
203# sorted_data = dict(sorted(sorted_data.items(), key=lambda item: len(item[1])))
204
205# remain_item_list = remove_items(pkl_name_list, select_item_list)
206
207# return select_item_list, remain_item_list
208
209

◆ print_data_num_per_class()

utils_data.print_data_num_per_class ( data_list,
labelmap )
클래스별 데이터 수량을 출력하는 기능
args:
    data_list (list[dict]): 데이터 리스트, 데이터에는 클래스 정보를 담고있는 'label'을 포함하고 있어야함
    labelmap (dict): 클래스 정보를 담고있는 변수, key는 클래스 번호이고 value는 클래스 이름임

Definition at line 52 of file utils_data.py.

52def print_data_num_per_class(data_list, labelmap):
53 """
54 클래스별 데이터 수량을 출력하는 기능
55 args:
56 data_list (list[dict]): 데이터 리스트, 데이터에는 클래스 정보를 담고있는 'label'을 포함하고 있어야함
57 labelmap (dict): 클래스 정보를 담고있는 변수, key는 클래스 번호이고 value는 클래스 이름임
58 """
59 if isinstance(data_list, str):
60 with open(data_list, 'rb') as f:
61 data_list = pickle.load(f)
62
63 bins_data = dict()
64 for i in range(len(labelmap.keys())):
65 bins_data[i] = 0
66
67 for data in data_list:
68 bins_data[data['label']] += 1
69
70 for label, cnt in bins_data.items():
71 print(f"{labelmap[label]} : {cnt}")
72
73

◆ remove_items()

utils_data.remove_items ( original_list,
remove_items )
리스트에서 특정 원소를 제거하는 기능
args:
    original_list (list): 입력 데이터
    remove_items (list): 제거하려는 원소
return (list): 특정 원소가 제거된 리스트

Definition at line 119 of file utils_data.py.

119def remove_items(original_list, remove_items):
120 """
121 리스트에서 특정 원소를 제거하는 기능
122 args:
123 original_list (list): 입력 데이터
124 remove_items (list): 제거하려는 원소
125 return (list): 특정 원소가 제거된 리스트
126 """
127 return [item for item in original_list if item not in remove_items]
128

◆ save_json()

utils_data.save_json ( path,
dataset )
어노테이션 데이터를 저장하는 기능
args:
    path (str): 저장 경로
    dataset (dict): 저장하는 데이터

Definition at line 173 of file utils_data.py.

173def save_json(path, dataset):
174 """
175 어노테이션 데이터를 저장하는 기능
176 args:
177 path (str): 저장 경로
178 dataset (dict): 저장하는 데이터
179 """
180 try:
181 with open(path, "w") as json_file:
182 json.dump(dataset, json_file)
183 except Exception as e:
184 print(e)
185

◆ save_pkl_data()

utils_data.save_pkl_data ( pkl_data,
save_path )
pkl 데이터를 저장하는 기능
args:
    pkl_data : 저장할 데이터
    save_path (str): pkl 데이터를 저장할 경로

Definition at line 22 of file utils_data.py.

22def save_pkl_data(pkl_data, save_path):
23 """
24 pkl 데이터를 저장하는 기능
25 args:
26 pkl_data : 저장할 데이터
27 save_path (str): pkl 데이터를 저장할 경로
28 """
29 with open(save_path, 'wb') as f:
30 pickle.dump(pkl_data, f)
31

◆ search_json_by_path_format()

utils_data.search_json_by_path_format ( folder,
data_root = None )

Definition at line 324 of file utils_data.py.

324def search_json_by_path_format(folder, data_root = None):
325 if data_root is None:
326 data_root = folder
327
328 fileEx = '.json'
329
330 json_list = []
331 for path, dirs, files in os.walk(folder):
332 if path.split('/')[-1].startswith('.'):
333 continue
334 json_list.extend([ file for file in files if file.endswith(fileEx)])
335
336 json_list.sort()
337
338 json_path = []
339 for file in json_list:
340 json_path.append(join( [data_root, make_dataset_folder_path(file), file] ))
341
342 return json_list, json_path

◆ split_train_and_val()

utils_data.split_train_and_val ( datas,
class_num,
max_train_data_num,
max_val_data_num )
데이터를 훈련용과 평가용으로 분리하는 기능
args:
    datas (list[dict]): 데이터 리스트
    class_num (int): 총 클래스 수
    max_train_data_num (int): 훈련 데이터셋 최대 수량
    max_val_data_num (int): 평가 데이터셋 최대 수량
return:
    train_list (list[dict]): 훈련용 데이터셋
    val_list (list[dict]): 평가용 데이터셋

Definition at line 74 of file utils_data.py.

74def split_train_and_val(datas, class_num, max_train_data_num, max_val_data_num):
75 """
76 데이터를 훈련용과 평가용으로 분리하는 기능
77 args:
78 datas (list[dict]): 데이터 리스트
79 class_num (int): 총 클래스 수
80 max_train_data_num (int): 훈련 데이터셋 최대 수량
81 max_val_data_num (int): 평가 데이터셋 최대 수량
82 return:
83 train_list (list[dict]): 훈련용 데이터셋
84 val_list (list[dict]): 평가용 데이터셋
85 """
86
87 #클래스별 데이터 분리
88 data_dict = dict()
89 for i in range(class_num):
90 data_dict[i] = [] #초기화
91
92 #분리
93 for data in datas:
94 data_dict[data['label']].append(data)
95
96 #훈련 및 평가용 데이터 분리
97 train_list = []
98 val_list = []
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: #데이터 수량이 부족할 경우, 95%를 학습용으로 사용
103 train_data_num = int(data_num * 0.95)
104
105 #평가용 데이터 끝 인덱스
106 val_data_idx = min(data_num, train_data_num+max_val_data_num)
107
108 #분리
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])) #평가용 데이터
112
113 #섞기
114 random.shuffle(train_list)
115 random.shuffle(val_list)
116
117 return train_list, val_list
118

◆ split_train_and_val_v22()

utils_data.split_train_and_val_v22 ( data_folder,
save_folder,
category_info,
total_data_num = 100,
ratio = 0.8 )
세이프모션의 2.2 버전 행동 데이터를 훈련용과 평가용으로 분리하는 기능
args:
    data_folder (str): 데이터가 저장된 폴더
    save_folder (str): 학습 및 훈련용 데이터를 저장할 폴더
    category_info (dict): 학습 데이터의 카테고리별 클래스 수
    total_data_num (int): 클래스별 총 데이터 수(학습+평가 데이터 수)
    ratio (float): 학습용 데이터의 비율

Definition at line 210 of file utils_data.py.

210def split_train_and_val_v22(data_folder, save_folder, category_info, total_data_num=100, ratio=0.8):
211 """
212 세이프모션의 2.2 버전 행동 데이터를 훈련용과 평가용으로 분리하는 기능
213 args:
214 data_folder (str): 데이터가 저장된 폴더
215 save_folder (str): 학습 및 훈련용 데이터를 저장할 폴더
216 category_info (dict): 학습 데이터의 카테고리별 클래스 수
217 total_data_num (int): 클래스별 총 데이터 수(학습+평가 데이터 수)
218 ratio (float): 학습용 데이터의 비율
219 """
220 #변수 초기화 및 저장 폴더 생성
221 split_datas = dict() #클래스별 데이터 분리용 변수
222 for category, num in category_info.items():
223 split_datas[category] = dict()
224 for label in range(num):
225 #클래스별 데이터 분리용 변수 초기화
226 split_datas[category][label] = dict()
227 split_datas[category][label]['train'] = []
228 split_datas[category][label]['val'] = []
229
230 #저장 폴더 생성
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)
235
236 #데이터 분리
237 for category, num in category_info.items():#카테고리별 클래스 수량
238 for label in range(num): #클래스 번호
239
240 folder = os.path.join(data_folder, category, f'{label:02d}') #클래스 관련 데이터 폴더
241 name_list, path_list = search_file(folder, '.pkl') #폴더 내 데이터 목록
242
243 data_num = min(len(path_list), total_data_num) #총 데이터수
244 train_num = int( data_num * ratio ) #학습용 데이터 수 설정
245
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] #평가용 데이터
249
250 #데이터 저장
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)
259