{
  "claim": "The DA3METRIC-LARGE.onnx that the ROS 2 node runs ends at the network's two raw head outputs. There is no metric scaling in the graph, no sky fill, no camera head and no second backbone — so the focal-length conversion that turns the output into metres exists only in the wrapper's CUDA postprocess, and the transformer weights are already half precision before TensorRT ever sees them.",
  "method": "HTTP Range requests against the published file — bytes 0-41,943,039 for the full node list, plus six 1-20 MB windows deeper in the file for initializer dtypes — parsed with a hand-written protobuf walker. The 697 MiB of weight blobs were never downloaded and the model was never run.",
  "source": "https://huggingface.co/TillBeemelmanns/Depth-Anything-V3-ONNX",
  "captured": "2026-09-18",
  "columns": [
    {
      "key": "what",
      "label": "measured",
      "align": "left"
    },
    {
      "key": "value",
      "label": "value",
      "align": "right"
    },
    {
      "key": "means",
      "label": "what it settles",
      "align": "left"
    }
  ],
  "rows": [
    {
      "what": "file size, DA3METRIC-LARGE.onnx",
      "value": "731,352,693 B",
      "means": "one self-contained protobuf; graph field declares 731,352,665 B, the 28-byte difference is the model header"
    },
    {
      "what": "producer",
      "value": "pytorch 2.6.0",
      "means": "ir_version 9, graph name main_graph — a torch.onnx.export trace, matching onnx/export.py"
    },
    {
      "what": "nodes in the graph",
      "value": 1418,
      "means": "the complete node list; the initializer section begins after it"
    },
    {
      "what": "distinct op types",
      "value": 27,
      "means": "Constant, Cast, Add, MatMul, Reshape, Mul, Transpose, Gather, Sqrt, LayerNormalization, Shape, Slice, Conv, Div, Softmax, Gelu, Relu, Concat, Resize, Unsqueeze, ConvTranspose, Squeeze, ConstantOfShape, Equal, Where, Expand, Exp"
    },
    {
      "what": "Softmax nodes",
      "value": 24,
      "means": "24 attention blocks — one DINOv2 ViT-L. The nested metric model pairs this with a 40-block ViT-g plus a camera decoder and a Gaussian head; none of that is here"
    },
    {
      "what": "NonZero nodes",
      "value": 0,
      "means": "no boolean-mask indexing anywhere, so _process_mono_sky_estimation's sky fill is not in the graph"
    },
    {
      "what": "ScatterND nodes",
      "value": 0,
      "means": "nothing writes into a masked region — confirms the same thing from the other side"
    },
    {
      "what": "Sigmoid nodes",
      "value": 0,
      "means": "the sky output is not a probability, despite being thresholded at 0.3"
    },
    {
      "what": "last node in the graph",
      "value": "Reshape -> sky",
      "means": "nothing follows the head; no focal multiply, no alignment, no pose decoder"
    },
    {
      "what": "depth output chain",
      "value": "Conv -> Exp -> Squeeze -> Reshape",
      "means": "the DPT head's exp activation, so depth is strictly positive and unitless"
    },
    {
      "what": "sky output chain",
      "value": "Conv -> Relu -> Squeeze -> Reshape",
      "means": "post-ReLU, so sky >= 0 and larger means more sky — the opposite of what the README says"
    },
    {
      "what": "dtype of onnx::MatMul_* / onnx::Add_* initializers",
      "value": "FLOAT16",
      "means": "every attention and MLP weight is already fp16 in the file; precision: fp32 in the ROS param cannot recover what the export rounded away"
    },
    {
      "what": "dtype of model.model.* initializers",
      "value": "FLOAT32",
      "means": "LayerNorm, cls_token, layer-scale gammas and the DPT convolutions stayed single precision — the split autocast leaves behind"
    }
  ],
  "note": "The op counts cover the whole node list, which the 40 MB prefix contains in full: the graph's name field and the first initializers both appear inside it, and PyTorch serialises nodes before either. The dtype rows are a sample, not a census — six windows were probed (20, 100, 300, 500, 700 and 730 MB). Three of them landed inside a weight blob and held no tensor header. Of the ones that did, every model.model.* initializer was FLOAT32 (160 of them in the first 40 MB, plus the DPT head at 20 and 100 MB) and every onnx::MatMul_* / onnx::Add_* initializer was FLOAT16."
}
