{"record":{"id":"f2deb2e62be58011","repo":"open-mmlab/mmdetection","slug":"box-type-name-has-been-registered","errorCode":null,"errorMessage":"box type {name} has been registered","messagePattern":"box type (.+?) has been registered","errorType":"validation","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"mmdet/structures/bbox/box_type.py","lineNumber":30,"sourceCode":"box_types: dict = {}\n_box_type_to_name: dict = {}\nbox_converters: dict = {}\n\n\ndef _register_box(name: str, box_type: Type, force: bool = False) -> None:\n    \"\"\"Register a box type.\n\n    Args:\n        name (str): The name of box type.\n        box_type (type): Box mode class to be registered.\n        force (bool): Whether to override an existing class with the same\n            name. Defaults to False.\n    \"\"\"\n    assert issubclass(box_type, BaseBoxes)\n    name = name.lower()\n\n    if not force and (name in box_types or box_type in _box_type_to_name):\n        raise KeyError(f'box type {name} has been registered')\n    elif name in box_types:\n        _box_type = box_types.pop(name)\n        _box_type_to_name.pop(_box_type)\n    elif box_type in _box_type_to_name:\n        _name = _box_type_to_name.pop(box_type)\n        box_types.pop(_name)\n\n    box_types[name] = box_type\n    _box_type_to_name[box_type] = name\n\n\ndef register_box(name: str,\n                 box_type: Type = None,\n                 force: bool = False) -> Union[Type, Callable]:\n    \"\"\"Register a box type.\n\n    A record will be added to ``bbox_types``, whose key is the box type name\n    and value is the box type itself. Simultaneously, a reverse dictionary","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/structures/bbox/box_type.py#L12-L48","documentation":"mmdet keeps a global registry mapping box type names ('hbox', 'rbox', 'qbox') to classes. _register_box raises KeyError on duplicate registration to prevent ambiguous box-type semantics in convert/pack operations; force=True overwrites instead.","triggerScenarios":"Calling get_box_type/register machinery twice for the same name — commonly importing a module that re-registers a box type (e.g. re-importing mmdet.structures in a notebook after autoreload, or a third-party plugin registering 'hbox' again without force).","commonSituations":"Jupyter %autoreload re-executing registration code, plugin packages registering a type name already used by mmdet, or module reloads in test suites.","solutions":["Pass force=True when re-registration is intentional (plugins overriding built-in behavior)","Use a unique name for custom box types instead of colliding with 'hbox'/'rbox'/'qbox'","Restart the kernel / avoid re-importing registration modules in notebooks"],"exampleFix":"# before\nregister_box(MyBoxes, 'hbox')  # KeyError: already registered\n# after\nregister_box(MyBoxes, 'mybox')  # unique name\n# or\nregister_box(MyBoxes, 'hbox', force=True)  # intentional override","handlingStrategy":"try-catch","validationCode":"from mmdet.structures.bbox import box_types\nname = 'mybox'\nif name in box_types:\n    # already registered, skip or use force\n    pass","typeGuard":null,"tryCatchPattern":"try:\n    register_box(MyBoxes, 'mybox')\nexcept KeyError as e:\n    if 'has been registered' in str(e):\n        register_box(MyBoxes, 'mybox', force=True)  # if override intended\n    else:\n        raise","preventionTips":["Namespace custom box type names to avoid collisions","Disable autoreload for modules that register global state"],"tags":["mmdetection","registry","duplicate-registration"],"backgroundTag":"duplicate-registration","analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}