{"record":{"id":"cbc353188735b2a0","repo":"PaddlePaddle/PaddleOCR","slug":"dilatedreparamblock-requires-kernel-size-in-5-7-9","errorCode":null,"errorMessage":"DilatedReparamBlock requires kernel_size in [5,7,9,11,13], but got {}","messagePattern":"DilatedReparamBlock requires kernel_size in \\[5,7,9,11,13\\], but got (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"ppocr/modeling/necks/db_fpn.py","lineNumber":592,"sourceCode":"        self.is_repped = deploy\n\n        if kernel_size == 9:\n            self.kernel_sizes = [5, 5, 3, 3]\n            self.dilates = [1, 2, 3, 4]\n        elif kernel_size == 7:\n            self.kernel_sizes = [5, 3, 3]\n            self.dilates = [1, 2, 3]\n        elif kernel_size == 5:\n            self.kernel_sizes = [3, 3]\n            self.dilates = [1, 2]\n        elif kernel_size == 11:\n            self.kernel_sizes = [5, 5, 3, 3, 3]\n            self.dilates = [1, 2, 3, 4, 5]\n        elif kernel_size == 13:\n            self.kernel_sizes = [5, 7, 3, 3, 3]\n            self.dilates = [1, 2, 3, 4, 5]\n        else:\n            raise ValueError(\n                \"DilatedReparamBlock requires kernel_size in [5,7,9,11,13], \"\n                \"but got {}\".format(kernel_size)\n            )\n\n        if not self.is_repped:\n            self.lk_origin = nn.Conv2D(\n                in_channels=channels,\n                out_channels=channels,\n                kernel_size=kernel_size,\n                stride=1,\n                padding=kernel_size // 2,\n                groups=channels,\n                bias_attr=False,\n            )\n            self.origin_bn = nn.BatchNorm2D(channels)\n\n            for k, r in zip(self.kernel_sizes, self.dilates):\n                equiv_ks = r * (k - 1) + 1","sourceCodeStart":574,"sourceCodeEnd":610,"githubUrl":"https://github.com/PaddlePaddle/PaddleOCR/blob/2661c7c0ef5c613e8f93c6e93b2e052399f0f854/ppocr/modeling/necks/db_fpn.py#L574-L610","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Set the block's kernel_size to one of 5, 7, 9, 11, or 13 (7 is a common default for lite models)","If you truly need another size, add an explicit branch mapping (kernel_sizes, dilates) in DilatedReparamBlock"],"exampleFix":"# before\nNeck:\n  name: RSEFPN\n  kernel_size: 3\n# after\nNeck:\n  name: RSEFPN\n  kernel_size: 7","handlingStrategy":"validation","validationCode":"ks = neck_cfg.get('kernel_size', 7)\nassert ks in (5, 7, 9, 11, 13), f'kernel_size must be in 5/7/9/11/13, got {ks}'","typeGuard":"def valid_reparam_kernel(k) -> bool:\n    return k in (5, 7, 9, 11, 13)","tryCatchPattern":null,"preventionTips":["Treat the kernel set as a closed enum when editing detection configs","Document allowed kernel sizes next to RSEFPN config templates"],"tags":["paddle","db-fpn","reparameterization","config"],"backgroundTag":null,"analyzedSha":"2661c7c0ef5c613e8f93c6e93b2e052399f0f854","analyzedAt":"2026-08-14T20:17:30.180Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}