feat(simulation): add Worker AI polygon runtime and terrain navigation
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
"""Offline numeric check of the pinned GOOSE decoder on retained Worker RGB.
|
||||
|
||||
Runs in the existing pinned image, without changing its runner or checkpoint.
|
||||
This diagnoses the adapter; it is not semantic accuracy or navigation acceptance.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import csv
|
||||
import hashlib
|
||||
import importlib.util
|
||||
import json
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
import torch
|
||||
from PIL import Image
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--image", type=Path, required=True)
|
||||
parser.add_argument("--output", type=Path, required=True)
|
||||
args = parser.parse_args()
|
||||
spec = importlib.util.spec_from_file_location("reference", "/assets/ddrnet-goose-runner.py")
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(module)
|
||||
model, _, _ = module.load_model("ddrnet", Path("/assets/ddrnet-checkpoint.pth"))
|
||||
tensor, _ = module.preprocess(Image.open(args.image))
|
||||
tensor = tensor.cuda()
|
||||
with torch.inference_mode():
|
||||
logits = module.logits_from_output(model(tensor)).float()
|
||||
legacy = torch.sigmoid(logits).argmax(1)
|
||||
direct = logits.argmax(1)
|
||||
saturated = (torch.sigmoid(logits) == 1).sum(1)
|
||||
names = {}
|
||||
with open("/assets/ddrnet-goose-mapping.csv") as stream:
|
||||
names = {int(r["label_key"]): r["class_name"] for r in csv.DictReader(stream)}
|
||||
args.output.mkdir(exist_ok=True, parents=True)
|
||||
report = {
|
||||
"source_sha256": hashlib.sha256(args.image.read_bytes()).hexdigest(),
|
||||
"monotonic_ns": time.monotonic_ns(),
|
||||
"logit_range": [float(logits.min()), float(logits.max())],
|
||||
"changed_pixels": int((legacy != direct).sum()),
|
||||
"saturated_tie_pixels": int((saturated > 1).sum()),
|
||||
}
|
||||
for name, mask in (("reference", legacy), ("direct", direct)):
|
||||
mask = mask[0].cpu().numpy().astype(np.uint8)
|
||||
Image.fromarray(mask).save(args.output / (name + ".png"))
|
||||
ids, counts = np.unique(mask, return_counts=True)
|
||||
report[name] = {names[int(i)]: int(counts[index]) for index, i in enumerate(ids)}
|
||||
(args.output / "report.json").write_text(json.dumps(report, indent=2), encoding="utf-8")
|
||||
print(json.dumps(report))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user