在转化paddleocrv5的det模型时遇到此问题。[问题版本]在这里(https://blog.csdn.net/m0_52113979/article/details/163163417?spm=1001.2014.3001.5501),建议用兼容的CPU版本转化
原因分析
Paddle2ONNX 在新版 PaddlePaddle(3.x)下解析 PIR 格式的模型时遇到了不支持的 attribute 类型。nearest_interp 的 scale 属性是 a_f64 类型(“#”: “0.a_f64”),而 Paddle2ONNX 期望的是 a_f32(FloatAttribute)。
Op 572 (1.nearest_interp): A[scale] = array, [0] type = 0.a_f64, val = {'#': '0.a_f64', 'D': 2.0} Op 574 (1.nearest_interp): A[scale] = array, [0] type = 0.a_f64, val = {'#': '0.a_f64', 'D': 2.0} Op 576 (1.nearest_interp): A[scale] = array, [0] type = 0.a_f64, val = {'#': '0.a_f64', 'D': 2.0}解决方案:
手动将a_f64转化为a_f32格式,代码由AI提供
这次做了检查,可以正常推理
""" 将 a_f64 改为 a_f32,保持值不变 """importjsonimportosimportshutil model_path="addleOCR-main\\output\\PP-OCRv5_mobile_det\\best_model\\inference.json"backup_path=model_path+".bak"# 备份shutil.copy2(model_path,backup_path)print(f"已备份到:{backup_path}")withopen(model_path,"r",encoding="utf-8")asf:data=json.load(f)ops=data["program"]["regions"][0]["blocks"][0]["ops"]changes=[]fori,opinenumerate(ops):if"A"notinop:continueattrs=op["A"]forattr_entryinattrs:ifnotisinstance(attr_entry,dict)or"AT"notinattr_entry:continueat=attr_entry["AT"]ifnotisinstance(at,dict):continue# 1. a_f64 -> a_f32 (保持数值)ifat.get("#")=="0.a_f64":old_val=at["D"]at["#"]="0.a_f32"op_name=op.get("#","?")attr_name=attr_entry.get("N","?")changes.append(f"Op{i}({op_name}):{attr_name}a_f64={old_val}-> a_f32={old_val}")# 2. a_array 中的子元素类型也需要检查ifat.get("#")=="0.a_array":vals=at.get("D",[])forj,vinenumerate(vals):ifisinstance(v,dict)andv.get("#")=="0.a_f64":old_val=v["D"]v["#"]="0.a_f32"op_name=op.get("#","?")attr_name=attr_entry.get("N","?")changes.append(f"Op{i}({op_name}):{attr_name}[{j}] a_f64={old_val}-> a_f32={old_val}")print(f"\n共修改{len(changes)}处:")forcinchanges:print(f"{c}")# 保存withopen(model_path,"w",encoding="utf-8")asf:json.dump(data,f,ensure_ascii=False)print(f"\n已保存修改到:{model_path}")