{"record":{"id":"1992d7d152c13eef","repo":"open-mmlab/mmdetection","slug":"grid-points-must-be-a-square-number","errorCode":null,"errorMessage":"grid_points must be a square number","messagePattern":"grid_points must be a square number","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mmdet/models/roi_heads/mask_heads/grid_head.py","lineNumber":88,"sourceCode":"    ) -> None:\n        super().__init__(init_cfg=init_cfg)\n        self.grid_points = grid_points\n        self.num_convs = num_convs\n        self.roi_feat_size = roi_feat_size\n        self.in_channels = in_channels\n        self.conv_kernel_size = conv_kernel_size\n        self.point_feat_channels = point_feat_channels\n        self.conv_out_channels = self.point_feat_channels * self.grid_points\n        self.class_agnostic = class_agnostic\n        self.conv_cfg = conv_cfg\n        self.norm_cfg = norm_cfg\n        if isinstance(norm_cfg, dict) and norm_cfg['type'] == 'GN':\n            assert self.conv_out_channels % norm_cfg['num_groups'] == 0\n\n        assert self.grid_points >= 4\n        self.grid_size = int(np.sqrt(self.grid_points))\n        if self.grid_size * self.grid_size != self.grid_points:\n            raise ValueError('grid_points must be a square number')\n\n        # the predicted heatmap is half of whole_map_size\n        if not isinstance(self.roi_feat_size, int):\n            raise ValueError('Only square RoIs are supporeted in Grid R-CNN')\n        self.whole_map_size = self.roi_feat_size * 4\n\n        # compute point-wise sub-regions\n        self.sub_regions = self.calc_sub_regions()\n\n        self.convs = []\n        for i in range(self.num_convs):\n            in_channels = (\n                self.in_channels if i == 0 else self.conv_out_channels)\n            stride = 2 if i == 0 else 1\n            padding = (self.conv_kernel_size - 1) // 2\n            self.convs.append(\n                ConvModule(\n                    in_channels,","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/models/roi_heads/mask_heads/grid_head.py#L70-L106","documentation":"GridHead computes an integer grid_size = sqrt(grid_points) and requires grid_points to be a perfect square (>=4), e.g. 9 for a 3x3 grid. A non-square value like 8 or 12 raises ValueError in __init__.","triggerScenarios":"grid_head=dict(type='GridHead', grid_points=8) or any grid_points whose sqrt truncation does not multiply back to itself.","commonSituations":"Tuning Grid R-CNN density parameters without knowing the square-number constraint; configs ported from papers using non-square grids.","solutions":["Use a perfect square >= 4: 4, 9, 16, 25 (default is 9)","Adjust grid coverage via other params (e.g. num_convs, roi_feat_size) instead of non-square point counts"],"exampleFix":"# before\ngrid_head=dict(type='GridHead', grid_points=12)\n# after\ngrid_head=dict(type='GridHead', grid_points=9)","handlingStrategy":"validation","validationCode":"import math\nn = cfg['grid_points']; assert math.isqrt(n) ** 2 == n and n >= 4","typeGuard":"def is_square_ge4(n: int) -> bool: import math; r = math.isqrt(n); return r*r == n and n >= 4","tryCatchPattern":null,"preventionTips":["Use default grid_points=9","When tuning, pick from 4/9/16/25"],"tags":["mmdetection","grid-head","config"],"backgroundTag":"invalid-config-value","analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}