{"record":{"id":"313c24be58f9edae","repo":"facebookresearch/detectron2","slug":"attribute-key-does-not-exist-in-the-metadata-o","errorCode":null,"errorMessage":"Attribute '{key}' does not exist in the metadata of dataset '{self.name}': metadata is empty.","messagePattern":"Attribute '(.+?)' does not exist in the metadata of dataset '(.+?)': metadata is empty\\.","errorType":"exception","errorClass":"AttributeError","httpStatus":null,"severity":"error","filePath":"detectron2/data/catalog.py","lineNumber":131,"sourceCode":"    }\n\n    def __getattr__(self, key):\n        if key in self._RENAMED:\n            log_first_n(\n                logging.WARNING,\n                \"Metadata '{}' was renamed to '{}'!\".format(key, self._RENAMED[key]),\n                n=10,\n            )\n            return getattr(self, self._RENAMED[key])\n\n        # \"name\" exists in every metadata\n        if len(self.__dict__) > 1:\n            raise AttributeError(\n                \"Attribute '{}' does not exist in the metadata of dataset '{}'. Available \"\n                \"keys are {}.\".format(key, self.name, str(self.__dict__.keys()))\n            )\n        else:\n            raise AttributeError(\n                f\"Attribute '{key}' does not exist in the metadata of dataset '{self.name}': \"\n                \"metadata is empty.\"\n            )\n\n    def __setattr__(self, key, val):\n        if key in self._RENAMED:\n            log_first_n(\n                logging.WARNING,\n                \"Metadata '{}' was renamed to '{}'!\".format(key, self._RENAMED[key]),\n                n=10,\n            )\n            setattr(self, self._RENAMED[key], val)\n\n        # Ensure that metadata of the same name stays consistent\n        try:\n            oldval = getattr(self, key)\n            assert oldval == val, (\n                \"Attribute '{}' in the metadata of '{}' cannot be set \"","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/facebookresearch/detectron2/blob/a2f4a8771ab77e8411c26b27f24f9489a28a2453/detectron2/data/catalog.py#L113-L149","documentation":"Same missing-attribute path as error 18, but the else branch indicates the metadata object holds only 'name' — i.e. the dataset was registered with no metadata at all besides its name, so any other attribute access fails with 'metadata is empty'.","triggerScenarios":"Registering a dataset with only a loader: DatasetCatalog.register('x', loader) without any MetadataCatalog.get('x').set(...), then accessing MetadataCatalog.get('x').thing_classes.","commonSituations":"Minimal custom dataset registration that skips MetadataCatalog entirely; test/dummy datasets; following a tutorial that omitted metadata setup.","solutions":["Populate metadata at registration time: MetadataCatalog.get(name).set(thing_classes=[...], **kwargs)","Provide defaults in your code when metadata is empty (e.g. fall back to dummy_classes)","Follow register_instances-style helpers that set both catalog and metadata together"],"exampleFix":"# before\nDatasetCatalog.register(\"my_train\", lambda: load_dicts(...))\nmeta = MetadataCatalog.get(\"my_train\").thing_classes  # metadata is empty\n# after\nfrom detectron2.data import register_instances\nregister_instances(\"my_train\", lambda: load_dicts(...), {\"thing_classes\": [\"cat\", \"dog\"]})","handlingStrategy":"type-guard","validationCode":"from detectron2.data import MetadataCatalog\nmeta = MetadataCatalog.get(name)\nrequired = ['thing_classes']\nmissing = [k for k in required if getattr(meta, k, None) is None]\nassert not missing, f\"metadata empty/missing for {name}: {missing}\"","typeGuard":"def metadata_populated(name: str, keys) -> bool:\n    meta = MetadataCatalog.get(name)\n    return all(getattr(meta, k, None) is not None for k in keys)","tryCatchPattern":"try:\n    classes = meta.thing_classes\nexcept AttributeError as e:\n    if \"metadata is empty\" in str(e):\n        raise SystemExit(f\"register metadata for {name} before training\")\n    raise","preventionTips":["Always pair DatasetCatalog.register with MetadataCatalog.get(name).set(...)","Use register_instances helper to set both at once","Fail fast on empty metadata before long training runs"],"tags":["metadata","registry","detectron2"],"backgroundTag":"missing-dataset-metadata","analyzedSha":"a2f4a8771ab77e8411c26b27f24f9489a28a2453","analyzedAt":"2026-08-27T12:08:21.260Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}