You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

74 lines
3.2 KiB

#!/usr/bin/env python3
"""
Compare the inputs to the BB regressor (layer2, layer3, proposals, bbox) between C++ and Python for sample 0.
Print shape, min, max, mean, and check for equality.
"""
import torch
from pathlib import Path
def extract_tensor_from_jit(jit_module):
try:
params = list(jit_module.parameters())
if params:
return params[0]
buffers = list(jit_module.buffers())
if buffers:
return buffers[0]
except Exception:
pass
return None
def print_stats(label, t1, t2):
print(f"{label}:")
print(f" C++: shape={t1.shape}, min={t1.min().item():.6f}, max={t1.max().item():.6f}, mean={t1.mean().item():.6f}")
print(f" Py: shape={t2.shape}, min={t2.min().item():.6f}, max={t2.max().item():.6f}, mean={t2.mean().item():.6f}")
if t1.shape == t2.shape:
same = torch.allclose(t1, t2, atol=1e-6)
print(f" Allclose: {same}")
print(f" Max abs diff: {(t1-t2).abs().max().item():.6f}")
else:
print(" Shapes differ!")
print()
def main():
# Directories
cpp_out = Path("test/output")
py_in = Path("test/input_samples/common")
# Sample index
idx = 0
# ResNet features (layer2, layer3)
cpp_layer2 = extract_tensor_from_jit(torch.jit.load(str(cpp_out / "resnet" / f"sample_{idx}_layer2.pt")))
cpp_layer3 = extract_tensor_from_jit(torch.jit.load(str(cpp_out / "resnet" / f"sample_{idx}_layer3.pt")))
py_layer2 = extract_tensor_from_jit(torch.jit.load(str(py_in / f"sample_{idx}_layer2.pt"))) if (py_in / f"sample_{idx}_layer2.pt").exists() else None
py_layer3 = extract_tensor_from_jit(torch.jit.load(str(py_in / f"sample_{idx}_layer3.pt"))) if (py_in / f"sample_{idx}_layer3.pt").exists() else None
# Proposals
cpp_proposals = extract_tensor_from_jit(torch.jit.load(str(cpp_out / "bb_regressor" / f"sample_{idx}_proposals.pt"))) if (cpp_out / "bb_regressor" / f"sample_{idx}_proposals.pt").exists() else None
py_proposals = extract_tensor_from_jit(torch.jit.load(str(py_in / f"sample_{idx}_proposals.pt"))) if (py_in / f"sample_{idx}_proposals.pt").exists() else None
# BBox
cpp_bb = extract_tensor_from_jit(torch.jit.load(str(cpp_out / "bb_regressor" / f"sample_{idx}_bb.pt"))) if (cpp_out / "bb_regressor" / f"sample_{idx}_bb.pt").exists() else None
py_bb = extract_tensor_from_jit(torch.jit.load(str(py_in / f"sample_{idx}_bb.pt"))) if (py_in / f"sample_{idx}_bb.pt").exists() else None
print("=== BB Regressor Input Comparison (Sample 0) ===\n")
if cpp_layer2 is not None and py_layer2 is not None:
print_stats("Layer2", cpp_layer2, py_layer2)
else:
print("Layer2: Could not load both tensors\n")
if cpp_layer3 is not None and py_layer3 is not None:
print_stats("Layer3", cpp_layer3, py_layer3)
else:
print("Layer3: Could not load both tensors\n")
if cpp_proposals is not None and py_proposals is not None:
print_stats("Proposals", cpp_proposals, py_proposals)
else:
print("Proposals: Could not load both tensors\n")
if cpp_bb is not None and py_bb is not None:
print_stats("BBox", cpp_bb, py_bb)
else:
print("BBox: Could not load both tensors\n")
if __name__ == "__main__":
main()