{"record":{"id":"9bcffe5af06337a7","repo":"WZMIAOMIAO/deep-learning-for-image-processing","slug":"please-run-accumulate-first-9bcffe","errorCode":null,"errorMessage":"Please run accumulate() first","messagePattern":"Please run accumulate\\(\\) first","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"pytorch_object_detection/yolov3_spp/validation.py","lineNumber":80,"sourceCode":"\n    stats, print_list = [0] * 12, [\"\"] * 12\n    stats[0], print_list[0] = _summarize(1)\n    stats[1], print_list[1] = _summarize(1, iouThr=.5, maxDets=self.params.maxDets[2])\n    stats[2], print_list[2] = _summarize(1, iouThr=.75, maxDets=self.params.maxDets[2])\n    stats[3], print_list[3] = _summarize(1, areaRng='small', maxDets=self.params.maxDets[2])\n    stats[4], print_list[4] = _summarize(1, areaRng='medium', maxDets=self.params.maxDets[2])\n    stats[5], print_list[5] = _summarize(1, areaRng='large', maxDets=self.params.maxDets[2])\n    stats[6], print_list[6] = _summarize(0, maxDets=self.params.maxDets[0])\n    stats[7], print_list[7] = _summarize(0, maxDets=self.params.maxDets[1])\n    stats[8], print_list[8] = _summarize(0, maxDets=self.params.maxDets[2])\n    stats[9], print_list[9] = _summarize(0, areaRng='small', maxDets=self.params.maxDets[2])\n    stats[10], print_list[10] = _summarize(0, areaRng='medium', maxDets=self.params.maxDets[2])\n    stats[11], print_list[11] = _summarize(0, areaRng='large', maxDets=self.params.maxDets[2])\n\n    print_info = \"\\n\".join(print_list)\n\n    if not self.eval:\n        raise Exception('Please run accumulate() first')\n\n    return stats, print_info\n\n\ndef main(parser_data):\n    device = torch.device(parser_data.device if torch.cuda.is_available() else \"cpu\")\n    print(\"Using {} device training.\".format(device.type))\n\n    # read class_indict\n    label_json_path = './data/pascal_voc_classes.json'\n    assert os.path.exists(label_json_path), \"json file {} dose not exist.\".format(label_json_path)\n    with open(label_json_path, 'r') as f:\n        class_dict = json.load(f)\n\n    category_index = {v: k for k, v in class_dict.items()}\n\n    data_dict = parse_data_cfg(parser_data.data)\n    test_path = data_dict[\"valid\"]","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/blob/1ec3fe6f374fc9969973a61f819de25658595afa/pytorch_object_detection/yolov3_spp/validation.py#L62-L98","documentation":"The COCO-style evaluator's summarize() requires that accumulate() has run first, because self.eval is only populated by accumulate(). If self.eval is None/empty, summarize raises Exception('Please run accumulate() first'). It enforces the correct call order: evaluate() -> accumulate() -> summarize().","triggerScenarios":"Calling evaluator.summarize() (from validation.py main) without having called evaluator.accumulate() beforehand, or accumulate() being skipped on an error/no-data path.","commonSituations":"Writing custom validation loops that call summarize directly; early-exit code paths that skip accumulation when the dataloader is empty; refactoring that reordered accumulate/summarize calls.","solutions":["Ensure the loop calls evaluator.accumulate() after evaluate() and before summarize().","Check that accumulate() is not skipped by a conditional/early return when predictions exist.","If self.eval can legitimately be empty, guard with `if evaluator.eval: evaluator.summarize()`."],"exampleFix":"// before\nfor images, targets in val_loader:\n    evaluator.update(predictions)\nevaluator.summarize()\n// after\nfor images, targets in val_loader:\n    evaluator.update(predictions)\nevaluator.accumulate()\nevaluator.summarize()","handlingStrategy":"validation","validationCode":"if evaluator.eval is None:\n    evaluator.accumulate()\nevaluator.summarize()","typeGuard":"def can_summarize(evaluator) -> bool:\n    return getattr(evaluator, 'eval', None) is not None","tryCatchPattern":"try:\n    stats, info = evaluator.summarize()\nexcept Exception as e:\n    if 'accumulate' in str(e):\n        evaluator.accumulate(); stats, info = evaluator.summarize()\n    else:\n        raise","preventionTips":["Always follow the evaluate -> accumulate -> summarize order","Avoid early returns between accumulate and summarize","Wrap the three calls in one helper function"],"tags":["lifecycle-order","coco-evaluation","runtime-error","validation"],"backgroundTag":"accumulate-before-summarize","analyzedSha":"1ec3fe6f374fc9969973a61f819de25658595afa","analyzedAt":"2026-08-30T09:19:11.901Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}