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

Functions

 make_dummy_list (anno, num)
 
 check_invaild (anno_list, ratio)
 
 merge_pkl (folder, file_path_list=None)
 
 run_merge_pkl (args)
 
 check_label_v22 (anno_list, category, target_label, ratio=0.3)
 
 make_label_v22 (anno_list, category, category_margin_ratio)
 
 make_image_feat_data (anno_list, img_feats)
 
 gen_pkl_data_v22 (anno_list, train_category, category, target_label, category_margin_ratio, h, w, image_folder, img_feats=None)
 
 make_action_pkl_file_v22 (data_manager, train_category, category, target_label, category_margin_ratio, k, img_feat_dict=None)
 
 run_generate_pkl_data_from_json_v22 (args)
 

Function Documentation

◆ check_invaild()

generate_pkl_data_mtml.check_invaild ( anno_list,
ratio )
데이터의 유효성 확인 기능
args:
    anno_list (list[dict]): 확인하려는 데이터
        valid : 유효성 파라미터, 1 or 0, 1이면 유효한 데이터, 0이면 유효하지 않는 데이터
    ratio (float): 유효하지 않는 데이터 비율, 해당 비율보다 작으면 유효성 확인을 통과하지 못함
return (bool): 유효성 확인 결과, 유효성 확인을 통과하지 못하면 True, 통과하면 False

Definition at line 38 of file generate_pkl_data_mtml.py.

38def check_invaild(anno_list, ratio):
39 """
40 데이터의 유효성 확인 기능
41 args:
42 anno_list (list[dict]): 확인하려는 데이터
43 valid : 유효성 파라미터, 1 or 0, 1이면 유효한 데이터, 0이면 유효하지 않는 데이터
44 ratio (float): 유효하지 않는 데이터 비율, 해당 비율보다 작으면 유효성 확인을 통과하지 못함
45 return (bool): 유효성 확인 결과, 유효성 확인을 통과하지 못하면 True, 통과하면 False
46 """
47 sum_valid = 0
48 for anno in anno_list:
49 sum_valid += anno['valid']
50
51 return sum_valid < len(anno_list)*ratio
52
53

◆ check_label_v22()

generate_pkl_data_mtml.check_label_v22 ( anno_list,
category,
target_label,
ratio = 0.3 )
데이터에 특정 카테고리의 특정 클래스가 존재하는지 확인하는 기능
args:
    anno_list (list[dict]): 데이터
        필수 데이터 : action_id에 라벨 이름(category)에 대한 키가 존재 해야함, 해당 키에 해당 프레임에서의 클래스 정보가 입력되어 있어야함         
    category (str): 데이터에서 확인하려는 카테고리
    target_label (int): 데이터에서 확인하려는 클래스
    ratio (float): 라벨 확인을 위한 데이터의 시작 위치(%), 클래스를 확인하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
    
return (bool): 원하는 클래스 존재 유무

Definition at line 86 of file generate_pkl_data_mtml.py.

86def check_label_v22(anno_list, category, target_label, ratio=0.3):
87 """
88 데이터에 특정 카테고리의 특정 클래스가 존재하는지 확인하는 기능
89 args:
90 anno_list (list[dict]): 데이터
91 필수 데이터 : action_id에 라벨 이름(category)에 대한 키가 존재 해야함, 해당 키에 해당 프레임에서의 클래스 정보가 입력되어 있어야함
92 category (str): 데이터에서 확인하려는 카테고리
93 target_label (int): 데이터에서 확인하려는 클래스
94 ratio (float): 라벨 확인을 위한 데이터의 시작 위치(%), 클래스를 확인하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
95
96 return (bool): 원하는 클래스 존재 유무
97 """
98
99 #확인 구간 설정
100 l = len(anno_list)
101 start_idx = int(l*ratio)
102 end_idx = l-start_idx
103 label_list = []
104
105 #확인 구간의 클래스 라벨 리스트 생성, 빈도수를 확인하고
106 for i in range(start_idx, end_idx):
107 anno = anno_list[i]
108
109 #유효성 체크, 0 이하로 클래스가 저장되어 있으면 해당 프레임은 사용하지 않는 다는 의미임
110 if anno['action_id'][category] < 0:
111 continue
112
113 #유효성 체크, valid가 0이면 더미데이터를 의미함
114 if anno['valid'] == 0:
115 continue
116
117 label_list.append(anno['action_id'][category])
118
119 return target_label in label_list
120
121 # values, counts = np.unique(np.array(label_list), return_counts=True)
122 # if target_label not in list(values):
123 # return False
124 # return True
125

