class VideoTop1Metric(Metric): def __init__(self): self.am = AverageMeter() def update(self, prediction, target): if target.dim() == 3: target = target.max(dim=1)[0] prediction_video = prediction.max(dim=0, keepdim=True)[0] target_video = target.max(dim=0, keepdim=True)[0] prec1, = accuracy(prediction_video, target_video, topk=(1, )) self.am.update(prec1.item()) def __repr__(self): return 'VideoPrec@1 {am.val:.3f} ({am.avg:.3f})'.format(am=self.am) def compute(self): return ('videotop1', self.am.avg)
class Top1Metric(Metric): def __init__(self): self.am = AverageMeter() def update(self, prediction, target): if isinstance(prediction, dict): prediction = prediction['class_prediction'] if isinstance(target, dict): target = target['class_target'] if len(target) > 0: prec1, = accuracy(prediction, target, topk=(1, )) self.am.update(prec1.item()) def __repr__(self): return 'Prec@1 {am.val:.3f} ({am.avg:.3f})'.format(am=self.am) def compute(self): return ('top1', self.am.avg)
def __init__(self): self.am = AverageMeter() self.predictions = [] self.targets = [] this_dir = os.path.dirname(__file__) top60path = '../external/ActivityNet/Evaluation/ava/ava_action_list_v2.1_for_activitynet_2018.pbtxt.txt' top60path = os.path.join(this_dir, top60path) with open(top60path) as f: self.top60 = [int(x) for x in re.findall('[0-9]+', f.read())]
class TripletAccuracyMetric(Metric): def __init__(self): self.am = AverageMeter() def update(self, prediction, target): if isinstance(prediction, dict): prediction = prediction['triplet_prediction'] if isinstance(target, dict): target = target['triplet_target'] if len(target) > 0: prec1 = self.triplet_accuracy(prediction, target) self.am.update(prec1.item()) def __repr__(self): return 'triplet_accuracy_metric {am.val:.3f} ({am.avg:.3f})'.format( am=self.am) def compute(self): return ('triplet_accuracy_metric', self.am.avg) def triplet_accuracy(self, output, target, weights=None): """ if target>0 then first output should be smaller than right output optional weighted average """ if type(output) is not list: output = [(x.item(), y.item()) for x, y in zip(*output)] correct = [ x < y if t > 0 else y < x for (x, y), t in zip(output, target) ] if weights is None: return np.mean(correct) else: weights = weights.numpy() weights = weights / (1e-5 + np.sum(weights)) return np.sum(np.array(correct).astype(float) * weights)
def __init__(self): self.am = AverageMeter()
def __init__(self): self.am = AverageMeter() self.predictions = [] self.targets = []