예제 #1
0
def validate(net, val_dataloader, epoch, save_change_map_dir, save_roc_dir):

    net.eval()
    cont_conv5_total, cont_fc_total, cont_embedding_total, num = 0.0, 0.0, 0.0, 0.0
    metric_for_conditions = util.init_metric_for_class_for_cmu(1)
    for batch_idx, batch in enumerate(val_dataloader):
        inputs1, input2, targets, filename, height, width = batch
        height, width, filename = height.numpy()[0], width.numpy(
        )[0], filename[0]
        inputs1, input2, targets = inputs1.cuda(), input2.cuda(), targets.cuda(
        )
        inputs1, inputs2, targets = Variable(inputs1, volatile=True), Variable(
            input2, volatile=True), Variable(targets)
        out_conv5, out_fc, out_embedding = net(inputs1, inputs2)
        out_conv5_t0, out_conv5_t1 = out_conv5
        out_fc_t0, out_fc_t1 = out_fc
        out_embedding_t0, out_embedding_t1 = out_embedding
        conv5_distance_map = single_layer_similar_heatmap_visual(
            out_conv5_t0, out_conv5_t1, save_change_map_dir, epoch, filename,
            'conv5', 'l2')
        fc_distance_map = single_layer_similar_heatmap_visual(
            out_fc_t0, out_fc_t1, save_change_map_dir, epoch, filename, 'fc',
            'l2')
        embedding_distance_map = single_layer_similar_heatmap_visual(
            out_embedding_t0, out_embedding_t1, save_change_map_dir, epoch,
            filename, 'embedding', 'l2')
        cont_conv5 = mc.RMS_Contrast(conv5_distance_map)
        cont_fc = mc.RMS_Contrast(fc_distance_map)
        cont_embedding = mc.RMS_Contrast(embedding_distance_map)
        cont_conv5_total += cont_conv5
        cont_fc_total += cont_fc
        cont_embedding_total += cont_embedding
        num += 1
        prob_change = embedding_distance_map[0][0]
        gt = targets.data.cpu().numpy()
        FN, FP, posNum, negNum = mc.eval_image_rewrite(gt[0],
                                                       prob_change,
                                                       cl_index=1)
        metric_for_conditions[0]['total_fp'] += FP
        metric_for_conditions[0]['total_fn'] += FN
        metric_for_conditions[0]['total_posnum'] += posNum
        metric_for_conditions[0]['total_negnum'] += negNum
        cont_conv5_mean, cont_fc_mean,cont_embedding_mean = cont_conv5_total/num, \
                                                                            cont_fc_total/num,cont_embedding_total/num

    thresh = np.array(range(0, 256)) / 255.0
    conds = metric_for_conditions.keys()
    for cond_name in conds:
        total_posnum = metric_for_conditions[cond_name]['total_posnum']
        total_negnum = metric_for_conditions[cond_name]['total_negnum']
        total_fn = metric_for_conditions[cond_name]['total_fn']
        total_fp = metric_for_conditions[cond_name]['total_fp']
        metric_dict = mc.pxEval_maximizeFMeasure(total_posnum,
                                                 total_negnum,
                                                 total_fn,
                                                 total_fp,
                                                 thresh=thresh)
        metric_for_conditions[cond_name].setdefault('metric', metric_dict)
        metric_for_conditions[cond_name].setdefault('contrast_conv5',
                                                    cont_conv5_mean)
        metric_for_conditions[cond_name].setdefault('contrast_fc',
                                                    cont_fc_mean)
        metric_for_conditions[cond_name].setdefault('contrast_embedding',
                                                    cont_embedding_mean)

    f_score_total = 0.0
    for cond_name in conds:
        pr, recall, f_score = metric_for_conditions[cond_name]['metric'][
            'precision'], metric_for_conditions[cond_name]['metric'][
                'recall'], metric_for_conditions[cond_name]['metric']['MaxF']
        roc_save_epoch_dir = os.path.join(save_roc_dir, str(epoch))
        check_dir(roc_save_epoch_dir)
        roc_save_epoch_cat_dir = os.path.join(roc_save_epoch_dir)
        check_dir(roc_save_epoch_cat_dir)
        mc.save_PTZ_metric2disk(metric_for_conditions[cond_name],
                                roc_save_epoch_cat_dir)
        roc_save_dir = os.path.join(roc_save_epoch_cat_dir,
                                    '_' + str(cond_name) + '_roc.png')
        mc.plotPrecisionRecall(pr, recall, roc_save_dir, benchmark_pr=None)
        f_score_total += f_score

    print(f_score_total / (len(conds)))
    return f_score_total / len(conds)
