ONNX 格式

ONNX 文件本质上是一个 Protobuf 序列化的模型描述,包含两大部分:计算图结构 和 权重数据。 .onnx 里面还有什么: 1. 完整的计算图(graph)——所有节点(Conv、BatchNorm、Relu、Add 等算子)、它们的连接关系、执行顺序。也就是网络的"骨架"。 2. 输入/

ONNX 文件本质上是一个 Protobuf 序列化的模型描述,包含两大部分:计算图结构权重数据

.onnx 里面还有什么:

  1. 完整的计算图(graph)——所有节点(Conv、BatchNorm、Relu、Add 等算子)、它们的连接关系、执行顺序。也就是网络的"骨架"。
  2. 输入/输出定义——张量名字、形状、数据类型(比如 input: float32[1,3,150,150])。
  3. 每个权重张量的"占位符"(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
还没有评论, 抢首楼