| import numpy as np |
| import torch |
| import torch.nn.functional as F |
| from torch.autograd import Variable |
|
|
| from .classificationMAP import getClassificationMAP as cmAP |
| from .detectionMAP import getSingleStreamDetectionMAP as dsmAP |
| from .detectionMAP import getTwoStreamDetectionMAP as dtmAP |
| from .utils import write_results_to_eval_file, write_results_to_file |
|
|
|
|
| def ss_eval(epoch, dataloader, args, logger, model, device): |
| vid_preds = [] |
| frm_preds = [] |
| vid_lens = [] |
| labels = [] |
|
|
| for num, sample in enumerate(dataloader): |
| if (num + 1) % 100 == 0: |
| print("Testing test data point %d of %d" % (num + 1, len(dataloader))) |
|
|
| features = sample["data"].numpy() |
| label = sample["labels"].numpy() |
| vid_len = sample["vid_len"].numpy() |
|
|
| features = torch.from_numpy(features).float().to(device) |
|
|
| with torch.no_grad(): |
| _, vid_pred, _, frm_scr = model(Variable(features)) |
| frm_pred = F.softmax(frm_scr, -1) |
| vid_pred = np.squeeze(vid_pred.cpu().data.numpy(), axis=0) |
| frm_pred = np.squeeze(frm_pred.cpu().data.numpy(), axis=0) |
| label = np.squeeze(label, axis=0) |
|
|
| vid_preds.append(vid_pred) |
| frm_preds.append(frm_pred) |
| vid_lens.append(vid_len) |
| labels.append(label) |
|
|
| vid_preds = np.array(vid_preds) |
| frm_preds = np.array(frm_preds) |
| vid_lens = np.array(vid_lens) |
| labels = np.array(labels) |
|
|
| cmap = cmAP(vid_preds, labels) |
| dmap, iou = dsmAP( |
| vid_preds, frm_preds, vid_lens, dataloader.dataset.path_to_annotations, args |
| ) |
|
|
| print("Classification map %f" % cmap) |
| for item in list(zip(iou, dmap)): |
| print("Detection map @ %f = %f" % (item[0], item[1])) |
|
|
| logger.log_value("Test Classification mAP", cmap, epoch) |
| for item in list(zip(dmap, iou)): |
| logger.log_value("Test Detection1 mAP @ IoU = " + str(item[1]), item[0], epoch) |
|
|
| write_results_to_file(args, dmap, cmap, epoch) |
|
|
|
|
| def ts_eval(dataloader, args, logger, rgb_model, flow_model, device): |
| rgb_vid_preds = [] |
| rgb_frame_preds = [] |
| flow_vid_preds = [] |
| flow_frame_preds = [] |
| vid_lens = [] |
| labels = [] |
|
|
| for num, sample in enumerate(dataloader): |
| if (num + 1) % 100 == 0: |
| print("Testing test data point %d of %d" % (num + 1, len(dataloader))) |
|
|
| rgb_features = sample["rgb_data"].numpy() |
| flow_features = sample["flow_data"].numpy() |
| label = sample["labels"].numpy() |
| vid_len = sample["vid_len"].numpy() |
|
|
| rgb_features_inp = torch.from_numpy(rgb_features).float().to(device) |
| flow_features_inp = torch.from_numpy(flow_features).float().to(device) |
|
|
| with torch.no_grad(): |
| _, rgb_video_pred, _, rgb_frame_scr = rgb_model(Variable(rgb_features_inp)) |
| _, flow_video_pred, _, flow_frame_scr = flow_model( |
| Variable(flow_features_inp) |
| ) |
|
|
| rgb_frame_pred = F.softmax(rgb_frame_scr, -1) |
| flow_frame_pred = F.softmax(flow_frame_scr, -1) |
|
|
| rgb_frame_pred = np.squeeze(rgb_frame_pred.cpu().data.numpy(), axis=0) |
| flow_frame_pred = np.squeeze(flow_frame_pred.cpu().data.numpy(), axis=0) |
| rgb_video_pred = np.squeeze(rgb_video_pred.cpu().data.numpy(), axis=0) |
| flow_video_pred = np.squeeze(flow_video_pred.cpu().data.numpy(), axis=0) |
| label = np.squeeze(label, axis=0) |
|
|
| rgb_vid_preds.append(rgb_video_pred) |
| rgb_frame_preds.append(rgb_frame_pred) |
| flow_vid_preds.append(flow_video_pred) |
| flow_frame_preds.append(flow_frame_pred) |
| vid_lens.append(vid_len) |
| labels.append(label) |
|
|
| rgb_vid_preds = np.array(rgb_vid_preds) |
| rgb_frame_preds = np.array(rgb_frame_preds) |
| flow_vid_preds = np.array(flow_vid_preds) |
| flow_frame_preds = np.array(flow_frame_preds) |
| vid_lens = np.array(vid_lens) |
| labels = np.array(labels) |
|
|
| dmap, iou = dtmAP( |
| rgb_vid_preds, |
| flow_vid_preds, |
| rgb_frame_preds, |
| flow_frame_preds, |
| vid_lens, |
| dataloader.dataset.path_to_annotations, |
| args, |
| ) |
|
|
| sum = 0 |
| count = 0 |
| for item in list(zip(iou, dmap)): |
| print("Detection map @ %f = %f" % (item[0], item[1])) |
| if count < 7: |
| sum = sum + item[1] |
| count += 1 |
|
|
| print("average map = %f" % (sum / count)) |
| write_results_to_eval_file(args, dmap, args.rgb_load_epoch, args.flow_load_epoch) |
|
|