예제 #2
0
def validate(net, val_dataloader, epoch, save_change_map_dir, save_roc_dir):

    net.eval()
    cont_conv5_total, cont_fc_total, cont_embedding_total, num = 0.0, 0.0, 0.0, 0.0
    metric_for_conditions = util.init_metric_for_class_for_cmu(1)
    total_FP = 0.0
    total_FN = 0.0
    total_TP = 0.0
    total_TN = 0.0
    total_F1 = 0.0
    num = 0.0
    for batch_idx, batch in enumerate(val_dataloader):
        inputs1, input2, targets, filename, height, width = batch
        height, width, filename = height.numpy()[0], width.numpy(
        )[0], filename[0]
        inputs1, input2, targets = inputs1.cuda(), input2.cuda(), targets.cuda(
        )
        inputs1, inputs2, targets = Variable(inputs1, volatile=True), Variable(
            input2, volatile=True), Variable(targets)
        out_conv5, out_fc, out_embedding = net(inputs1, inputs2)
        out_conv5_t0, out_conv5_t1 = out_conv5
        out_fc_t0, out_fc_t1 = out_fc
        out_embedding_t0, out_embedding_t1 = out_embedding

        conv5_distance_map = single_layer_similar_heatmap_visual(
            out_conv5_t0, out_conv5_t1, save_change_map_dir, epoch, filename,
            'conv5', 'l2')
        fc_distance_map = single_layer_similar_heatmap_visual(
            out_fc_t0, out_fc_t1, save_change_map_dir, epoch, filename, 'fc',
            'l2')
        embedding_distance_map = single_layer_similar_heatmap_visual(
            out_embedding_t0, out_embedding_t1, save_change_map_dir, epoch,
            filename, 'embedding', 'l2')

        prob_change = embedding_distance_map[0][0]

        gt = targets.data.cpu().numpy()
        #FN, FP, posNum, negNum = mc.eval_image_rewrite(gt[0], prob_change, cl_index=1)
        FN, FP, TP, TN = mc.compute_FNFP(gt[0], prob_change)

        Precision = TP / (TP + FP + 1e-10)
        Recall = TP / (TP + FN + 1e-10)
        F_score = 2 * Precision / (Precision + Recall + 1e-10)
        OA = (TP + TN) / (TP + TN + FP + FN + 1e-10)
        #print('Metirc in Batch:',batch_idx,'in Validation.','Precision:',Precision,'Recall:',Recall,'F1_socre',F_score,'OA:',OA)

        total_FP = total_FP + FP
        total_FN = total_FN + FN
        total_TP = total_TP + TP
        total_TN = total_TN + TN
        num += 1

    pr = total_TP / (total_TP + total_TN + 1e-10)
    recall = total_TP / (total_TP + total_FN + 1e-10)
    f_score = 2 * pr / (pr + recall)
    oa = (total_TP + total_TN) / (total_TP + total_TN + total_TN + total_FN +
                                  1e-10)

    print('Metirc in Validation:', 'Precision:', pr, 'Recall:', recall,
          'F1_socre', f_score, 'OA:', oa)
    return f_score, pr, recall, oa