107def search_clip_list_v22(anno_list, image_ids, frame_num, action_train_frame=60, pose_train_frame=10):
108 """
109 어노테이션 데이터(한명에 해당하는 데이터)에서 행동별로 클립을 생성하는 기능
110 args:
111 anno_list (list[dict]): 어노테이션 데이터 리스트(한명에 대한 정보), 데이터에는 카테고리별 클래스가 설정된 'action_id'키를 포함하여야함
112 image_ids (list(int)): 어노테이션 데이터의 이미지 아이디 리스트
113 frame_num (int): 어노테이션 데이터의 총 프레임 수
114 action_train_frame (int): 행동 인식의 학습 데이터 생성에 사용되는 프레임 수
115 pose_train_frame (int): 포즈 인식의 학습 데이터 생성에 사용되는 프레임 수
116 return (dict): 카테고리별 클래스의 클립 리스트, 클립은 클립의 시작 프레임 인덱스(start), 끝 프레임 인덱스(end), 카테고리의 클래스 번호(label), 중복방지를 위한 순번(seq)을 포함하고 있음
117 """
118
119
120 cat_info = dict()
121 cat_list=['action_upper', 'action_lower', 'pose', 'hand', 'foot']
122 for cat in cat_list:
123 cat_info[cat] = dict()
124
125 cat_info['action_upper']['info'] = cvt_labelmap_v22_action_upper
126 cat_info['action_lower']['info'] = cvt_labelmap_v22_action_lower
127 cat_info['pose']['info'] = cvt_labelmap_v22_action_pose
128 cat_info['hand']['info'] = cvt_labelmap_v22_action_hand
129 cat_info['foot']['info'] = cvt_labelmap_v22_action_foot
130 cat_info['action_upper']['train_frame'] = action_train_frame
131 cat_info['action_lower']['train_frame'] = action_train_frame
132 cat_info['pose']['train_frame'] = pose_train_frame
133 cat_info['hand']['train_frame'] = pose_train_frame
134 cat_info['foot']['train_frame'] = pose_train_frame
135
136
137
138
139
140
141
142
143 label_info = search_label_list(anno_list, cat_list)
144
145
146
147
148
149
150
151
152 clip_info = dict()
153 for cat in cat_list:
154 clip_info[cat] = dict()
155 label_list = label_info[cat]
156 for label in label_list:
157 clip_info[cat][label] = [[]]
158
159
160 clip_interval = 15
161 for anno in anno_list:
162 image_idx = image_ids.index(anno['image_id'])
163
164
165 for cat in cat_list:
166 label = anno['action_id'][cat]
167
168 if len(clip_info[cat][label][-1]) == 0:
169 clip_info[cat][label][-1].append(image_idx)
170
171 if image_idx - clip_info[cat][label][-1][-1] < clip_interval:
172 clip_info[cat][label][-1].append(image_idx)
173 else:
174 clip_info[cat][label].append([image_idx])
175
176
177
178
179
180
181
182
183 clip_list = dict()
184 for cat in cat_list:
185 clip_list[cat] = dict()
186 label_list = label_info[cat]
187 for label in label_list:
188 clip_list[cat][label] = []
189
190
191 for cat, cat_clip_info in clip_info.items():
192 for label, clip_frame_list in cat_clip_info.items():
193
194
195 if label == -1 or label is None:
196 continue
197
198
199 seq = 0
200 for frame_list in clip_frame_list:
201
202
203 start, end = frame_list[0], frame_list[-1]
204
205
206 clip_len = end - start +1
207 if clip_len < cat_info[cat]['info'][label][3]:
208 continue
209
210
211 if cat_info[cat]['info'][label][4]:
212
213 margin = max( (90 - clip_len)//2, 30)
214 start = max(0, start - margin)
215 end = min(frame_num-1, max(start + 60, end + margin))
216
217
218 if (end - start +1) < cat_info[cat]['train_frame']:
219 continue
220
221
222 clip = dict(start=start, end=end, label=label, seq=seq)
223 clip_list[cat][label].append(clip)
224 seq += 1
225
226 return clip_list
227
228