◆ gen_pkl_data_v22()

generate_pkl_data_mtml.gen_pkl_data_v22 ( anno_list,
train_category,
category,
target_label,
category_margin_ratio,
h,
w,
image_folder,
img_feats = None )
학습을 위한 데이터 1개를 생성하는 기능
학습 카테고리별로 학습 클래스를 설정함
category(메인 카테고리)의 클래스는 데이터의 중심 40% 구간에 target_label이 존재하면 target_label로 설정됨, target_label이 존재하지 않는다면 데이터는 생성하지 않음

args:
    anno_list (list[dict]): 어노테이션 데이터 리스트
    train_category (list[str]): 학습 카테고리 리스트
    category (str): 학습 데이터의 메인 카테고리
    target_label (int): 메인 카테고리에 해당하는 타겟 클래스, target_label 정보가 존재해야 학습 데이터를 생성함
    category_margin_ratio (dict): 카테고리별 클래스 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
    h (int): 원본 영상의 높이
    w (int): 원본 영상의 너비
    image_folder (str): 영상 폴더
    img_feats (dict): 이미지 아이디에 대응하는 이미지 특징, 이미지 특징은 Tenosr 타입이고 shpae은 (C,)임, 파라미터를 설정하지 않으면 이미지 특징은 학습데이터에 포함하지 않음
return (dict): 학습데이터
    keypoint (np.array): 스켈레톤 좌표
    keypoint_score (np.array): 스켈레톤 스코어
    frame_dir (str): 영상 폴더
    img_shape (tuple): 원본 영상의 크기
    original_shape (tuple): 원본 영상의 크기
    total_frames (int): 데이터의 프레임 수
    category (str): 샘플의 메인 카테고리
    gt_{category_key} (int): 카테고리별 클래스
    image_feature (Tensor): 이미지 특징, shape (T, C, 1)

Definition at line 215 of file generate_pkl_data_mtml.py.

