|
|
|
|
|
|
|
|
|
|
|
import numpy as np |
|
|
|
|
|
class Meter(object): |
|
def __init__(self, name, val, avg): |
|
self.name = name |
|
self.val = val |
|
self.avg = avg |
|
|
|
def __repr__(self): |
|
return "{name}: {val:.6f} ({avg:.6f})".format( |
|
name=self.name, val=self.val, avg=self.avg |
|
) |
|
|
|
def __format__(self, *tuples, **kwargs): |
|
return self.__repr__() |
|
|
|
|
|
class AverageMeter(object): |
|
"""Computes and stores the average and current value""" |
|
def __init__(self): |
|
self.reset() |
|
|
|
def reset(self): |
|
self.val = {} |
|
self.sum = {} |
|
self.count = {} |
|
|
|
def update(self, batch=1, **kwargs): |
|
val = {} |
|
for k in kwargs: |
|
val[k] = kwargs[k] / float(batch) |
|
self.val.update(val) |
|
for k in kwargs: |
|
if k not in self.sum: |
|
self.sum[k] = 0 |
|
self.count[k] = 0 |
|
self.sum[k] += kwargs[k] |
|
self.count[k] += batch |
|
|
|
def __repr__(self): |
|
s = '' |
|
for k in self.sum: |
|
s += self.format_str(k) |
|
return s |
|
|
|
def format_str(self, attr): |
|
return "{name}: {val:.6f} ({avg:.6f}) ".format( |
|
name=attr, |
|
val=float(self.val[attr]), |
|
avg=float(self.sum[attr]) / self.count[attr]) |
|
|
|
def __getattr__(self, attr): |
|
if attr in self.__dict__: |
|
return super(AverageMeter, self).__getattr__(attr) |
|
if attr not in self.sum: |
|
|
|
print("invalid key '{}'".format(attr)) |
|
return Meter(attr, 0, 0) |
|
return Meter(attr, self.val[attr], self.avg(attr)) |
|
|
|
def avg(self, attr): |
|
return float(self.sum[attr]) / self.count[attr] |
|
|
|
|
|
class IouMeter(object): |
|
def __init__(self, thrs, sz): |
|
self.sz = sz |
|
self.iou = np.zeros((sz, len(thrs)), dtype=np.float32) |
|
self.thrs = thrs |
|
self.reset() |
|
|
|
def reset(self): |
|
self.iou.fill(0.) |
|
self.n = 0 |
|
|
|
def add(self, output, target): |
|
if self.n >= len(self.iou): |
|
return |
|
target, output = target.squeeze(), output.squeeze() |
|
for i, thr in enumerate(self.thrs): |
|
pred = output > thr |
|
mask_sum = (pred == 1).astype(np.uint8) + (target > 0).astype(np.uint8) |
|
intxn = np.sum(mask_sum == 2) |
|
union = np.sum(mask_sum > 0) |
|
if union > 0: |
|
self.iou[self.n, i] = intxn / union |
|
elif union == 0 and intxn == 0: |
|
self.iou[self.n, i] = 1 |
|
self.n += 1 |
|
|
|
def value(self, s): |
|
nb = max(int(np.sum(self.iou > 0)), 1) |
|
iou = self.iou[:nb] |
|
|
|
def is_number(s): |
|
try: |
|
float(s) |
|
return True |
|
except ValueError: |
|
return False |
|
if s == 'mean': |
|
res = np.mean(iou, axis=0) |
|
elif s == 'median': |
|
res = np.median(iou, axis=0) |
|
elif is_number(s): |
|
res = np.sum(iou > float(s), axis=0) / float(nb) |
|
return res |
|
|
|
|
|
if __name__ == '__main__': |
|
avg = AverageMeter() |
|
avg.update(time=1.1, accuracy=.99) |
|
avg.update(time=1.0, accuracy=.90) |
|
|
|
print(avg) |
|
|
|
print(avg.time) |
|
print(avg.time.avg) |
|
print(avg.time.val) |
|
print(avg.SS) |
|
|
|
|
|
|
|
|