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
- 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
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
- 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
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
- batch_size should be a positive integer value, but got batch
- metric item "{metric_item}" is not supported
- metric must be a list or a str.
- metrics {iou_metrics} is not supported. Only supports mIoU/m
- out_indices must be a subset of range(0, 8). But received {o
AI-assisted analysis of open-mmlab/mmdetection@cfd5d3a985 (2026-08-27).
Data as JSON: /api/errors/272bb5f7ad2bbd57.
Report an issue: GitHub.