ONNX 文件本质上是一个 Protobuf 序列化的模型描述,包含两大部分:计算图结构 和 权重数据。
.onnx 里面还有什么:
- 完整的计算图(graph)——所有节点(Conv、BatchNorm、Relu、Add 等算子)、它们的连接关系、执行顺序。也就是网络的"骨架"。
- 输入/输出定义——张量名字、形状、数据类型(比如
input: float32[1,3,150,150])。 - 每个权重张量的"占位符"(initializer 元数据)——权重的名字、形状、类型都还在,但实际数值被替换成了一个外部引用,大概长这样:
external_data {
key: "location" value: "dlib_face_recognition.onnx.data"
key: "offset" value: "0"
key: "length" value: "1179648"
}
也就是说它记录的是"这个权重去 xxx.onnx.data 文件的第几个字节、读多长",而不是权重本身。这就是为什么你的 .onnx 文件会比预期小很多(可能只有几百 KB,而完整模型应该有 20MB 左右)——你可以 ls -lh 对比一下大小验证。
可以使用吗?
分情况:
- 推理 / 转 TensorRT 引擎:❌ 不行。没有权重数值,网络就是个空壳,任何 runtime(TensorRT、ONNX Runtime)加载时都会像你日志里那样报错。
- 查看网络结构:✅ 可以。用 Netron 打开它,可以正常看到完整的网络拓扑、每层的参数形状——因为这些元数据都在。这对确认模型结构是有用的。
onnx.load()部分加载:✅ 用onnx.load("xxx.onnx", load_external_data=False)可以加载图做结构分析、shape 推断等,但权重张量是空的。
结论:这个文件不能单独完成你的任务,必须找到配套的 .data 文件。回到你导出模型的那台机器,.data 文件应该就躺在 .onnx 旁边——把它一起拷到 Orin 的同一目录下,trtexec 就能正常构建引擎了。
评论
0