def test(self): epoch = self.scheduler.last_epoch + 1 self.ckpt.write_log('\n[INFO] Test:') self.model.eval() self.ckpt.add_log(torch.zeros(1, 5)) # get the encodings/features for the query dataset # the result size for example in the market query dataset # is 3368 X 2048 since there are 3368 query photos qf = self.extract_feature(self.query_loader).numpy() # get the encodings/features for the query dataset # the result size for example in the market gallery dataset # is 15913 X 2048 since there are 15913 gallery photos gf = self.extract_feature(self.test_loader).numpy() if self.args.re_rank: q_g_dist = np.dot(qf, np.transpose(gf)) q_q_dist = np.dot(qf, np.transpose(qf)) g_g_dist = np.dot(gf, np.transpose(gf)) # dist will end up being a 2D matrix of size #query_photos X #gallery_photos # in case of market, this is 3368 X 15913 # thus, dist[0][0] is the distance between query_photo[0] to gallery_photo[0] dist = re_ranking(q_g_dist, q_q_dist, g_g_dist) else: # each image is represented by a vector of size 2048 which are its "features/encoding" # distance is calculated here using euclidian distances between the cross product # of each query image with each gallery image dist = cdist(qf, gf) r = cmc(dist, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras, separate_camera_set=False, single_gallery_shot=False, first_match_break=True) m_ap = mean_ap(dist, epoch, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras) self.ckpt.log[-1, 0] = m_ap self.ckpt.log[-1, 1] = r[0] self.ckpt.log[-1, 2] = r[2] self.ckpt.log[-1, 3] = r[4] self.ckpt.log[-1, 4] = r[9] best = self.ckpt.log.max(0) self.ckpt.write_log( '[INFO] mAP: {:.4f} rank1: {:.4f} rank3: {:.4f} rank5: {:.4f} rank10: {:.4f} (Best: {:.4f} @epoch {})' .format(m_ap, r[0], r[2], r[4], r[9], best[0][0], (best[1][0] + 1) * self.args.test_every)) if not self.args.test_only: self.ckpt.save(self, epoch, is_best=((best[1][0] + 1) * self.args.test_every == epoch))
def test(self): epoch = self.scheduler.last_epoch + 1 # print("test=") # print(epoch) self.ckpt.write_log('\n[INFO] Test:') self.model.eval() # print("after eval") self.ckpt.add_log(torch.zeros(1, 5)) qf = self.extract_feature(self.query_loader).numpy() gf = self.extract_feature(self.test_loader).numpy() # print("111") if self.args.re_rank: q_g_dist = np.dot(qf, np.transpose(gf)) q_q_dist = np.dot(qf, np.transpose(qf)) g_g_dist = np.dot(gf, np.transpose(gf)) dist = re_ranking(q_g_dist, q_q_dist, g_g_dist) else: dist = cdist(qf, gf) # print("222") r = cmc(dist, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras, separate_camera_set=False, single_gallery_shot=False, first_match_break=True) m_ap = mean_ap(dist, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras) self.ckpt.log[-1, 0] = m_ap self.ckpt.log[-1, 1] = r[0] self.ckpt.log[-1, 2] = r[2] self.ckpt.log[-1, 3] = r[4] self.ckpt.log[-1, 4] = r[9] best = self.ckpt.log.max(0) # print("333") self.ckpt.write_log( '[INFO] mAP: {:.4f} rank1: {:.4f} rank3: {:.4f} rank5: {:.4f} rank10: {:.4f} (Best: {:.4f} @epoch {})' .format(m_ap, r[0], r[2], r[4], r[9], best[0][0], (best[1][0] + 1) * self.args.test_every)) if not self.args.test_only: self.ckpt.save(self, epoch, is_best=((best[1][0] + 1) * self.args.test_every == epoch))
def test(self): epoch = self.scheduler.last_epoch + 1 self.ckpt.write_log('\n[INFO] Test:') self.model.eval() # print("$$$$$$$$$$$$$$$$$$$") # print(self.attackset.ids) self.ckpt.add_log(torch.zeros(1, 5)) qf = self.extract_feature(self.attack_loader).numpy() # gradients = torch.autograd.grad(qf, self.query_loader)[0] # adversarial_examples = self.query_loader+(0.1*gradients.sign()) # adversarial_examples = torch.clamp(adversarial_examples, min=0, max=1).detach() # qf = self.extract_feature(adversarial_examples) gf = self.extract_feature(self.test_loader).numpy() # print(qf.shape()) # print(gf.shape()) # print("###############") if self.args.re_rank: q_g_dist = np.dot(qf, np.transpose(gf)) q_q_dist = np.dot(qf, np.transpose(qf)) g_g_dist = np.dot(gf, np.transpose(gf)) dist = re_ranking(q_g_dist, q_q_dist, g_g_dist) else: dist = cdist(qf, gf) r = cmc(dist, self.attackset.ids, self.testset.ids, self.attackset.cameras, self.testset.cameras, separate_camera_set=False, single_gallery_shot=False, first_match_break=True) m_ap = mean_ap(dist, self.attackset.ids, self.testset.ids, self.attackset.cameras, self.testset.cameras) self.ckpt.log[-1, 0] = m_ap self.ckpt.log[-1, 1] = r[0] self.ckpt.log[-1, 2] = r[2] self.ckpt.log[-1, 3] = r[4] self.ckpt.log[-1, 4] = r[9] best = self.ckpt.log.max(0) self.ckpt.write_log( '[INFO] mAP: {:.4f} rank1: {:.4f} rank3: {:.4f} rank5: {:.4f} rank10: {:.4f} (Best: {:.4f} @epoch {})' .format(m_ap, r[0], r[2], r[4], r[9], best[0][0], (best[1][0] + 1) * self.args.test_every)) if not self.args.test_only: self.ckpt.save(self, epoch, is_best=((best[1][0] + 1) * self.args.test_every == epoch))
def test(self): self.epoch = self.scheduler.last_epoch + 1 self.ckpt.write_log('\n[INFO] Test:') self.ckpt.add_log(torch.zeros(1, 5)) qf = self.extract_feature(self.query_loader) gf = self.extract_feature(self.test_loader) # save feature, cam, label, frames #pytorch_result = {'query_f':qf, 'query_cam':self.queryset.cameras, # 'query_label':self.queryset.ids, 'query_frames':self.queryset.frames, # 'gallery_f':gf, 'gallery_cam':self.testset.cameras, # 'gallery_label':self.testset.ids, 'gallery_frames':self.testset.frames} #savemat('./pytorch_result.mat',pytorch_result) #print('saved') if self.args.re_rank: q_g_dist = np.dot(qf, np.transpose(gf)) q_q_dist = np.dot(qf, np.transpose(qf)) g_g_dist = np.dot(gf, np.transpose(gf)) dist = re_ranking(q_g_dist, q_q_dist, g_g_dist) else: dist = cdist(qf, gf) r = cmc(dist, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras, separate_camera_set=False, single_gallery_shot=False, first_match_break=True) m_ap = mean_ap(dist, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras) self.ckpt.log[-1, 0] = m_ap self.ckpt.log[-1, 1] = r[0] self.ckpt.log[-1, 2] = r[2] self.ckpt.log[-1, 3] = r[4] self.ckpt.log[-1, 4] = r[9] best = self.ckpt.log.max(0) self.ckpt.write_log( '[INFO] mAP: {:.4f} rank1: {:.4f} rank3: {:.4f} rank5: {:.4f} rank10: {:.4f} (Best: {:.4f} @epoch {})'.format( m_ap, r[0], r[2], r[4], r[9], best[0][0], (best[1][0] + 1)*self.args.test_every ) ) if not self.args.test: self.ckpt.save(self, self.epoch, is_best=((best[1][0] + 1)*self.args.test_every == self.epoch))
def test(self): epoch = self.scheduler.last_epoch + 1 self.ckpt.write_log('\n[INFO] Test:') self.model.eval() self.ckpt.add_log(torch.zeros(1, 5)) qf, q_image_paths = self.extract_feature(self.query_loader) gf, _ = self.extract_feature(self.test_loader) qf = qf.numpy() # (31, 2048) for debug gf = gf.numpy() # (154, 2048) for if self.args.re_rank: q_g_dist = np.dot(qf, np.transpose(gf)) q_q_dist = np.dot(qf, np.transpose(qf)) g_g_dist = np.dot(gf, np.transpose(gf)) dist = re_ranking(q_g_dist, q_q_dist, g_g_dist) else: dist = cdist(qf, gf, metric='cosine') if self.args.multi_query: # Suitable for boxes dataset only # Use several same id query samples to retrieval one gallery print(dist.shape) # (31, 154) ids = [ int(x.split(os.sep)[-1].split('_')[0]) for x in q_image_paths ] ids_set = set(ids) ids_np = np.asarray(ids, dtype=np.int32) for id in ids_set: indices = np.where(ids_np == id)[0] mean = np.mean(dist[indices, :], axis=0) for index in indices: dist[index, :] = mean r = cmc(dist, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras, separate_camera_set=False, single_gallery_shot=False, first_match_break=True) m_ap = mean_ap(dist, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras) self.ckpt.log[-1, 0] = m_ap self.ckpt.log[-1, 1] = r[0] self.ckpt.log[-1, 2] = r[2] self.ckpt.log[-1, 3] = r[4] self.ckpt.log[-1, 4] = r[9] best = self.ckpt.log.max(0) self.ckpt.write_log( '[INFO] mAP: {:.4f} rank1: {:.4f} rank3: {:.4f} rank5: {:.4f} rank10: {:.4f} (Best: {:.4f} @epoch {})' .format(m_ap, r[0], r[2], r[4], r[9], best[0][0], (best[1][0] + 1) * self.args.test_every)) # Another method to calculate cmc and mAP, it get the same result! # print(eval_market1501(dist, self.queryset.ids, self.testset.ids, # self.queryset.cameras, self.testset.cameras, 100)) if not self.args.test_only: self.ckpt.save(self, epoch, is_best=((best[1][0] + 1) * self.args.test_every == epoch))
def test(self): epoch = self.scheduler.last_epoch + 1 self.ckpt.write_log('\n[INFO] Test:') self.model.eval() self.ckpt.add_log(torch.zeros(1, 5)) qf = self.extract_feature(self.query_loader).numpy() gf = self.extract_feature(self.test_loader).numpy() # distence threshold norms_q = np.linalg.norm(qf, axis=1) # axis=1, l1范数 norms_g = np.linalg.norm(gf, axis=1) qf = qf / np.reshape(norms_q, ((qf.shape)[0], 1)) gf = gf / np.reshape(norms_g, ((gf.shape)[0], 1)) # no rerank dist = cdist( qf, gf) # metric='cosine',计算两个矩阵行间的所有向量对的距离,默认:euclidean; 3368*15913 m_ap = mean_ap(dist, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras) r = cmc(dist, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras, separate_camera_set=False, single_gallery_shot=False, first_match_break=True) self.ckpt.log[-1, 0] = m_ap self.ckpt.log[-1, 1] = r[0] self.ckpt.log[-1, 2] = r[2] self.ckpt.log[-1, 3] = r[4] self.ckpt.log[-1, 4] = r[9] best = self.ckpt.log.max(0) self.ckpt.write_log( '[INFO]( ^_^ ) mAP: {:.4f} rank1: {:.4f} rank3: {:.4f} rank5: {:.4f} rank10: {:.4f} (Best: {:.4f} @epoch {})' .format(m_ap, r[0], r[2], r[4], r[9], best[0][0], (best[1][0] + 1) * self.args.test_every)) # rerank if self.args.re_rank: q_g_dist = np.dot(qf, np.transpose(gf)) q_q_dist = np.dot(qf, np.transpose(qf)) g_g_dist = np.dot(gf, np.transpose(gf)) dist_rerank = re_ranking(q_g_dist, q_q_dist, g_g_dist) r_rerank = cmc(dist_rerank, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras, separate_camera_set=False, single_gallery_shot=False, first_match_break=True) map_rerank = mean_ap(dist_rerank, self.queryset.ids, self.testset.ids, self.queryset.cameras, self.testset.cameras) self.ckpt.log[-1, 0] = map_rerank self.ckpt.log[-1, 1] = r_rerank[0] self.ckpt.log[-1, 2] = r_rerank[2] self.ckpt.log[-1, 3] = r_rerank[4] self.ckpt.log[-1, 4] = r_rerank[9] best = self.ckpt.log.max(0) self.ckpt.write_log( '[INFO](rerank) mAP: {:.4f} rank1: {:.4f} rank3: {:.4f} rank5: {:.4f} rank10: {:.4f} (Best: {:.4f} @epoch {})' .format(map_rerank, r_rerank[0], r_rerank[2], r_rerank[4], r_rerank[9], best[0][0], (best[1][0] + 1) * self.args.test_every)) if not self.args.test_only: self.ckpt.save(self, epoch, is_best=((best[1][0] + 1) * self.args.test_every == epoch))