Beispiel #1
0
def test(model, test_loader, losses, epoch, nr_query=Config.nr_query):
    '''
    return: cmc1, mAP
    test model on testset and save result to log.
    '''
    val_start_time = time.time()
    model.eval()
    logger.info('testing', 'Start testing')
    all_features, all_labels, all_cids = [], [], []
    history = collections.defaultdict(list)

    for i, (imgs, labels, cids, types,
            colors) in tqdm(enumerate(test_loader),
                            desc='testing on epoch-{}'.format(epoch),
                            total=len(test_loader)):
        imgs, labels, cids = imgs.cuda(), labels.cuda(), cids.cuda()
        types, colors = types.cuda(), colors.cuda()
        f_norm, p_type, p_color = model(imgs)

        triplet_hard_loss = losses['triplet_hard_loss'](f_norm, labels)

        acc_type = accuracy(p_type, types)[0]
        acc_color = accuracy(p_color, colors)[0]

        history['triplet_hard_loss'].append(float(triplet_hard_loss))
        history['acc_type'].append(float(acc_type))
        history['acc_color'].append(float(acc_color))

        all_features.append(f_norm.cpu().detach().numpy())
        all_labels.append(labels.cpu().detach().numpy())
        all_cids.append(cids.cpu().detach().numpy())

    all_features = np.concatenate(all_features, axis=0)
    all_labels = np.concatenate(all_labels, axis=0)
    all_cids = np.concatenate(all_cids, axis=0)
    q_f, g_f = all_features[:nr_query], all_features[nr_query:]
    q_ids, g_ids = all_labels[:nr_query], all_labels[nr_query:]
    q_cids, g_cids = all_cids[:nr_query], all_cids[nr_query:]

    print('Compute CMC and mAP')
    distance_matrix = get_L2distance_matrix_numpy(q_f, g_f)
    cmc, mAP = get_cmc_map(distance_matrix, q_ids, g_ids, q_cids, g_cids)
    val_end_time = time.time()
    time_spent = sec2min_sec(val_start_time, val_end_time)

    text = 'Finish testing epoch {:>3}, time spent: [{:>3}mins{:>3}s], performance:\n##'.format(
        epoch, time_spent[0], time_spent[1])
    text += '|CMC1:{:>5.4f} |mAP:{:>5.4f}'.format(cmc[0], mAP)
    for k, vlist in history.items():
        v = float(mean(vlist))
        text += '|{}:{:>5.4f} '.format(k, v)
        logger.add_scalar('TEST/' + k, v, epoch)
    logger.info('testing', text)

    logger.add_scalar('TEST/cmc1', cmc[0], epoch)
    logger.add_scalar('TEST/cmc5', cmc[4], epoch)
    logger.add_scalar('TEST/cmc10', cmc[9], epoch)
    logger.add_scalar('TEST/mAP', mAP, epoch)
    return cmc, mAP
Beispiel #2
0
def test(model, test_loader, losses, epoch, nr_query=Config.nr_query):
    '''
    return: cmc1, mAP
    test model on testset and save result to log.
    '''
    val_start_time = time.time()
    model.eval()
    logger.info('testing', 'Start testing')
    all_features_gpu, all_labels, all_cids, all_mask_gpu = [], [], [], []
    all_attn_dist = []
    history = collections.defaultdict(list)

    for i, (imgs, labels,
            cids) in tqdm(enumerate(test_loader),
                          desc='testing on epoch-{}'.format(epoch),
                          total=len(test_loader)):
        imgs, labels, cids = imgs.cuda(), labels.cuda(), cids.cuda()
        f_norm, f_mask = model(imgs)
        triplet_hard_loss, dist = losses['triplet_hard_loss'](f_norm, f_mask,
                                                              labels)
        history['triplet_hard_loss'].append(float(triplet_hard_loss))
        all_features_gpu.append(f_norm)
        all_labels.append(labels.cpu().detach().numpy())
        all_cids.append(cids.cpu().detach().numpy())
        all_mask_gpu.append(f_mask)
        all_attn_dist.append(dist.cpu().detach().numpy())

    all_features_gpu = torch.cat(all_features_gpu, axis=0)
    all_features = all_features_gpu.cpu().detach().numpy()
    all_labels = np.concatenate(all_labels, axis=0)
    all_cids = np.concatenate(all_cids, axis=0)
    all_mask_gpu = torch.cat(all_mask_gpu, axis=0)

    q_f_gpu, g_f_gpu = all_features_gpu[:nr_query], all_features_gpu[nr_query:]
    q_f, g_f = all_features[:nr_query], all_features[nr_query:]
    q_ids, g_ids = all_labels[:nr_query], all_labels[nr_query:]
    q_cids, g_cids = all_cids[:nr_query], all_cids[nr_query:]
    q_mask, g_mask = all_mask_gpu[:nr_query], all_mask_gpu[nr_query:]

    print('Compute CMC and mAP')
    attn_distance_matrix = get_L2distance_matrix_attn_batch(
        q_f_gpu, g_f_gpu, q_mask, g_mask, temp=Config.temperature)
    attn_distance_matrix = attn_distance_matrix.cpu().detach().numpy()
    distance_matrix = get_L2distance_matrix_numpy(q_f, g_f)
    cmc_a, mAP_a = get_cmc_map(attn_distance_matrix, q_ids, g_ids, q_cids,
                               g_cids)
    cmc, mAP = get_cmc_map(distance_matrix, q_ids, g_ids, q_cids, g_cids)
    val_end_time = time.time()
    time_spent = sec2min_sec(val_start_time, val_end_time)

    text = 'Finish testing epoch {:>3}, time spent: [{:>3}mins{:>3}s], performance:\n##'.format(
        epoch, time_spent[0], time_spent[1])
    text += 'With ATTENTION> |CMC1:{:>5.4f} |mAP:{:>5.4f}  '.format(
        cmc_a[0], mAP_a)
    text += 'W/O attention> |CMC1:{:>5.4f} |mAP:{:>5.4f}'.format(cmc[0], mAP)
    for k, vlist in history.items():
        v = float(mean(vlist))
        text += '|{}:{:>5.4f} '.format(k, v)
        logger.add_scalar('TEST/' + k, v, epoch)
    logger.info('testing', text)

    logger.add_scalar('TEST/cmc1_a', cmc_a[0], epoch)
    logger.add_scalar('TEST/cmc5_a', cmc_a[4], epoch)
    logger.add_scalar('TEST/mAP_a', mAP_a, epoch)
    logger.add_scalar('TEST/cmc1', cmc[0], epoch)
    logger.add_scalar('TEST/cmc5', cmc[4], epoch)
    logger.add_scalar('TEST/mAP', mAP, epoch)
    return cmc_a, mAP_a, cmc, mAP
