{"record":{"id":"272bb5f7ad2bbd57","repo":"open-mmlab/mmdetection","slug":"img-border-value-must-be-float-or-tuple-with-3-ele","errorCode":null,"errorMessage":"img_border_value must be float or tuple with 3 elements.","messagePattern":"img_border_value must be float or tuple with 3 elements\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mmdet/datasets/transforms/geometric.py","lineNumber":105,"sourceCode":"        assert isinstance(max_mag, float), \\\n            f'max_mag should be type float, got {type(max_mag)}.'\n        assert min_mag <= max_mag, \\\n            f'min_mag should smaller than max_mag, ' \\\n            f'got min_mag={min_mag} and max_mag={max_mag}'\n        assert isinstance(reversal_prob, float), \\\n            f'reversal_prob should be type float, got {type(max_mag)}.'\n        assert 0 <= reversal_prob <= 1.0, \\\n            f'The reversal probability of the transformation magnitude ' \\\n            f'should be type float, got {type(reversal_prob)}.'\n        if isinstance(img_border_value, (float, int)):\n            img_border_value = tuple([float(img_border_value)] * 3)\n        elif isinstance(img_border_value, tuple):\n            assert len(img_border_value) == 3, \\\n                f'img_border_value as tuple must have 3 elements, ' \\\n                f'got {len(img_border_value)}.'\n            img_border_value = tuple([float(val) for val in img_border_value])\n        else:\n            raise ValueError(\n                'img_border_value must be float or tuple with 3 elements.')\n        assert np.all([0 <= val <= 255 for val in img_border_value]), 'all ' \\\n            'elements of img_border_value should between range [0,255].' \\\n            f'got {img_border_value}.'\n        self.prob = prob\n        self.level = level\n        self.min_mag = min_mag\n        self.max_mag = max_mag\n        self.reversal_prob = reversal_prob\n        self.img_border_value = img_border_value\n        self.mask_border_value = mask_border_value\n        self.seg_ignore_label = seg_ignore_label\n        self.interpolation = interpolation\n\n    def _transform_img(self, results: dict, mag: float) -> None:\n        \"\"\"Transform the image.\"\"\"\n        pass\n","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/datasets/transforms/geometric.py#L87-L123","documentation":"For random geometric transforms (RandomRotate/RandomFlip family) in mmdet's geometric.py, img_border_value may be a number, or a tuple of exactly 3 numbers (RGB) within [0,255]. Anything else — a list of wrong length, a string, a dict, or a 4-element tuple — raises this ValueError (element/range assertions are separate).","triggerScenarios":"Passing img_border_value=[0,0,0,0] (4 elements), '128' (string), or [0,0] (2 elements) to RandomRotate or RandomAffine; also passing a tuple with non-numeric entries.","commonSituations":"Config typos where the border value is a string or wrong-length sequence; copying configs between transforms that accept different border formats (e.g. segmentation fill values with 255-channel lists); values out of [0,255] hitting the follow-up assertion.","solutions":["Use a scalar: img_border_value=0, or a 3-element tuple/list: img_border_value=(114, 114, 114)","Verify each element is numeric and within [0,255] (values >255 fail the subsequent range assertion)","Cast config-sourced values: [float(v) for v in img_border_value] if they arrive as strings"],"exampleFix":"# before\ndict(type='RandomRotate', prob=0.5, degree=10, img_border_value=[0, 0, 0, 255])\n# after\ndict(type='RandomRotate', prob=0.5, degree=10, img_border_value=(114, 114, 114))","handlingStrategy":"validation","validationCode":"if isinstance(img_border_value, (list, tuple)):\n    assert len(img_border_value) == 3, 'need 3 RGB values'\n    img_border_value = tuple(float(v) for v in img_border_value)\n    assert all(0 <= v <= 255 for v in img_border_value)","typeGuard":"import numbers\n\ndef is_valid_border_value(v) -> bool:\n    if isinstance(v, numbers.Number):\n        return True\n    return (isinstance(v, (list, tuple)) and len(v) == 3\n            and all(isinstance(x, numbers.Number) and 0 <= x <= 255 for x in v))","tryCatchPattern":null,"preventionTips":["Use scalar 0 or a 3-tuple like (114,114,114) for img_border_value","Validate length/range at config-parse time when border values come from external files"],"tags":["mmdet","transform","geometric","img-border-value","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}