32def search_clip_list_v22(anno_list, image_ids, frame_num, train_frame=60):
33 """
34 어노테이션 데이터(한명에 해당하는 데이터)에서 행동별로 클립을 생성하는 기능
35 args:
36 anno_list (list[dict]): 어노테이션 데이터 리스트(한명에 대한 정보), 데이터에는 카테고리별 클래스가 설정된 'action_id'키를 포함하여야함
37 image_ids (list(int)): 어노테이션 데이터의 이미지 아이디 리스트
38 frame_num (int): 어노테이션 데이터의 총 프레임 수
39 train_frame (int): 학습 데이터 생성에 사용되는 프레임 수
40 return (dict): 카테고리별 클래스의 클립 리스트, 클립은 클립의 시작 프레임 인덱스(start), 끝 프레임 인덱스(end), 카테고리의 클래스 번호(label), 중복방지를 위한 순번(seq)을 포함하고 있음
41 """
42
43
44 cat_info = dict()
45 cat_list=['action_upper', 'action_lower', 'pose', 'hand', 'foot']
46 for cat in cat_list:
47 cat_info[cat] = dict()
48
49 cat_info['action_upper']['info'] = cvt_labelmap_v22_action_upper
50 cat_info['action_lower']['info'] = cvt_labelmap_v22_action_lower
51 cat_info['pose']['info'] = cvt_labelmap_v22_action_pose
52 cat_info['hand']['info'] = cvt_labelmap_v22_action_hand
53 cat_info['foot']['info'] = cvt_labelmap_v22_action_foot
54
55
56
57
58
59
60
61
62 label_info = search_label_list(anno_list, cat_list)
63
64
65
66
67
68
69
70
71 clip_info = dict()
72 for cat in cat_list:
73 clip_info[cat] = dict()
74 label_list = label_info[cat]
75 for label in label_list:
76 clip_info[cat][label] = [[]]
77
78
79 clip_interval = 15
80 for anno in anno_list:
81 image_idx = image_ids.index(anno['image_id'])
82
83
84 for cat in cat_list:
85 label = anno['action_id'][cat]
86
87 if len(clip_info[cat][label][-1]) == 0:
88 clip_info[cat][label][-1].append(image_idx)
89
90 if image_idx - clip_info[cat][label][-1][-1] < clip_interval:
91 clip_info[cat][label][-1].append(image_idx)
92 else:
93 clip_info[cat][label].append([image_idx])
94
95
96
97
98
99
100
101
102 clip_list = dict()
103 for cat in cat_list:
104 clip_list[cat] = dict()
105 label_list = label_info[cat]
106 for label in label_list:
107 clip_list[cat][label] = []
108
109
110 for cat, cat_clip_info in clip_info.items():
111 for label, clip_frame_list in cat_clip_info.items():
112
113
114 if label < 0 or label is None:
115 continue
116
117
118 seq = 0
119 for frame_list in clip_frame_list:
120
121
122 start, end = frame_list[0], frame_list[-1]
123
124
125 clip_len = end - start +1
126 if clip_len < cat_info[cat]['info'][label][3]:
127 continue
128
129
130 if cat_info[cat]['info'][label][4]:
131
132 margin = max( (90 - clip_len)//2, 30)
133 start = max(0, start - margin)
134 end = min(frame_num-1, max(start + train_frame, end + margin))
135
136
137 if (end - start +1) < train_frame:
138 start = max(0, end - train_frame)
139
140 else:
141 margin = 15
142 start = max(0, start - margin)
143 end = min(frame_num-1, end + margin)
144
145
146 if (end - start +1) < train_frame:
147 continue
148
149
150 clip = dict(start=start, end=end, label=label, seq=seq)
151 clip_list[cat][label].append(clip)
152 seq += 1
153
154 return clip_list
155
156