Download local_test.py from Phoenix-95107/test: direct link, hf CLI and curl.
- Browser
- Download file 3.55 kB
-
https://huggingface.co/Phoenix-95107/test/resolve/main/local_test.py
- Command line
-
hf download hf://Phoenix-95107/test/local_test.py
-
curl -L -o local_test.py https://huggingface.co/Phoenix-95107/test/resolve/main/local_test.py
3.55 kB
| """Pre-deploy check for the public Detect-Vehicle path. | |
| Mirrors the parts of the validator that reject a repo before score matters: | |
| an ONNX-only tree under 30 MB, and one 1024 frame through predict_batch | |
| with ONNX Runtime pinned to 2 threads. The checker budget is 100 ms | |
| (plus 10 ms tolerance). This script fails at 100 ms. | |
| """ | |
| from __future__ import annotations | |
| import sys | |
| import time | |
| from pathlib import Path | |
| import cv2 | |
| from miner import Miner | |
| ROOT = Path(__file__).resolve().parent | |
| MAX_REPO_BYTES = 30 * 1024 * 1024 | |
| LATENCY_MS = 100.0 | |
| # compliance.py uses the 80th percentile and names it p95. | |
| LATENCY_PERCENTILE = 0.80 | |
| N_KEYPOINTS = 32 | |
| ALLOWED_SUFFIXES = {".onnx", ".py", ".json", ".txt", ".md", ".yml", ".yaml", ".labels", ".csv"} | |
| DISALLOWED_SUFFIXES = {".so", ".dylib", ".dll", ".exe", ".bin", ".pt", ".pth", ".ckpt", ".safetensors"} | |
| SAMPLE = ( | |
| ROOT.parent | |
| / "challenge_data" | |
| / "Detect-Vehicle" | |
| / "challenges" | |
| / "block_009194700_task_85697" | |
| / "frame_0.png" | |
| ) | |
| NAMES = {0: "car", 1: "bus", 2: "truck", 3: "motorcycle", 4: "van"} | |
| def _check_repo() -> None: | |
| total = 0 | |
| onnx_count = 0 | |
| for path in ROOT.rglob("*"): | |
| if not path.is_file(): | |
| continue | |
| if "__pycache__" in path.parts or path.suffix.lower() == ".pyc": | |
| continue | |
| suffix = path.suffix.lower() | |
| total += path.stat().st_size | |
| if suffix == ".onnx": | |
| onnx_count += 1 | |
| if suffix in DISALLOWED_SUFFIXES: | |
| raise SystemExit(f"disallowed file for the HF repo: {path.name}") | |
| if suffix and suffix not in ALLOWED_SUFFIXES: | |
| raise SystemExit(f"unsupported file for the HF repo: {path.name}") | |
| if onnx_count < 1: | |
| raise SystemExit("no ONNX weights in the miner directory") | |
| if total > MAX_REPO_BYTES: | |
| raise SystemExit(f"repo is {total} bytes, limit is {MAX_REPO_BYTES}") | |
| print(f"repo: {total / 1e6:.1f} MB, onnx files {onnx_count}") | |
| def _percentile(samples: list[float]) -> float: | |
| ordered = sorted(samples) | |
| index = min(len(ordered) - 1, max(0, int(LATENCY_PERCENTILE * (len(ordered) - 1)))) | |
| return ordered[index] | |
| def main() -> None: | |
| _check_repo() | |
| frame = cv2.imread(str(SAMPLE)) | |
| if frame is None or frame.shape[0] != 1024 or frame.shape[1] != 1024: | |
| raise SystemExit(f"expected a 1024x1024 challenge frame at {SAMPLE}") | |
| miner = Miner(ROOT) | |
| print(miner) | |
| for _ in range(3): | |
| miner.predict_batch([frame], offset=0, n_keypoints=N_KEYPOINTS) | |
| times_ms: list[float] = [] | |
| last = None | |
| for _ in range(15): | |
| started = time.perf_counter() | |
| last = miner.predict_batch([frame], offset=0, n_keypoints=N_KEYPOINTS) | |
| times_ms.append((time.perf_counter() - started) * 1000) | |
| if last is None: | |
| raise SystemExit("no prediction") | |
| latency = _percentile(times_ms) | |
| boxes = last[0].boxes or [] | |
| print(f"1024 frame, network {miner.input_width}: p80 {latency:.1f} ms, boxes {len(boxes)}") | |
| for box in boxes[:8]: | |
| print( | |
| f" cls={NAMES.get(box.cls_id, box.cls_id)} conf={box.conf:.2f} " | |
| f"[{box.x1},{box.y1},{box.x2},{box.y2}]" | |
| ) | |
| if latency > LATENCY_MS: | |
| raise SystemExit(f"latency {latency:.1f} ms exceeds {LATENCY_MS:.0f} ms") | |
| print("OK — repo and latency match the public checker") | |
| if __name__ == "__main__": | |
| try: | |
| main() | |
| except SystemExit: | |
| raise | |
| except Exception as exc: | |
| print(f"FAILED: {exc}", file=sys.stderr) | |
| raise SystemExit(1) from exc | |