102 from imageio
import imwrite
103 from scipy.io
import loadmat
108 print(
'Extract image data from "{}" and save as png'.format(self.
raw_mat_path))
114 def _process_images(img_refs, campid, pid, save_dir):
116 for imgid, img_ref
in enumerate(img_refs):
117 img = _deref(img_ref)
118 if img.size == 0
or img.ndim < 3:
125 viewid = 1
if imgid < 5
else 2
126 img_name =
'{:01d}_{:03d}_{:01d}_{:02d}.png'.format(campid + 1, pid + 1, viewid, imgid + 1)
127 img_path = osp.join(save_dir, img_name)
128 if not osp.isfile(img_path):
129 imwrite(img_path, img)
130 img_paths.append(img_path)
133 def _extract_img(image_type):
134 print(
'Processing {} images ...'.format(image_type))
137 for campid, camp_ref
in enumerate(mat[image_type][0]):
138 camp = _deref(camp_ref)
139 num_pids = camp.shape[0]
140 for pid
in range(num_pids):
141 img_paths = _process_images(camp[pid, :], campid, pid, imgs_dir)
142 assert len(img_paths) > 0,
'campid{}-pid{} has no images'.format(campid, pid)
143 meta_data.append((campid + 1, pid + 1, img_paths))
144 print(
'- done camera pair {} with {} identities'.format(campid + 1, num_pids))
147 meta_detected = _extract_img(
'detected')
148 meta_labeled = _extract_img(
'labeled')
150 def _extract_classic_split(meta_data, test_split):
152 num_train_pids, num_test_pids = 0, 0
153 num_train_imgs, num_test_imgs = 0, 0
154 for i, (campid, pid, img_paths)
in enumerate(meta_data):
156 if [campid, pid]
in test_split:
157 for img_path
in img_paths:
158 camid = int(osp.basename(img_path).split(
'_')[2]) - 1
159 test.append((img_path, num_test_pids, camid))
161 num_test_imgs += len(img_paths)
163 for img_path
in img_paths:
164 camid = int(osp.basename(img_path).split(
'_')[2]) - 1
165 train.append((img_path, num_train_pids, camid))
167 num_train_imgs += len(img_paths)
168 return train, num_train_pids, num_train_imgs, test, num_test_pids, num_test_imgs
170 print(
'Creating classic splits (# = 20) ...')
171 splits_classic_det, splits_classic_lab = [], []
172 for split_ref
in mat[
'testsets'][0]:
173 test_split = _deref(split_ref).tolist()
176 train, num_train_pids, num_train_imgs, test, num_test_pids, num_test_imgs = \
177 _extract_classic_split(meta_detected, test_split)
178 splits_classic_det.append({
182 'num_train_pids': num_train_pids,
183 'num_train_imgs': num_train_imgs,
184 'num_query_pids': num_test_pids,
185 'num_query_imgs': num_test_imgs,
186 'num_gallery_pids': num_test_pids,
187 'num_gallery_imgs': num_test_imgs
191 train, num_train_pids, num_train_imgs, test, num_test_pids, num_test_imgs = \
192 _extract_classic_split(meta_labeled, test_split)
193 splits_classic_lab.append({
197 'num_train_pids': num_train_pids,
198 'num_train_imgs': num_train_imgs,
199 'num_query_pids': num_test_pids,
200 'num_query_imgs': num_test_imgs,
201 'num_gallery_pids': num_test_pids,
202 'num_gallery_imgs': num_test_imgs
206 json.dump(splits_classic_det, f, indent=4, separators=(
',',
': '))
208 json.dump(splits_classic_lab, f, indent=4, separators=(
',',
': '))
210 def _extract_set(filelist, pids, pid2label, idxs, img_dir, relabel):
214 img_name = filelist[idx][0]
215 camid = int(img_name.split(
'_')[2]) - 1
219 img_path = osp.join(img_dir, img_name)
220 tmp_set.append((img_path, int(pid), camid))
222 return tmp_set, len(unique_pids), len(idxs)
224 def _extract_new_split(split_dict, img_dir):
225 train_idxs = split_dict[
'train_idx'].flatten() - 1
226 pids = split_dict[
'labels'].flatten()
227 train_pids = set(pids[train_idxs])
228 pid2label = {pid: label
for label, pid
in enumerate(train_pids)}
229 query_idxs = split_dict[
'query_idx'].flatten() - 1
230 gallery_idxs = split_dict[
'gallery_idx'].flatten() - 1
231 filelist = split_dict[
'filelist'].flatten()
232 train_info = _extract_set(filelist, pids, pid2label, train_idxs, img_dir, relabel=
True)
233 query_info = _extract_set(filelist, pids, pid2label, query_idxs, img_dir, relabel=
False)
234 gallery_info = _extract_set(filelist, pids, pid2label, gallery_idxs, img_dir, relabel=
False)
235 return train_info, query_info, gallery_info
237 print(
'Creating new split for detected images (767/700) ...')
238 train_info, query_info, gallery_info = _extract_new_split(
243 'train': train_info[0],
244 'query': query_info[0],
245 'gallery': gallery_info[0],
246 'num_train_pids': train_info[1],
247 'num_train_imgs': train_info[2],
248 'num_query_pids': query_info[1],
249 'num_query_imgs': query_info[2],
250 'num_gallery_pids': gallery_info[1],
251 'num_gallery_imgs': gallery_info[2]
255 json.dump(split, f, indent=4, separators=(
',',
': '))
257 print(
'Creating new split for labeled images (767/700) ...')
258 train_info, query_info, gallery_info = _extract_new_split(
263 'train': train_info[0],
264 'query': query_info[0],
265 'gallery': gallery_info[0],
266 'num_train_pids': train_info[1],
267 'num_train_imgs': train_info[2],
268 'num_query_pids': query_info[1],
269 'num_query_imgs': query_info[2],
270 'num_gallery_pids': gallery_info[1],
271 'num_gallery_imgs': gallery_info[2]
274 json.dump(split, f, indent=4, separators=(
',',
': '))