twanghcmut's picture
|
download
raw
3.86 kB

HOW TO READ A SCORE

Traceability. Every JSON record is keyed by video = a dataset-relative path, e.g. dense/single_arm/output/multiview/ctrlworld/makovian/episode_000255/pred_all_views.mp4. That is the exact path in the source dataset doanh25032004/video_gen_physics — join a score straight back to its clip by that string. No absolute/machine paths appear anywhere. traces.npz arrays are keyed <clip_id>/<metric>; traces_index.jsonl maps video → clip_id.

Two levels. Start at the top; drop down only when you want detail.

1. The readable score — scored.jsonl (one record per clip)

This is the file to read. Each line is one generated clip with a 1–5 severity and the exact frames that go wrong. You do not need to understand the 31 raw metrics for this.

{
  "episode": "episode_010407",
  "physics_severity": 5,          // 1 clean · 2 minor · 3 noticeable · 4 severe · 5 broken
  "verdict": "broken",
  "headline": "joint_limit",       // which failure dominates this clip
  "severity_by_metric": { "jerk": 4, "rigidity": 3, "joint_limit": 5, "teleport": 1 },
  "values": { "jerk_mps3": 31.5, "rigidity_worst_bone_mm": 17.8,
              "limit_violation_frac": 0.72, "no_teleport_frac": 0.0 },
  "n_violation_events": 23,
  "violations": [                  // the "tập violate" — [frameA, frameB] ranges
    {"metric": "jerk", "frames": [19, 31], "peak_frame": 28, "peak_val": 91.4, "severity": 5},
    {"metric": "rigidity", "frames": [40, 44], "peak_frame": 41, "peak_val": 26.0, "severity": 4}
  ]
}

Read it as: "clip is broken (5); the dominant problem is joint_limit (joints exceed the URDF limits in 72% of frames); on top of that there are 23 motion-glitch events — the worst is a jerk spike peaking at frame 28. Frames 19–31 and 40–44 are where it visibly goes wrong." That answers "which frames hallucinate, and how badly."

How severity is set (the "1..5, scale later" the ask called for — thresholds are in read_score.py, change them and re-run to rescale):

  • jerk — ratio vs the same cell's GT median jerk (band_jerk_mps3_from_gt in the summary): <1×→1, <1.5×→2, <2×→3, <3×→4, ≥3×→5. GT is the healthy reference, so this is "how much jerkier than real".
  • rigidity (worst-bone mm): <5→1, <10→2, <20→3, <35→4, ≥35→5 (arm stretching / rubber-band).
  • joint_limit (fraction of frames a joint is past its URDF limit): 0→1, <0.05→2, <0.15→3, <0.30→4, ≥0.30→5.
  • teleport (fraction of frames with a physically impossible jump): 0→1 … ≥0.1→5.
  • physics_severity = max of the above (one bad axis is enough to break a clip).

2. The cell rollup — score_summary.json (one per cell)

{ "band_jerk_mps3_from_gt": 13.2, "n_clips": 128, "median_severity": 2,
  "severity_histogram": {"1":34,"2":52,"3":29,"4":12,"5":1}, "pct_with_violation": 99.2,
  "worst_5": [ {"episode":"episode_010407","severity":5,"headline":"joint_limit","n_violations":23}, ... ] }

severity_histogram = how many clips at each level; worst_5 = go look at these first.

3. Raw numbers, if you need them

  • results.jsonl — all 31 metric scalars per clip (null = not measured, never 0). See METHODS.md.
  • traces.npz — per-frame arrays keyed <clip_id>/<metric>; traces_index.jsonl maps clip path → clip_id. This is what violations are extracted from.

Quick start

import json
rows = [json.loads(l) for l in open("dense/single_arm/output/multiview/ctrlworld/makovian/pred/scored.jsonl")]
broken = [r for r in rows if r["physics_severity"] >= 4]           # the bad clips
for r in sorted(broken, key=lambda r: -r["physics_severity"]):
    print(r["episode"], r["verdict"], r["headline"], "frames:", [v["frames"] for v in r["violations"][:3]])

Xet Storage Details

Size:
3.86 kB
·
Xet hash:
c3040cf4674ad9898a9f7cfe4a69d300523a8abdc18b49bccae7378535539863

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.