215def gen_pkl_data_v22(anno_list, train_category, category, target_label, category_margin_ratio, h, w, image_folder, img_feats=None):
216 """
217 학습을 위한 데이터 1개를 생성하는 기능
218 학습 카테고리별로 학습 클래스를 설정함
219 category(메인 카테고리)의 클래스는 데이터의 중심 40% 구간에 target_label이 존재하면 target_label로 설정됨, target_label이 존재하지 않는다면 데이터는 생성하지 않음
220
221 args:
222 anno_list (list[dict]): 어노테이션 데이터 리스트
223 train_category (list[str]): 학습 카테고리 리스트
224 category (str): 학습 데이터의 메인 카테고리
225 target_label (int): 메인 카테고리에 해당하는 타겟 클래스, target_label 정보가 존재해야 학습 데이터를 생성함
226 category_margin_ratio (dict): 카테고리별 클래스 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
227 h (int): 원본 영상의 높이
228 w (int): 원본 영상의 너비
229 image_folder (str): 영상 폴더
230 img_feats (dict): 이미지 아이디에 대응하는 이미지 특징, 이미지 특징은 Tenosr 타입이고 shpae은 (C,)임, 파라미터를 설정하지 않으면 이미지 특징은 학습데이터에 포함하지 않음
231 return (dict): 학습데이터
232 keypoint (np.array): 스켈레톤 좌표
233 keypoint_score (np.array): 스켈레톤 스코어
234 frame_dir (str): 영상 폴더
235 img_shape (tuple): 원본 영상의 크기
236 original_shape (tuple): 원본 영상의 크기
237 total_frames (int): 데이터의 프레임 수
238 category (str): 샘플의 메인 카테고리
239 gt_{category_key} (int): 카테고리별 클래스
240 image_feature (Tensor): 이미지 특징, shape (T, C, 1)
241 """
242
243 #유효성 체크
244 if check_invaild(anno_list, 0.5):
245 return None
246
247
248 label = dict()
249 #메인 카테고리의 클래스 설정
250 if check_label_v22(anno_list, category, target_label, 0.3):
251 label['gt_'+category] = target_label
252 else:
253 return None
254
255 #메인 카테고리를 제외한 나머지 카테고리의 클래스 설정
256 non_target_category = remove_items(train_category, [category]) #메인 카테고리를 제외한 나머지 카테고리
257 label.update(make_label_v22(anno_list, non_target_category, category_margin_ratio))
258
259 #학습 데이터 생성
260 pkl_data = dict()
261
262 kps = []
263 for anno in anno_list:
264 kps.append(anno['keypoints'])
265
266 kps = np.array([kps])
267 pkl_data['keypoint'] = kps[..., :2]
268 pkl_data['keypoint_score'] = kps[..., 2]
269 pkl_data['frame_dir'] = image_folder
270 pkl_data['img_shape'] = (h, w)
271 pkl_data['original_shape'] = (h, w)
272 pkl_data['total_frames'] = kps.shape[1]
273 pkl_data['category'] = category
274 pkl_data.update(label)
275
276 #이미지 특징 설정
277 if img_feats is not None:
278 pkl_data['image_feature'] = make_image_feat_data(anno_list, img_feats)
279
280 return pkl_data
281

◆ make_action_pkl_file_v22()

generate_pkl_data_mtml.make_action_pkl_file_v22 ( data_manager,
train_category,
category,
target_label,
category_margin_ratio,
k,
img_feat_dict = None )
하나의 클립에서 학습 데이터를 생성하는 기능
학습 카테고리별로 학습 클래스를 설정함
args:
    data_manager: AnnotationDataManager 객체, 어노테이션 데이터파일로 초기화까지 진행
    train_category (list[str]): 학습 카테고리 리스트
    category (str): 학습 데이터의 메인 카테고리
    target_label (int): 메인 카테고리에 해당하는 타겟 클래스, target_label 정보가 존재해야 학습 데이터를 생성함
    category_margin_ratio (dict): 카테고리별 클래스 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
    k (int): 하나의 데이터를 만드는데 사용하는 프레임 숫자
    img_feat_dict (dict): 추적 아이디의 이미지 특징 데이터, 이미지 특징 데이터는 dict 구조로 이미지 아이디별 각 프레임에서의 이미지 특징을 담고 있음.
return (dict): 하나의 클립에 대한 학습 데이터 리스트, 학습 데이터는 추적 아이디별로 저장됨, 추적 아이디의 학습 데이터는 list[dict]의 구조임

Definition at line 282 of file generate_pkl_data_mtml.py.

