import cv2 as cv from ..timer import Timer class BaseMetric: def __init__(self, **kwargs): self._warmup = kwargs.pop('warmup', 3) self._repeat = kwargs.pop('repeat', 10) self._reduction = kwargs.pop('reduction', 'median') self._timer = Timer() def _calcMedian(self, records): ''' Return the median of records ''' l = len(records) mid = int(l / 2) if l % 2 == 0: return (records[mid] + records[mid - 1]) / 2 else: return records[mid] def _calcGMean(self, records, drop_largest=3): ''' Return the geometric mean of records after drop the first drop_largest ''' l = len(records) if l <= drop_largest: print('len(records)({}) <= drop_largest({}), stop dropping.'.format(l, drop_largest)) records_sorted = sorted(records, reverse=True) return sum(records_sorted[drop_largest:]) / (l - drop_largest) def _getResult(self): records = self._timer.getRecords() if self._reduction == 'median': return self._calcMedian(records) elif self._reduction == 'gmean': return self._calcGMean(records) else: raise NotImplementedError('Reduction {} is not supported'.format(self._reduction)) def getReduction(self): return self._reduction def forward(self, model, *args, **kwargs): raise NotImplementedError('Not implemented')