Windows本地运行Detectron2报PyTorch配置路径无效错误咨询
问题描述
本地运行表格检测代码,安装完所有依赖包后,执行以下代码加载基于PubLayNet训练的Detectron2布局检测模型:
import layoutparser as lp # 加载PubLayNet预训练模型 model = lp.Detectron2LayoutModel( 'lp://PubLayNet/faster_rcnn_R_50_FPN_3x/config', extra_config=["MODEL.ROI_HEADS.SCORE_THRESH_TEST", 0.81], label_map={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"} )
运行后触发报错:
OSError: [Errno 22] Invalid argument: 'C:\\Users\\username/.torch/iopath_cache\\s/f3b12qc4hc0yh4m\\config.yml?dl=1.lock'
检查对应缓存目录后发现目录内不存在config.yml配置文件,尝试从layoutparser官方模型库手动下载配置文件放入对应目录后,问题仍未解决。
报错原因
该问题是Windows平台下的路径兼容bug:iopath缓存模块处理模型下载链接时,没有过滤掉URL末尾的?dl=1参数,直接将带参数的字符串拼接到了缓存文件名中,而Windows系统不允许文件名包含?这类特殊字符,因此触发参数非法错误。
手动放置配置文件无法解决问题的原因是,缓存逻辑启动时仍会尝试生成带非法字符的.lock锁文件,路径校验阶段就会直接报错,不会走到读取本地配置文件的步骤。
排查解决方法
- 方案1:直接加载本地模型文件,跳过自动下载逻辑
提前将对应版本的模型config配置文件、权重文件下载到本地无特殊字符、无中文的路径下,初始化模型时直接传入本地文件路径即可,示例代码:import layoutparser as lp # 替换为本地实际存放配置、权重文件的路径 local_config_path = r"D:\layoutparser_models\faster_rcnn_R_50_FPN_3x\config.yml" local_model_weight_path = r"D:\layoutparser_models\faster_rcnn_R_50_FPN_3x\model_final.pth" model = lp.Detectron2LayoutModel( local_config_path, model_path=local_model_weight_path, extra_config=["MODEL.ROI_HEADS.SCORE_THRESH_TEST", 0.81], label_map={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"} ) - 方案2:修改iopath源码过滤非法文件名字符
打开当前Python环境对应iopath安装目录下的common/download.py文件,找到生成缓存文件名的代码段,在文件名赋值逻辑后新增一行截断URL参数的代码:
保存修改后重新运行加载模型的代码,自动下载逻辑会生成符合Windows命名规范的缓存文件,即可正常完成模型下载和加载。# 过滤URL中?及后续的查询参数,避免文件名包含非法字符 file_name = file_name.split("?")[0] - 方案3:升级依赖包到修复版本
执行命令升级iopath和layoutparser到最新版本,新版依赖已经修复了Windows平台下URL参数导致的缓存文件名非法问题,升级后无需额外修改即可直接运行原代码:pip install --upgrade iopath layoutparser
内容的提问来源于stack exchange,提问作者CFD
相关产品推荐
相关产品推荐

