| 84 | |
| 85 | |
| 86 | class AccumDict: |
| 87 | def __init__(self, num_f=3): |
| 88 | self.d = defaultdict(list) |
| 89 | self.num_f = num_f |
| 90 | |
| 91 | def add(self, k, v): |
| 92 | self.d[k] += [v] |
| 93 | |
| 94 | def __dict__(self): |
| 95 | return self.d |
| 96 | |
| 97 | def __getitem__(self, key): |
| 98 | return self.d[key] |
| 99 | |
| 100 | def __str__(self): |
| 101 | s = '' |
| 102 | for k in self.d: |
| 103 | if not self.d[k]: |
| 104 | continue |
| 105 | cur = self.d[k][-1] |
| 106 | avg = np.mean(self.d[k]) |
| 107 | format_str = '{:.%df}' % self.num_f |
| 108 | cur_str = format_str.format(cur) |
| 109 | avg_str = format_str.format(avg) |
| 110 | s += f'{k} {cur_str} ({avg_str})\t\t' |
| 111 | return s |
| 112 | |
| 113 | def __repr__(self): |
| 114 | return self.__str__() |
| 115 | |
| 116 | |
| 117 | def crop(img, p=0.7, offset_x=0, offset_y=0): |
no outgoing calls
no test coverage detected