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)
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