282def make_action_pkl_file_v22(data_manager, train_category, category, target_label, category_margin_ratio, k, img_feat_dict=None):
283 """
284 하나의 클립에서 학습 데이터를 생성하는 기능
285 학습 카테고리별로 학습 클래스를 설정함
286 args:
287 data_manager: AnnotationDataManager 객체, 어노테이션 데이터파일로 초기화까지 진행
288 train_category (list[str]): 학습 카테고리 리스트
289 category (str): 학습 데이터의 메인 카테고리
290 target_label (int): 메인 카테고리에 해당하는 타겟 클래스, target_label 정보가 존재해야 학습 데이터를 생성함
291 category_margin_ratio (dict): 카테고리별 클래스 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
292 k (int): 하나의 데이터를 만드는데 사용하는 프레임 숫자
293 img_feat_dict (dict): 추적 아이디의 이미지 특징 데이터, 이미지 특징 데이터는 dict 구조로 이미지 아이디별 각 프레임에서의 이미지 특징을 담고 있음.
294 return (dict): 하나의 클립에 대한 학습 데이터 리스트, 학습 데이터는 추적 아이디별로 저장됨, 추적 아이디의 학습 데이터는 list[dict]의 구조임
295 """
296
297
298
299 #이미지 크기 및 폴더 셋팅
300 # h, w = data_manager.read_image().shape[:2]
301 h = 1080
302 w = 1920
303 image_folder = data_manager.get_image_folder()
304
305 #클립의 시작, 끝 프레임 설정
306 start_frame = data_manager.dataset['info']['start']
307 end_frame = data_manager.dataset['info']['end']
308
309 #추적 아이디를 기준으로 데이터 형태 변환
310 track_data = data_manager.get_track_anno_data(filter=True, start_frame=start_frame, end_frame=end_frame+1)
311
312 #학습 데이터 생성, 추적 아이디별로 생성함
313 pkl_datas = {}
314 for track_id, anno_list in track_data.items():
315
316 #이미지 특징이 있을경우 셋팅함
317 img_feats = None
318 if img_feat_dict is not None:
319 img_feats = img_feat_dict[track_id]
320
321 frame_no = len(anno_list)
322
323 image_idx_1st = data_manager.image_ids.index(anno_list[0]['image_id']) #시작 프레임
324 image_idx_end = data_manager.image_ids.index(anno_list[-1]['image_id']) #끝 프레임
325
326 #유효성 체크, 데이터의 길이가 설정한 학습데이터의 길이보다 작을 경우 사용하지 않음
327 interval = image_idx_end - image_idx_1st
328 if interval < k:
329 continue
330
331 #학습 클래스 변환, 라벨링된 데이터를 학습을 위한 데이터로 변환
332 simple_anno_list = cvt_labelmap_v22(anno_list)
333
334 #유효성 셋팅
335 for i in range(0, frame_no):
336 simple_anno_list[i]['valid'] = 1
337
338 #추적 아이디의 데이터를 저장할 리스트 생성
339 pkl_datas[track_id] = []
340
341 #pkl data 생성
342 anno_q = [simple_anno_list[0]]
343 for i in range(1, frame_no):
344
345 #인접한 데이터의 프레임 확인
346 image_idx_end = data_manager.image_ids.index(simple_anno_list[i]['image_id'])
347 image_idx_end_m1 = data_manager.image_ids.index(anno_q[-1]['image_id'])
348
349 #인접한 데이터의 프레임 간격에 따라서 데이터 처리
350 interval = image_idx_end - image_idx_end_m1
351 if interval > k: #k보다 클경우 다른 클립으로 분리함
352 anno_q = []
353 elif interval > 1: #k보다 작고 1보다 클경우 더미 데이터를 넣어줌
354 anno_q.extend(make_dummy_list(anno_q[-1], interval-1))
355
356 #큐에 데이터를 붙여줌
357 anno_q.append(simple_anno_list[i])
358
359 #큐의 데이터가 k개 이상인 경우만 학습 데이터 생성 프로세스를 진행함
360 frame_num = len(anno_q)
361 if frame_num < k:
362 continue
363
364 #학습 데이터 생성
365 pkl_data = gen_pkl_data_v22(anno_q[frame_num-k:], train_category, category, target_label, category_margin_ratio, h, w, image_folder, img_feats=img_feats)
366
367 #학습 데이터가 생성되지 않았을 경우
368 if pkl_data is None:
369 continue
370
371 #추적 아이디의 키에 피클 데이터 저장
372 pkl_datas[track_id].append(pkl_data)
373
374 #추적 아이디의 학습 데이터가 없을 경우 키 제거
375 if len(pkl_datas[track_id]) == 0:
376 del pkl_datas[track_id]
377
378 return pkl_datas
379
380

◆ make_dummy_list()

generate_pkl_data_mtml.make_dummy_list ( anno,
num )
어노테이션 데이터를 복제해서 더미데이터 리스트를 생성하는 기능
args:
    anno (dict): 복재하기 위한 어노테이션 데이터
    num (int): 복제 수량
return (list[dict]): 더미데이터 리스트

