{"record":{"id":"59f880b0e1f24cda","repo":"open-mmlab/mmdetection","slug":"please-run-accumulate-first-59f880","errorCode":null,"errorMessage":"Please run accumulate() first","messagePattern":"Please run accumulate\\(\\) first","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"mmdet/evaluation/functional/ytviseval.py","lineNumber":570,"sourceCode":"                0, areaRng='large', maxDets=self.params.maxDets[2])\n            return stats\n\n        def _summarizeKps():\n            stats = np.zeros((10, ))\n            stats[0] = _summarize(1, maxDets=20)\n            stats[1] = _summarize(1, maxDets=20, iouThr=.5)\n            stats[2] = _summarize(1, maxDets=20, iouThr=.75)\n            stats[3] = _summarize(1, maxDets=20, areaRng='medium')\n            stats[4] = _summarize(1, maxDets=20, areaRng='large')\n            stats[5] = _summarize(0, maxDets=20)\n            stats[6] = _summarize(0, maxDets=20, iouThr=.5)\n            stats[7] = _summarize(0, maxDets=20, iouThr=.75)\n            stats[8] = _summarize(0, maxDets=20, areaRng='medium')\n            stats[9] = _summarize(0, maxDets=20, areaRng='large')\n            return stats\n\n        if not self.eval:\n            raise Exception('Please run accumulate() first')\n        iouType = self.params.iouType\n        if iouType == 'segm' or iouType == 'bbox':\n            summarize = _summarizeDets\n        elif iouType == 'keypoints':\n            summarize = _summarizeKps\n        self.stats = summarize()\n\n    def __str__(self):\n        self.summarize()\n\n\nclass Params:\n    \"\"\"Params for coco evaluation api.\"\"\"\n\n    def setDetParams(self):\n        self.vidIds = []\n        self.catIds = []\n        # np.arange causes trouble.  the data point on arange","sourceCodeStart":552,"sourceCodeEnd":588,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/evaluation/functional/ytviseval.py#L552-L588","documentation":"summarize() reads the accumulated evaluation arrays (self.eval['precision']/['recall']); if accumulate() was never run (or evalImgs were never processed), self.eval is empty and an Exception is raised prompting to run accumulate() first.","triggerScenarios":"Calling ytviseval.summarize() immediately after YTVISEval(...) without evaluate() + accumulate(); calling __str__ (which invokes summarize) before accumulation.","commonSituations":"Custom eval scripts reordered from the standard Evaluate->Accumulate->Summarize flow; exception in evaluate() silently caught before accumulate.","solutions":["Call the canonical sequence: ev.evaluate(); ev.accumulate(); ev.summarize()","Check that evaluate() did not raise/return early before accumulate()","Guard: if not ev.eval: skip summarize"],"exampleFix":"# before\nev = YTVISEval(gt, dt, 'segm')\nev.summarize()  # Exception\n# after\nev = YTVISEval(gt, dt, 'segm')\nev.evaluate(); ev.accumulate(); ev.summarize()","handlingStrategy":"try-catch","validationCode":"if not ytviseval.eval:\n    ytviseval.evaluate(); ytviseval.accumulate()","typeGuard":null,"tryCatchPattern":"try:\n    ev.summarize()\nexcept Exception as e:\n    if 'accumulate' in str(e):\n        ev.evaluate(); ev.accumulate(); ev.summarize()\n    else:\n        raise","preventionTips":["Always follow evaluate -> accumulate -> summarize order","Check ev.eval is non-empty before summarizing/printing the evaluator"],"tags":["ytvis","api-misuse","eval-pipeline","mmdetection"],"backgroundTag":"api-call-order-violation","analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}