evaluate by Caltech-style log-average miss rate ref: str - "CALTECH_-2"/"CALTECH_-4"
(self, ref="CALTECH_-2", fppiX=None, fppiY=None)
| 531 | self.scorelist = scorelist |
| 532 | |
| 533 | def eval_MR(self, ref="CALTECH_-2", fppiX=None, fppiY=None): |
| 534 | """ |
| 535 | evaluate by Caltech-style log-average miss rate |
| 536 | ref: str - "CALTECH_-2"/"CALTECH_-4" |
| 537 | """ |
| 538 | # find greater_than |
| 539 | def _find_gt(lst, target): |
| 540 | for idx, item in enumerate(lst): |
| 541 | if item >= target: |
| 542 | return idx |
| 543 | return len(lst) - 1 |
| 544 | |
| 545 | assert ref == "CALTECH_-2" or ref == "CALTECH_-4", ref |
| 546 | if ref == "CALTECH_-2": |
| 547 | # CALTECH_MRREF_2: anchor points (from 10^-2 to 1) as in P.Dollar's paper |
| 548 | ref = [0.0100, 0.0178, 0.03160, 0.0562, 0.1000, 0.1778, 0.3162, 0.5623, 1.000] |
| 549 | else: |
| 550 | # CALTECH_MRREF_4: anchor points (from 10^-4 to 1) as in S.Zhang's paper |
| 551 | ref = [0.0001, 0.0003, 0.00100, 0.0032, 0.0100, 0.0316, 0.1000, 0.3162, 1.000] |
| 552 | |
| 553 | if self.scorelist is None: |
| 554 | self.compare() |
| 555 | |
| 556 | tp, fp = 0.0, 0.0 |
| 557 | if fppiX is None or fppiY is None: |
| 558 | fppiX, fppiY = list(), list() |
| 559 | for i, item in enumerate(self.scorelist): |
| 560 | if item[1] == 1: |
| 561 | tp += 1.0 |
| 562 | elif item[1] == 0: |
| 563 | fp += 1.0 |
| 564 | |
| 565 | fn = (self._gtNum - self._ignNum) - tp |
| 566 | recall = tp / (tp + fn) |
| 567 | missrate = 1.0 - recall |
| 568 | fppi = fp / self._imageNum |
| 569 | fppiX.append(fppi) |
| 570 | fppiY.append(missrate) |
| 571 | |
| 572 | score = list() |
| 573 | for pos in ref: |
| 574 | argmin = _find_gt(fppiX, pos) |
| 575 | if argmin >= 0: |
| 576 | score.append(fppiY[argmin]) |
| 577 | score = np.array(score) |
| 578 | MR = np.exp(np.log(score).mean()) |
| 579 | return MR, (fppiX, fppiY) |
| 580 | |
| 581 | def eval_AP(self): |
| 582 | """ |
no test coverage detected