Definition at line 14 of file generate_pkl_data_mtml.py.

14def make_dummy_list(anno, num):
15 """
16 어노테이션 데이터를 복제해서 더미데이터 리스트를 생성하는 기능
17 args:
18 anno (dict): 복재하기 위한 어노테이션 데이터
19 num (int): 복제 수량
20 return (list[dict]): 더미데이터 리스트
21 """
22
23 #복사
24 tmp_anno = copy.deepcopy(anno)
25
26 #복사한 데이터의 키포인트 스코어를 0으로 셋팅함
27 for i in range(len(tmp_anno['keypoints'])):
28 tmp_anno['keypoints'][i][-1] = 0
29
30 #유효성 셋팅
31 tmp_anno['valid'] = 0
32
33 dummy_list = []
34 for i in range(num):
35 dummy_list.append(copy.deepcopy(tmp_anno))
36 return dummy_list
37

◆ make_image_feat_data()

generate_pkl_data_mtml.make_image_feat_data ( anno_list,
img_feats )
학습을 위한 이미지 특징을 생성하는 기능
args:
    anno_list (list[dict]): 어노테이션 데이터 리스트, 각 항목은 'image_id'와 'valid' 키를 포함하고 있어야함
    img_feats (dict): 이미지 아이디에 대응하는 이미지 특징, 이미지 특징은 Tenosr 타입이고 shpae은 (C,)임
return (Tensor): 데이터에 대한 이미지 특징, shape (T, C, 1)

Definition at line 179 of file generate_pkl_data_mtml.py.

179def make_image_feat_data(anno_list, img_feats):
180 """
181 학습을 위한 이미지 특징을 생성하는 기능
182 args:
183 anno_list (list[dict]): 어노테이션 데이터 리스트, 각 항목은 'image_id'와 'valid' 키를 포함하고 있어야함
184 img_feats (dict): 이미지 아이디에 대응하는 이미지 특징, 이미지 특징은 Tenosr 타입이고 shpae은 (C,)임
185 return (Tensor): 데이터에 대한 이미지 특징, shape (T, C, 1)
186 """
187
188 #이미지 특징 크기를 미리 셋팅해둠
189 feat_size = 0 #이미지 특징 크기
190 for anno in anno_list:
191 image_id = anno['image_id'] #이미지 아이디
192
193 #유효성 체크
194 if anno['valid'] == 0:
195 continue
196
197 #이미지 특징 크기 확인
198 feat_size = img_feats[image_id].shape[0]
199 break
200
201 #여러 프레임의 이미지 특징을 하나의 변수로 만듦
202 img_feat_list = [] #이미지 특징을 저장할 리스트
203 for anno in anno_list:
204 image_id = anno['image_id'] #이미지 아이디
205
206 #유효성 체크
207 if anno['valid'] == 0:
208 img_feat_list.append(torch.zeros(feat_size)) #0값으로 설정함
209 else:
210 img_feat_list.append(img_feats[image_id]) #이미지 특징 저장
211
212 #여러프레임의 이미지 특징을 반환
213 return torch.stack(img_feat_list, dim=1).unsqueeze(-1)
214

◆ make_label_v22()

generate_pkl_data_mtml.make_label_v22 ( anno_list,
category,
category_margin_ratio )
데이터의 클래스를 결정하는 기능
args:
    anno_list (list[dict]): 어노테이션 데이터 리스트, 각 항목은 'action_id'키를 포함해야 하며, 이키는 해당 프레임의 클래스 정보를 담고 있는 category(리스트) 키들을 포함해야 함
    category (list): 생성하려는 학습 데이터의 카테고리 리스트
    category_margin_ratio (dict): 카테고리별 라벨 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
return (dict): 카테고리별 데이터의 클래스, 유효성 검사나 클래스 확인이 어려운 경우 None을 반환함

Definition at line 126 of file generate_pkl_data_mtml.py.

