{"record":{"id":"48c15a83cc967ebb","repo":"open-mmlab/mmdetection","slug":"self-class-name-got-empty-self-results","errorCode":null,"errorMessage":"{self.__class__.__name__} got empty `self.results`. Please ensure that the processed results are properly added into `self.results` in `process` method.","messagePattern":"(.+?) got empty `self\\.results`\\. Please ensure that the processed results are properly added into `self\\.results` in `process` method\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"mmdet/evaluation/metrics/base_video_metric.py","lineNumber":62,"sourceCode":"                # video process\n                self.process_video(video_data_samples)\n            else:\n                # image process\n                self.process_image(video_data_samples, ori_video_len)\n\n    def evaluate(self, size: int = 1) -> dict:\n        \"\"\"Evaluate the model performance of the whole dataset after processing\n        all batches.\n\n        Args:\n            size (int): Length of the entire validation dataset.\n\n        Returns:\n            dict: Evaluation metrics dict on the val dataset. The keys are the\n            names of the metrics, and the values are corresponding results.\n        \"\"\"\n        if len(self.results) == 0:\n            warnings.warn(\n                f'{self.__class__.__name__} got empty `self.results`. Please '\n                'ensure that the processed results are properly added into '\n                '`self.results` in `process` method.')\n\n        results = collect_tracking_results(self.results, self.collect_device)\n\n        if is_main_process():\n            _metrics = self.compute_metrics(results)  # type: ignore\n            # Add prefix to metric names\n            if self.prefix:\n                _metrics = {\n                    '/'.join((self.prefix, k)): v\n                    for k, v in _metrics.items()\n                }\n            metrics = [_metrics]\n        else:\n            metrics = [None]  # type: ignore\n","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/evaluation/metrics/base_video_metric.py#L44-L80","documentation":"BaseVideoMetric.evaluate() warns when self.results is empty before calling collect_tracking_results. It means no per-batch results were ever appended in process(), so evaluation has nothing to compute and will return empty/failed metrics. This is a warning, not an exception, but evaluation output will be meaningless.","triggerScenarios":"Calling evaluate() on a video/tracking metric (e.g. BaseVideoMetric subclass) after a validation loop in which process() never appended to self.results — e.g. the dataloader yielded no batches, process() was never called, or a custom subclass overrode process() without extending self.results.","commonSituations":"Empty val dataset or wrong split in the dataloader config; a custom metric subclass whose process() forgets self.results.append(...); distributed runs where results live on another rank; test pipeline mismatch so process is skipped.","solutions":["Verify the validation dataloader actually yields batches (check dataset length and ann_file path)","If you subclass BaseVideoMetric, ensure process() calls self.results.append(...) for every batch","Check that runner.val_loop/dataloader is wired to the metric in the config so process() is invoked","On distributed runs, confirm collect_device/gather flags so results are not lost before evaluate()"],"exampleFix":"// before\nclass MyVideoMetric(BaseVideoMetric):\n    def process(self, data_batch, data_samples):\n        pass  # results never stored\n// after\nclass MyVideoMetric(BaseVideoMetric):\n    def process(self, data_batch, data_samples):\n        for sample in data_samples:\n            self.results.append(sample.to_dict())","handlingStrategy":"validation","validationCode":"assert len(val_dataset) > 0, 'val dataset is empty'\n# after one val step:\nassert len(metric.results) > 0, 'process() never stored results'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Assert the val dataloader length before running evaluation","In custom metric subclasses, always extend self.results in process()","Smoke-test evaluate() on a single batch before full runs"],"tags":["mmdet","video-metrics","empty-results","evaluation","tracking"],"backgroundTag":"empty-evaluation-results","analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}