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