126def make_label_v22(anno_list, category, category_margin_ratio):
127 """
128 데이터의 클래스를 결정하는 기능
129 args:
130 anno_list (list[dict]): 어노테이션 데이터 리스트, 각 항목은 'action_id'키를 포함해야 하며, 이키는 해당 프레임의 클래스 정보를 담고 있는 category(리스트) 키들을 포함해야 함
131 category (list): 생성하려는 학습 데이터의 카테고리 리스트
132 category_margin_ratio (dict): 카테고리별 라벨 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
133 return (dict): 카테고리별 데이터의 클래스, 유효성 검사나 클래스 확인이 어려운 경우 None을 반환함
134 """
135
136 l = len(anno_list) #데이터 전체 길이
137
138 #카테고리별 클래스를 저장할 변수 초기화
139 label_dict = dict()
140 for cat in category:
141 label_dict[cat] = []
142
143 #설정구간에 대한 클래스 리스트를 생성함, 빈도수 확인을 위함
144 for cat in category:
145 ratio = category_margin_ratio[cat] #
146 start_idx = int(l*ratio) #클래스를 결정할 구간의 시작 위치
147 end_idx = l-start_idx #클래스를 결정할 구간의 끝 위치
148
149 for i in range(start_idx, end_idx):
150 anno = anno_list[i]
151
152 #유효성 확인, 0보다 작으면 해당 정보는 사용하지 않는다는 의미임
153 if anno['action_id'][cat] < 0:
154 continue
155
156 #유효성 확인, valid가 0이면 복사한 데이터라는 의미임
157 if anno['valid'] == 0:
158 continue
159
160 label_dict[cat].append(anno['action_id'][cat])
161
162 #카테고리별 데이터 생성
163 ret_label = dict()
164 for cat in category:
165 #유효성 체크, 클래스 리스트에 데이터가 들어있지 않으면 -1 설정
166 if len(label_dict[cat]) == 0:
167 ret_label['gt_'+cat] = -1
168 continue
169
170 #빈도수 확인
171 values, counts = np.unique(np.array(label_dict[cat]), return_counts=True)
172 max_count = np.max(counts) #최대 빈도수
173 labels = values[counts == max_count] #최대 빈도수 클래스
174 labels = labels.tolist()
175 ret_label['gt_'+cat] = labels[0]
176
177 return ret_label
178

◆ merge_pkl()

generate_pkl_data_mtml.merge_pkl ( folder,
file_path_list = None )
학습데이터 파일들을 하나로 합치는 기능
args:
    folder (str): 학습데이터가 저장된 폴더
    file_path_list (list[str]) : 학습데이터 경로 리스트, 설정하지 않으면 folder에서 찾음
return (list[dict]): 합쳐진 학습 데이터

Definition at line 54 of file generate_pkl_data_mtml.py.

54def merge_pkl(folder, file_path_list=None ):
55 """
56 학습데이터 파일들을 하나로 합치는 기능
57 args:
58 folder (str): 학습데이터가 저장된 폴더
59 file_path_list (list[str]) : 학습데이터 경로 리스트, 설정하지 않으면 folder에서 찾음
60 return (list[dict]): 합쳐진 학습 데이터
61 """
62
63 if file_path_list == None:
64 file_name_list, file_path_list = search_file(folder, fileEx='.pkl')
65
66 merged_pkl_datas = []
67 for path in file_path_list:
68 with open(path, 'rb') as f:
69 pkl_data = pickle.load(f)
70 merged_pkl_datas += pkl_data
71 print(f"{path} : {len(pkl_data)}")
72
73 return merged_pkl_datas
74

◆ run_generate_pkl_data_from_json_v22()

generate_pkl_data_mtml.run_generate_pkl_data_from_json_v22 ( args)
클립 정보를 담고있는 어노테이션 파일들을 사용해서 학습데이터를 만드는 기능
args:
    category_k (dict): 카테고리별 학습데이터를 생성하는 프레임 수
    train_category (list[str]): 학습 카테고리 리스트
    category_margin_ratio (dict): 카테고리별 클래스 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
    data_root (str): 클립 정보를 담고있는 어노테이션 파일들이 저장된 폴더
    pkl_root (str): 학습데이터를 저장할 폴더
    image_feat_folder (str): 이미지 특징이 저장된 폴더

