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

  1. Use basesize_ratio_range=(0.1, 0.9) for SSD512 COCO or (0.15, 0.9) for SSD512 VOC
  2. 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 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


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