{"record":{"id":"d1ec99ed3a701f71","repo":"open-mmlab/mmdetection","slug":"num-branches-num-branches-num-inchannels-le","errorCode":null,"errorMessage":"NUM_BRANCHES({num_branches}) != NUM_INCHANNELS({len(in_channels)})","messagePattern":"NUM_BRANCHES\\((.+?)\\) != NUM_INCHANNELS\\((.+?)\\)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mmdet/models/backbones/hrnet.py","lineNumber":64,"sourceCode":"        self.fuse_layers = self._make_fuse_layers()\n        self.relu = nn.ReLU(inplace=False)\n\n    def _check_branches(self, num_branches, num_blocks, in_channels,\n                        num_channels):\n        if num_branches != len(num_blocks):\n            error_msg = f'NUM_BRANCHES({num_branches}) ' \\\n                        f'!= NUM_BLOCKS({len(num_blocks)})'\n            raise ValueError(error_msg)\n\n        if num_branches != len(num_channels):\n            error_msg = f'NUM_BRANCHES({num_branches}) ' \\\n                        f'!= NUM_CHANNELS({len(num_channels)})'\n            raise ValueError(error_msg)\n\n        if num_branches != len(in_channels):\n            error_msg = f'NUM_BRANCHES({num_branches}) ' \\\n                        f'!= NUM_INCHANNELS({len(in_channels)})'\n            raise ValueError(error_msg)\n\n    def _make_one_branch(self,\n                         branch_index,\n                         block,\n                         num_blocks,\n                         num_channels,\n                         stride=1):\n        downsample = None\n        if stride != 1 or \\\n                self.in_channels[branch_index] != \\\n                num_channels[branch_index] * block.expansion:\n            downsample = nn.Sequential(\n                build_conv_layer(\n                    self.conv_cfg,\n                    self.in_channels[branch_index],\n                    num_channels[branch_index] * block.expansion,\n                    kernel_size=1,\n                    stride=stride,","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/models/backbones/hrnet.py#L46-L82","documentation":"The third HRNet branch check: len(in_channels) must equal num_branches, since in_channels lists the input channel count feeding each branch of the stage. Mismatch raises ValueError naming NUM_INCHANNELS.","triggerScenarios":"num_branches=4 with in_channels=[32,64,128] (len 3); stage2 in_channels not matching stage1's num_channels output; hand-editing multi-stage extra dicts.","commonSituations":"Changing an earlier stage's num_channels without updating the next stage's in_channels; building HRNet from scratch instead of from a reference config.","solutions":["Set in_channels of stageN equal (as a list) to num_channels of stage(N-1), and its length equal to num_branches","Cross-check every stage dict: num_branches, num_blocks, num_channels, in_channels lengths must all agree","Start from an official HRNet config and adjust widths consistently across stages"],"exampleFix":"# before\nstage2=dict(num_branches=2, num_blocks=[4,4], num_channels=[48,96], in_channels=[64])\n# after\nstage2=dict(num_branches=2, num_blocks=[4,4], num_channels=[48,96], in_channels=[64,128])","handlingStrategy":"validation","validationCode":"stages = list(extra.values())\nfor prev, cur in zip(stages, stages[1:]):\n    assert cur['num_branches'] == len(cur['in_channels']) == len(prev['num_channels'])","typeGuard":"def inchannels_ok(stage: dict) -> bool:\n    return stage['num_branches'] == len(stage['in_channels'])","tryCatchPattern":null,"preventionTips":["Set stageN in_channels = stage(N-1) num_channels","Never edit one stage's widths in isolation","Chain in_channels/num_channels across stages"],"tags":["mmdet","hrnet","backbone","config-validation"],"backgroundTag":null,"analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}