PaddlePaddle/PaddleOCR · error · ValueError

DilatedReparamBlock requires kernel_size in [5,7,9,11,13], b

Error message

DilatedReparamBlock requires kernel_size in [5,7,9,11,13], but got {}

What it means

DilatedReparamBlock (reparameterized large-kernel block in RSEFPN) only has decomposed branch definitions for kernel sizes 5, 7, 9, 11, and 13. Any other kernel_size hits the else branch and raises ValueError, because no (kernel_sizes, dilates) split is defined to reparameterize it.

Source

Thrown at ppocr/modeling/necks/db_fpn.py:592

        self.is_repped = deploy

        if kernel_size == 9:
            self.kernel_sizes = [5, 5, 3, 3]
            self.dilates = [1, 2, 3, 4]
        elif kernel_size == 7:
            self.kernel_sizes = [5, 3, 3]
            self.dilates = [1, 2, 3]
        elif kernel_size == 5:
            self.kernel_sizes = [3, 3]
            self.dilates = [1, 2]
        elif kernel_size == 11:
            self.kernel_sizes = [5, 5, 3, 3, 3]
            self.dilates = [1, 2, 3, 4, 5]
        elif kernel_size == 13:
            self.kernel_sizes = [5, 7, 3, 3, 3]
            self.dilates = [1, 2, 3, 4, 5]
        else:
            raise ValueError(
                "DilatedReparamBlock requires kernel_size in [5,7,9,11,13], "
                "but got {}".format(kernel_size)
            )

        if not self.is_repped:
            self.lk_origin = nn.Conv2D(
                in_channels=channels,
                out_channels=channels,
                kernel_size=kernel_size,
                stride=1,
                padding=kernel_size // 2,
                groups=channels,
                bias_attr=False,
            )
            self.origin_bn = nn.BatchNorm2D(channels)

            for k, r in zip(self.kernel_sizes, self.dilates):
                equiv_ks = r * (k - 1) + 1

View on GitHub (pinned to 2661c7c0ef)

Solutions

  1. Set the block's kernel_size to one of 5, 7, 9, 11, or 13 (7 is a common default for lite models)
  2. If you truly need another size, add an explicit branch mapping (kernel_sizes, dilates) in DilatedReparamBlock

Example fix

# before
Neck:
  name: RSEFPN
  kernel_size: 3
# after
Neck:
  name: RSEFPN
  kernel_size: 7
Defensive patterns

Strategy: validation

Validate before calling

ks = neck_cfg.get('kernel_size', 7)
assert ks in (5, 7, 9, 11, 13), f'kernel_size must be in 5/7/9/11/13, got {ks}'

Type guard

def valid_reparam_kernel(k) -> bool:
    return k in (5, 7, 9, 11, 13)

Prevention

When it happens

Trigger: Configuring RSEFPN with a kernel_size outside {5,7,9,11,13}, e.g. 3 or 15, in the Neck section of a DB detection config.

Common situations: Tuning large-kernel settings by editing config yamls; switching from DilationFPN-style blocks (which allow 3) to the reparam block without updating the kernel size.

Related errors


AI-assisted analysis of PaddlePaddle/PaddleOCR@2661c7c0ef (2026-08-14). Data as JSON: /api/errors/cbc353188735b2a0. Report an issue: GitHub.