{"record":{"id":"1dc540387ae973ca","repo":"open-mmlab/mmdetection","slug":"metric-class-name-got-empty-self-result","errorCode":null,"errorMessage":"{metric.__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/evaluator/multi_datasets_evaluator.py","lineNumber":73,"sourceCode":"            size (int): Length of the entire validation dataset. When batch\n                size > 1, the dataloader may pad some data samples to make\n                sure all ranks have the same length of dataset slice. The\n                ``collect_results`` function will drop the padded data based on\n                this size.\n\n        Returns:\n            dict: Evaluation results of all metrics. The keys are the names\n            of the metrics, and the values are corresponding results.\n        \"\"\"\n        metrics_results = OrderedDict()\n        dataset_slices = self._get_cumulative_sizes()\n        assert len(dataset_slices) == len(self.dataset_prefixes)\n\n        for dataset_prefix, start, end, metric in zip(\n                self.dataset_prefixes, [0] + dataset_slices[:-1],\n                dataset_slices, self.metrics):\n            if len(metric.results) == 0:\n                warnings.warn(\n                    f'{metric.__class__.__name__} got empty `self.results`.'\n                    'Please ensure that the processed results are properly '\n                    'added into `self.results` in `process` method.')\n\n            results = collect_results(metric.results, size,\n                                      metric.collect_device)\n\n            if is_main_process():\n                # cast all tensors in results list to cpu\n                results = _to_cpu(results)\n                _metrics = metric.compute_metrics(\n                    results[start:end])  # type: ignore\n\n                if metric.prefix:\n                    final_prefix = '/'.join((dataset_prefix, metric.prefix))\n                else:\n                    final_prefix = dataset_prefix\n                print(f'================{final_prefix}================')","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/evaluation/evaluator/multi_datasets_evaluator.py#L55-L91","documentation":"Warning from MultiDatasetsEvaluator.evaluate: one of the per-dataset metrics has an empty self.results list at evaluate time, meaning process() never added results for that dataset — its metrics will be meaningless/zero.","triggerScenarios":"Using MultiDatasetsEvaluator where a metric bound to a dataset_prefix received no process() calls (e.g. batch size not divisible causing dropped samples, a metric whose process filters everything, or a mis-matched evaluator/dataset wiring).","commonSituations":"Evaluating on multiple concatenated datasets (e.g. COCO+VOC) with metrics that skip results; leads to empty mAP or divide-by-zero downstream.","solutions":["Check that every dataset in the multi-evaluator has data flowing through process() (dataloader not empty for that subset)","Verify metric class implements process() appending to self.results for your datasample type","Ensure dataset_prefixes/metrics lists in the evaluator config align with the dataloader datasets","Log len(metric.results) per prefix before evaluate to pinpoint the empty one"],"exampleFix":"# before\nval_evaluator = dict(type='MultiDatasetsEvaluator', metrics=[dict(type='CocoMetric')], dataset_prefixes=['coco','voc'])\n# after: ensure each subset yields data, e.g. fix empty voc split / batch remainder handling","handlingStrategy":"validation","validationCode":"for prefix, metric in zip(evaluator.dataset_prefixes, evaluator.metrics):\n    if len(metric.results) == 0:\n        print(f'warning: no results collected for {prefix}/{type(metric).__name__}')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Sanity-check that each dataset subset yields batches","Verify metric.process() handles your datasample type","Align dataset_prefixes with the multi-dataset dataloader config"],"tags":["python","warning","evaluation","multi-dataset","empty-results"],"backgroundTag":"empty-evaluation-results","analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}