{"record":{"id":"f7393e3ea8b4f5e8","repo":"opendatalab/MinerU","slug":"pplcnetv4-mode-model-size-must-be-one-of-list-c","errorCode":null,"errorMessage":"PPLCNetV4 {mode} model_size must be one of {list(config_dict)}, got {model_size}.","messagePattern":"PPLCNetV4 (.+?) model_size must be one of (.+?), got (.+?)\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mineru/model/utils/pytorchocr/modeling/backbones/rec_lcnetv4.py","lineNumber":295,"sourceCode":"        for block in self.blocks:\n            hidden_states = block(hidden_states)\n            feature_maps.append(hidden_states)\n        return feature_maps\n\n\nclass PPLCNetV4(nn.Module):\n    \"\"\"PP-OCRv6 使用的 PPLCNetV4 backbone，支持 det small 和 rec small/medium。\"\"\"\n\n    def __init__(self, det=False, model_size=\"small\", in_channels=3, **kwargs):\n        \"\"\"按 det/rec 模式选择 v6 的固定网络配置。\"\"\"\n        super().__init__()\n        self.det = det\n        if in_channels != 3:\n            raise ValueError(f\"PPLCNetV4 only supports 3 input channels, got {in_channels}.\")\n        config_dict = NET_CONFIG_DET if det else NET_CONFIG_REC\n        if model_size not in config_dict:\n            mode = \"det\" if det else \"rec\"\n            raise ValueError(f\"PPLCNetV4 {mode} model_size must be one of {list(config_dict)}, got {model_size}.\")\n        config = config_dict[model_size]\n        self.encoder = PPLCNetV4Encoder(config[\"stem_channels\"], config[\"block_configs\"])\n        stage_out_channels = [stage[-1][2] for stage in config[\"block_configs\"]]\n        self.out_channels = stage_out_channels if det else stage_out_channels[-1]\n\n    def forward(self, x):\n        \"\"\"det 返回四级特征列表，rec 返回高度池化后的识别特征。\"\"\"\n        feature_maps = self.encoder(x)\n        if self.det:\n            return feature_maps\n        x = feature_maps[-1]\n        if self.training:\n            return F.adaptive_avg_pool2d(x, [1, 40])\n        if x.shape[2] < 3:\n            raise ValueError(f\"Feature height {x.shape[2]} < pool kernel 3.\")\n        return F.avg_pool2d(x, [3, 2])\n","sourceCodeStart":277,"sourceCodeEnd":312,"githubUrl":"https://github.com/opendatalab/MinerU/blob/4fe4bde114a23ee5dd637eae99b767f4669bf58c/mineru/model/utils/pytorchocr/modeling/backbones/rec_lcnetv4.py#L277-L312","documentation":"Raised by PPLCNetV4.__init__ when model_size is not a key of the mode's config table: NET_CONFIG_DET (det mode) or NET_CONFIG_REC (rec mode, typically small/medium). It disambiguates det vs rec in the message so you know which table rejected the value.","triggerScenarios":"Constructing the rec backbone with model_size='large' if only small/medium exist for rec; using det-only sizes in rec mode or vice versa; typos like 'Small'.","commonSituations":"Sharing one model_size across det and rec v6 components; porting configs between det and rec YAMLs; case mismatches.","solutions":["Read the message: it lists the valid sizes for the current det/rec mode — pick one of those.","Use separate model_size settings for the det and rec v6 models.","Check case sensitivity: use lowercase sizes."],"exampleFix":"# before\nPPLCNetV4(det=False, model_size=\"large\")\n\n# after\nPPLCNetV4(det=False, model_size=\"medium\")","handlingStrategy":"validation","validationCode":"valid = list(NET_CONFIG_DET if det else NET_CONFIG_REC)\nassert model_size in valid, f\"model_size must be one of {valid}, got {model_size!r}\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep det and rec model_size settings separate","Use lowercase model_size strings"],"tags":["ocr","backbone","lcnet","model-size","config","valueerror"],"backgroundTag":null,"analyzedSha":"4fe4bde114a23ee5dd637eae99b767f4669bf58c","analyzedAt":"2026-08-14T21:29:18.456Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}