Beispiel #3
0
def test(model,
         bclassifier,
         test_loader,
         losses,
         epoch,
         nr_query=Config.nr_query):
    '''
    return: cmc1, mAP
    test model on testset and save result to log.
    '''
    val_start_time = time.time()
    model.eval()
    bclassifier.eval()
    logger.info('testing', 'Start testing')
    all_features_gpu, all_labels, all_cids, all_mask = [], [], [], []

    for i, (imgs, labels, cids) in tqdm(enumerate(test_loader),
                                        desc='extracting features',
                                        total=len(test_loader)):
        imgs, labels, cids = imgs.cuda(), labels.cuda(), cids.cuda()
        f_norm, f_mask = model(imgs)
        all_features_gpu.append(f_norm)
        all_labels.append(labels)
        all_mask.append(f_mask)
        all_cids.append(cids)

    features = torch.cat(all_features_gpu, axis=0)
    alllabels = torch.cat(all_labels, axis=0)
    allmask = torch.cat(all_mask, axis=0)
    allcids = torch.cat(all_cids, axis=0)

    q_f_gpu, g_f_gpu = features[:nr_query, ...], features[nr_query:, ...]
    q_ids, g_ids = alllabels[:nr_query, ...], alllabels[nr_query:, ...]
    q_cids, g_cids = allcids[:nr_query], allcids[nr_query:]
    q_mask, g_mask = allmask[:nr_query], allmask[nr_query:]

    pk_pros = []
    for start in tqdm(range(0, q_f_gpu.shape[0], Config.eval_P),
                      desc='computing similarity'):
        end = min(start + Config.eval_P, q_f_gpu.shape[0])
        p_pros = []
        for kstart in range(0, g_f_gpu.shape[0], Config.eval_K):
            kend = min(kstart + Config.eval_K, g_f_gpu.shape[0])
            pros = bclassifier(q_f_gpu[start:end, ...], g_f_gpu[kstart:kend,
                                                                ...])
            pros = pros.reshape(end - start, kend - kstart, 2)
            p_pros.append(pros)
        p_pros = torch.cat(p_pros, axis=1)
        pk_pros.append(p_pros)
    pros = torch.cat(pk_pros, axis=0)
    pairlabels = idlabel2pairlabel(q_ids, g_ids)
    acc = accuracy(pros.reshape(-1, 2), pairlabels)[0]
    distance_matrix = pros[:, :, 0].cpu().detach().numpy()
    q_ids = q_ids.cpu().detach().numpy()
    g_ids = g_ids.cpu().detach().numpy()
    q_cids = q_cids.cpu().detach().numpy()
    g_cids = g_cids.cpu().detach().numpy()

    print('Compute CMC and mAP')
    cmc, mAP = get_cmc_map(distance_matrix, q_ids, g_ids, q_cids, g_cids)
    val_end_time = time.time()
    time_spent = sec2min_sec(val_start_time, val_end_time)

    text = 'Finish testing epoch {:>3}, time spent: [{:>3}mins{:>3}s], performance:\n##'.format(
        epoch, time_spent[0], time_spent[1])
    text += 'W/O attention> |CMC1:{:>5.4f} |mAP:{:>5.4f} |ACC:{:>5.4f} '.format(
        cmc[0], mAP, acc)
    logger.info('testing', text)

    logger.add_scalar('TEST/cmc1', cmc[0], epoch)
    logger.add_scalar('TEST/cmc5', cmc[4], epoch)
    logger.add_scalar('TEST/mAP', mAP, epoch)
    logger.add_scalar('TEST/acc', acc, epoch)
    return cmc, mAP, acc