open-mmlab/mmdetection · error · ValueError

img_border_value must be float or tuple with 3 elements.

Error message

img_border_value must be float or tuple with 3 elements.

What it means

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).

Source

Thrown at mmdet/datasets/transforms/geometric.py:105

        assert isinstance(max_mag, float), \
            f'max_mag should be type float, got {type(max_mag)}.'
        assert min_mag <= max_mag, \
            f'min_mag should smaller than max_mag, ' \
            f'got min_mag={min_mag} and max_mag={max_mag}'
        assert isinstance(reversal_prob, float), \
            f'reversal_prob should be type float, got {type(max_mag)}.'
        assert 0 <= reversal_prob <= 1.0, \
            f'The reversal probability of the transformation magnitude ' \
            f'should be type float, got {type(reversal_prob)}.'
        if isinstance(img_border_value, (float, int)):
            img_border_value = tuple([float(img_border_value)] * 3)
        elif isinstance(img_border_value, tuple):
            assert len(img_border_value) == 3, \
                f'img_border_value as tuple must have 3 elements, ' \
                f'got {len(img_border_value)}.'
            img_border_value = tuple([float(val) for val in img_border_value])
        else:
            raise ValueError(
                'img_border_value must be float or tuple with 3 elements.')
        assert np.all([0 <= val <= 255 for val in img_border_value]), 'all ' \
            'elements of img_border_value should between range [0,255].' \
            f'got {img_border_value}.'
        self.prob = prob
        self.level = level
        self.min_mag = min_mag
        self.max_mag = max_mag
        self.reversal_prob = reversal_prob
        self.img_border_value = img_border_value
        self.mask_border_value = mask_border_value
        self.seg_ignore_label = seg_ignore_label
        self.interpolation = interpolation

    def _transform_img(self, results: dict, mag: float) -> None:
        """Transform the image."""
        pass

View on GitHub (pinned to cfd5d3a985)

Solutions

  1. Use a scalar: img_border_value=0, or a 3-element tuple/list: img_border_value=(114, 114, 114)
  2. Verify each element is numeric and within [0,255] (values >255 fail the subsequent range assertion)
  3. Cast config-sourced values: [float(v) for v in img_border_value] if they arrive as strings

Example fix

# before
dict(type='RandomRotate', prob=0.5, degree=10, img_border_value=[0, 0, 0, 255])
# after
dict(type='RandomRotate', prob=0.5, degree=10, img_border_value=(114, 114, 114))
Defensive patterns

Strategy: validation

Validate before calling

if isinstance(img_border_value, (list, tuple)):
    assert len(img_border_value) == 3, 'need 3 RGB values'
    img_border_value = tuple(float(v) for v in img_border_value)
    assert all(0 <= v <= 255 for v in img_border_value)

Type guard

import numbers

def is_valid_border_value(v) -> bool:
    if isinstance(v, numbers.Number):
        return True
    return (isinstance(v, (list, tuple)) and len(v) == 3
            and all(isinstance(x, numbers.Number) and 0 <= x <= 255 for x in v))

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of open-mmlab/mmdetection@cfd5d3a985 (2026-08-27). Data as JSON: /api/errors/272bb5f7ad2bbd57. Report an issue: GitHub.