{"record":{"id":"3ac886ca3ff53a78","repo":"open-mmlab/mmdetection","slug":"metric-should-be-youtube-vis-ap-but-got-metric","errorCode":null,"errorMessage":"metric should be 'youtube_vis_ap', but got {metric}.","messagePattern":"metric should be 'youtube_vis_ap', but got (.+?)\\.","errorType":"validation","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"mmdet/evaluation/metrics/youtube_vis_metric.py","lineNumber":60,"sourceCode":"    \"\"\"\n\n    default_prefix: Optional[str] = 'youtube_vis'\n\n    def __init__(self,\n                 metric: Union[str, List[str]] = 'youtube_vis_ap',\n                 metric_items: Optional[Sequence[str]] = None,\n                 outfile_prefix: Optional[str] = None,\n                 collect_device: str = 'cpu',\n                 prefix: Optional[str] = None,\n                 format_only: bool = False) -> None:\n        super().__init__(collect_device=collect_device, prefix=prefix)\n        # vis evaluation metrics\n        self.metrics = metric if isinstance(metric, list) else [metric]\n        self.format_only = format_only\n        allowed_metrics = ['youtube_vis_ap']\n        for metric in self.metrics:\n            if metric not in allowed_metrics:\n                raise KeyError(\n                    f\"metric should be 'youtube_vis_ap', but got {metric}.\")\n\n        self.metric_items = metric_items\n        self.outfile_prefix = outfile_prefix\n        self.per_video_res = []\n        self.categories = []\n        self._vis_meta_info = defaultdict(list)  # record video and image infos\n\n    def process_video(self, data_samples):\n\n        video_length = len(data_samples)\n        for frame_id in range(video_length):\n            result = dict()\n            img_data_sample = data_samples[frame_id].to_dict()\n            pred = img_data_sample['pred_track_instances']\n            video_id = img_data_sample['video_id']\n\n            result['img_id'] = img_data_sample['img_id']","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/evaluation/metrics/youtube_vis_metric.py#L42-L78","documentation":"YouTubeVisMetric only supports the single metric name 'youtube_vis_ap'; any other entry in the metric list raises this KeyError during construction. The argument is normalized to a list, then each item validated against allowed_metrics.","triggerScenarios":"Passing metric='AP', metric=['mAP'], or metric='youtube_vis' to YouTubeVisMetric; also setting format_only=True but still listing an invalid metric name.","commonSituations":"Copy-pasting CocoMetric-style metric lists ('bbox','segm') into a video instance segmentation config; typos in the long metric name.","solutions":["Set metric='youtube_vis_ap' exactly (or ['youtube_vis_ap'])","If only exporting predictions, use format_only=True with outfile_prefix and keep metric='youtube_vis_ap'"],"exampleFix":"# before\nval_evaluator = dict(type='YouTubeVisMetric', metric='mAP')\n# after\nval_evaluator = dict(type='YouTubeVisMetric', metric='youtube_vis_ap')","handlingStrategy":"validation","validationCode":"assert all(m == 'youtube_vis_ap' for m in (metric if isinstance(metric, list) else [metric]))","typeGuard":"def is_valid_ytvis_metric(metric) -> bool:\n    items = metric if isinstance(metric, list) else [metric]\n    return all(m == 'youtube_vis_ap' for m in items)","tryCatchPattern":null,"preventionTips":["Hardcode metric='youtube_vis_ap' in VIS configs","Use format_only=True for pure result export"],"tags":["mmdet","youtube-vis","video-instance-seg","config"],"backgroundTag":null,"analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}