Files
NODEDC_MISSION_CORE/apps/control-station/test/e46jRawFisheyeRealtime.test.mjs

170 lines
6.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import test, { after, before } from "node:test";
import { createServer } from "vite";
let server;
let fetchE46JRawFisheyeRealtime;
before(async () => {
server = await createServer({
server: { middlewareMode: true },
appType: "custom",
logLevel: "silent",
});
({ fetchE46JRawFisheyeRealtime } = await server.ssrLoadModule(
"/src/core/laboratory/e46jRawFisheyeRealtime.ts",
));
});
after(async () => {
await server?.close();
});
test("E46J binds full raw fisheye capacity to an honest visual exception", async () => {
const identity = "b".repeat(64);
const resultId = `e46j-raw-fisheye-realtime-${"a".repeat(64)}`;
const payload = {
schema_version: "missioncore.e46j-raw-fisheye-realtime-catalog/v1",
items: [{
schema_version: "missioncore.e46j-raw-fisheye-realtime-view/v1",
result_id: resultId,
created_at_utc: "2026-08-04T18:20:00.000Z",
status: "realtime-capacity-passed-awaiting-temporal-layer",
source: {
camera_source_id: "sensor.camera.right",
session_id: "20260720T065719Z_viewer_live",
resolution: [800, 600],
frame_count: 4489,
frame_rate: 10.003944527024467,
calibration_model: "KB4",
},
detector: {
architecture: "YOLOX-S",
source: "Megvii-BaseDetection/YOLOX release 0.1.1rc0",
license: "Apache-2.0",
runtime: "NVIDIA Triton 2.70.0 ONNX Runtime GPU backend",
},
detection: { minimum_score: 0.5, nms_iou_threshold: 0.45 },
metrics: {
frame_count: 4489,
failed_frame_count: 0,
detection_observation_count: 15499,
class_observation_counts: { car: 14229, person: 625, truck: 608 },
mean_detections_per_frame: 3.452662,
max_detections_per_frame: 9,
zero_detection_frame_count: 181,
longest_zero_detection_run_frames: 24,
core_capacity_fps: 47.84049,
core_path_mean_ms: 20.902796,
core_path_p95_ms: 25.355265,
inference_request_mean_ms: 12.437504,
inference_request_p95_ms: 16.414979,
gpu_utilization_mean_percent: 26.396947,
operator_shadow_window_frame_count: 75,
operator_shadow_person_frame_count: 35,
},
visual_review: {
reviewed_video_range_seconds: [0, 448.723],
verdict: "realtime-detector-progress-with-known-shadow-exception",
review_windows: [
["wall", 6, 10.9, "legacy-background-false-positive-suppressed"],
["shrub", 178.6, 180.3, "legacy-background-false-positive-suppressed"],
["ground", 250.7, 265.6, "legacy-background-false-positive-suppressed"],
["road", 392.2, 400.6, "legacy-background-false-positive-suppressed"],
["shadow", 419.4, 426.9, "operator-shadow-person-false-positive-observed"],
["terrace", 440.8, 448.4, "legacy-background-false-positive-suppressed"],
].map(([id, start, end, verdict]) => ({
id,
label: `${start}${end}`,
start_seconds: start,
end_seconds: end,
verdict,
})),
finding: "full raw fisheye retained",
known_error: "operator shadow becomes person",
},
acceptance: {
ten_hz_capacity_gate_passed: true,
latency_gate_passed: true,
full_raw_fisheye_retained: true,
},
decision: {
selected_provider: "megvii-yolox-s-0.1.1rc0",
realtime_capacity_passed: true,
ready_for_temporal_bakeoff: true,
provider_promoted: false,
next_action: "attach ready temporal tracker",
},
method: {
schema_version: "missioncore.laboratory-method/v1",
completeness: "complete",
execution_class: "hybrid",
pipeline_id: "e46j-k1-right-raw-kb4-yolox-s-one-pass/v1",
components: [{
kind: "model",
name: "YOLOX-S",
version: "0.1.1rc0",
role: "ready detector",
identity_sha256: identity,
}],
},
limitations: ["not truth", "no temporal identity"],
video: {
url: `/api/v1/laboratory/e46j/results/${resultId}/overlay.mp4`,
media_type: "video/mp4",
byte_length: 150563706,
sha256: identity,
width: 800,
height: 600,
frame_rate: 10.003944527024467,
frame_count: 4489,
duration_seconds: 448.723,
},
visuals: Object.fromEntries(
["full_route", "targeted_windows", "operator_shadow"].map((key) => [key, {
url: `/visual/${key}.png`,
media_type: "image/png",
byte_length: 1000,
sha256: identity,
}]),
),
ground_truth: false,
authority: {
ground_truth: false,
provider_promoted: false,
commands_enabled: false,
navigation_or_safety_accepted: false,
},
}],
};
const result = await fetchE46JRawFisheyeRealtime({
fetcher: async () => new Response(JSON.stringify(payload), {
status: 200,
headers: { "Content-Type": "application/json" },
}),
});
assert.equal(result.source.frameCount, 4489);
assert.equal(result.source.resolution.join("x"), "800x600");
assert.equal(result.metrics.coreCapacityFps, 47.84049);
assert.equal(result.metrics.operatorShadowPersonFrameCount, 35);
assert.equal(result.visualReview.reviewWindows.length, 6);
assert.equal(result.decision.providerPromoted, false);
assert.doesNotMatch(JSON.stringify(result), /Users|D:\\|runtime\/experiments/);
});
test("E46J uses the fixed LAB anatomy and seekable full video", async () => {
const [resultView, visual] = await Promise.all([
readFile(new URL("../src/workspaces/laboratory/E46JRawFisheyeRealtimeResult.tsx", import.meta.url), "utf8"),
readFile(new URL("../src/workspaces/laboratory/E46JRawFisheyeRealtimeVisual.tsx", import.meta.url), "utf8"),
]);
assert.match(resultView, /LaboratorySummary/);
assert.match(resultView, /LaboratoryEvidence/);
assert.match(resultView, /LaboratoryResultSummary/);
assert.match(resultView, /full raw fisheye realtime gate/);
assert.match(visual, /LaboratoryEvidenceViewer/);
assert.match(visual, /operator-shadow/);
assert.match(visual, /<video/);
assert.match(visual, /\[mode, selectedWindow\]/);
});