Definition at line 381 of file generate_pkl_data_mtml.py.

381def run_generate_pkl_data_from_json_v22(args):
382 """
383 클립 정보를 담고있는 어노테이션 파일들을 사용해서 학습데이터를 만드는 기능
384 args:
385 category_k (dict): 카테고리별 학습데이터를 생성하는 프레임 수
386 train_category (list[str]): 학습 카테고리 리스트
387 category_margin_ratio (dict): 카테고리별 클래스 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
388 data_root (str): 클립 정보를 담고있는 어노테이션 파일들이 저장된 폴더
389 pkl_root (str): 학습데이터를 저장할 폴더
390 image_feat_folder (str): 이미지 특징이 저장된 폴더
391 """
392
393 #어노테이션 관리자 설정
394 data_manager = AnnotationDataManager()
395
396 #학습데이터 생성을 위한 카테고리별 프레임 수
397 category_k = args.category_k
398 train_category = args.train_category #학습 카테고리 리스트
399 category_margin_ratio = args.category_margin_ratio #카테고리별 클래스 설정 구간
400
401 data_root = args.data_root #클립 저장 폴다
402 for category, k in category_k.items():
403 #클립 리스트
404 dataset_folder = os.path.join(data_root, category)
405 json_name_list, json_path_list = search_file(dataset_folder, '.json')
406
407 #카테고리 별 저장 폴더 생성
408 save_folder = os.path.join(args.pkl_root, category)
409 for i, (json_path, json_name) in enumerate(zip(json_path_list, json_name_list)):
410 target_label = json_path.split('/')[-2]
411 cat_label = os.path.join(save_folder, target_label)
412 create_directory(cat_label)
413
414 file_num = len(json_name_list) #클립 수량, 콘솔 출력용
415 total_data = 0 #학습 데이터 수량, 콘솔 출력용
416 for i, (json_path, json_name) in enumerate(zip(json_path_list, json_name_list)):
417 # print(f"{category} -> [ {i+1} / {file_num} ] {json_name}")
418
419 #어노테이션 로드
420 data_manager.load_annotation(json_path)
421 data_manager.init_annotation()
422
423 #타겟 라벨 -> 메인 카테고리의 클래스
424 target_label = int(json_path.split('/')[-2])
425
426 #영상 특징 사용 여부
427 if args.image_feat_folder is not None:
428 img_feat_file = json_name[:17] + '.pkl'
429 img_feat_path = os.path.join(args.image_feat_folder, img_feat_file)
430 img_feat_dict = load_pkl_data(img_feat_path)
431
432 #피클 데이터 생성
433 pkl_datas = make_action_pkl_file_v22(data_manager, train_category, category, target_label, category_margin_ratio, k, img_feat_dict=img_feat_dict)
434
435 #학습 데이터 저장
436 for track_id, datas in pkl_datas.items():
437 pkl_name = json_name.replace('json', 'pkl')
438 save_pkl_path = os.path.join(save_folder, f'{target_label:02d}', pkl_name)
439 save_pkl_data(datas, save_pkl_path)
440 total_data += len(datas)
441 print(f"{category} -> [ {i+1} / {file_num} ] {save_pkl_path} : {len(datas):5d}/{total_data:}")

◆ run_merge_pkl()

generate_pkl_data_mtml.run_merge_pkl ( args)
학습데이터 파일들을 하나로 합치고 저장하는 기능
args:
    pkl_root (str): 학습데이터가 저장된 폴더

Definition at line 75 of file generate_pkl_data_mtml.py.

75def run_merge_pkl(args):
76 """
77 학습데이터 파일들을 하나로 합치고 저장하는 기능
78 args:
79 pkl_root (str): 학습데이터가 저장된 폴더
80 """
81 merged_pkl_datas = merge_pkl(args.pkl_root)
82 print(f"total {args.merge_pkl_path} : {len(merged_pkl_datas)}")
83 save_pkl_data(merged_pkl_datas, args.merge_pkl_path)
84
85