open-mmlab/mmdetection · error · ValueError
When not setting min_sizes and max_sizes,basesize_ratio_rang
Error message
When not setting min_sizes and max_sizes,basesize_ratio_range[0] should be either 0.1or 0.15 when input_size is 512, got {basesize_ratio_range[0]}. What it means
SSDAnchorGenerator derives anchor sizes for input_size=512 from two presets keyed by basesize_ratio_range[0]: 0.1 (COCO) or 0.15 (VOC). When min_sizes/max_sizes are not set and the leading ratio is neither, the constructor raises ValueError because no preset exists.
Source
Thrown at mmdet/models/task_modules/prior_generators/anchor_generator.py:571
min_sizes.insert(0, int(self.input_size * 7 / 100))
max_sizes.insert(0, int(self.input_size * 15 / 100))
elif basesize_ratio_range[0] == 0.2: # SSD300 VOC
min_sizes.insert(0, int(self.input_size * 10 / 100))
max_sizes.insert(0, int(self.input_size * 20 / 100))
else:
raise ValueError(
'basesize_ratio_range[0] should be either 0.15'
'or 0.2 when input_size is 300, got '
f'{basesize_ratio_range[0]}.')
elif self.input_size == 512:
if basesize_ratio_range[0] == 0.1: # SSD512 COCO
min_sizes.insert(0, int(self.input_size * 4 / 100))
max_sizes.insert(0, int(self.input_size * 10 / 100))
elif basesize_ratio_range[0] == 0.15: # SSD512 VOC
min_sizes.insert(0, int(self.input_size * 7 / 100))
max_sizes.insert(0, int(self.input_size * 15 / 100))
else:
raise ValueError(
'When not setting min_sizes and max_sizes,'
'basesize_ratio_range[0] should be either 0.1'
'or 0.15 when input_size is 512, got'
f' {basesize_ratio_range[0]}.')
else:
raise ValueError(
'Only support 300 or 512 in SSDAnchorGenerator when '
'not setting min_sizes and max_sizes, '
f'got {self.input_size}.')
assert len(min_sizes) == len(max_sizes) == len(strides)
anchor_ratios = []
anchor_scales = []
for k in range(len(self.strides)):
scales = [1., np.sqrt(max_sizes[k] / min_sizes[k])]
anchor_ratio = [1.]
for r in ratios[k]:View on GitHub (pinned to cfd5d3a985)
Solutions
- Use basesize_ratio_range=(0.1, 0.9) for SSD512 COCO or (0.15, 0.9) for SSD512 VOC
- Or pass explicit min_sizes/max_sizes lists to bypass preset derivation
Example fix
# before
anchor_generator=dict(
type='SSDAnchorGenerator', input_size=512,
basesize_ratio_range=(0.2, 0.95))
# after
anchor_generator=dict(
type='SSDAnchorGenerator', input_size=512,
basesize_ratio_range=(0.15, 0.9)) # SSD512 VOC Defensive patterns
Strategy: validation
Validate before calling
ag = cfg['anchor_generator']
assert ag.get('input_size') != 512 or ag.get('min_sizes') or ag['basesize_ratio_range'][0] in (0.1, 0.15) Prevention
- When changing input_size, re-check basesize_ratio_range presets
- Add a config unit test asserting anchor config validity
When it happens
Trigger: SSDAnchorGenerator with input_size=512, min_sizes/max_sizes omitted, and basesize_ratio_range[0] not equal to 0.1 or 0.15 (e.g. 0.2 carried over from an SSD300 VOC config).
Common situations: Porting an SSD300 VOC config (ratio 0.2) to SSD512, or customizing the ratio sweep without explicitly defining anchor min/max sizes.
Related errors
- basesize_ratio_range[0] should be either 0.15or 0.2 when inp
- Only support 300 or 512 in SSDAnchorGenerator when not setti
- Invalid scale {scale}, must be positive.
- Scale must be a number or tuple of int, but got {type(scale)
- Invalid crop_type {crop_type}.
AI-assisted analysis of open-mmlab/mmdetection@cfd5d3a985 (2026-08-27).
Data as JSON: /api/errors/ebd0c7e0a122b9b6.
Report an issue: GitHub.