Spaces:
Running
Running
ui/ux enhancements..
Browse files- backend/server.py +2 -0
- backend/visualize.py +12 -6
- frontend/vehicles.html +91 -27
backend/server.py
CHANGED
|
@@ -253,6 +253,8 @@ async def ws_run(ws: WebSocket):
|
|
| 253 |
"pixels": cfg.get("pixels", 0),
|
| 254 |
}
|
| 255 |
result["engine_config"] = cfg
|
|
|
|
|
|
|
| 256 |
run_results[video_id] = result
|
| 257 |
await ws.send_text(json.dumps({
|
| 258 |
"done": True,
|
|
|
|
| 253 |
"pixels": cfg.get("pixels", 0),
|
| 254 |
}
|
| 255 |
result["engine_config"] = cfg
|
| 256 |
+
result["export_json"] = data.get("export_json", False)
|
| 257 |
+
result["export_csv"] = data.get("export_csv", False)
|
| 258 |
run_results[video_id] = result
|
| 259 |
await ws.send_text(json.dumps({
|
| 260 |
"done": True,
|
backend/visualize.py
CHANGED
|
@@ -236,22 +236,28 @@ def generate_all(data, model_classes, out_dir, report_format="png"):
|
|
| 236 |
heatmap_points = data.get("heatmap_points", [])
|
| 237 |
raw_events = data.get("raw_events", [])
|
| 238 |
|
| 239 |
-
|
| 240 |
-
for fn in [
|
| 241 |
lambda: direction_pie(total_in, total_out, out_dir, fmt),
|
| 242 |
lambda: flow_histogram(data.get("flow_times", []), out_dir, fmt),
|
| 243 |
lambda: congestion_chart(data.get("congestion", []), out_dir, fmt),
|
| 244 |
lambda: class_dominance(data["class_in"], data["class_out"], model_classes, out_dir, fmt),
|
| 245 |
lambda: confidence_dist(data.get("conf_scores", []), out_dir, fmt),
|
| 246 |
lambda: spatial_heatmap(heatmap_points, video_path, out_dir, fmt),
|
| 247 |
-
|
| 248 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 249 |
data,
|
| 250 |
data.get("video_meta", {}),
|
| 251 |
data.get("engine_config", {}),
|
| 252 |
out_dir,
|
| 253 |
-
)
|
| 254 |
-
|
|
|
|
|
|
|
| 255 |
name = fn()
|
| 256 |
if name:
|
| 257 |
files.append(name)
|
|
|
|
| 236 |
heatmap_points = data.get("heatmap_points", [])
|
| 237 |
raw_events = data.get("raw_events", [])
|
| 238 |
|
| 239 |
+
tasks = [
|
|
|
|
| 240 |
lambda: direction_pie(total_in, total_out, out_dir, fmt),
|
| 241 |
lambda: flow_histogram(data.get("flow_times", []), out_dir, fmt),
|
| 242 |
lambda: congestion_chart(data.get("congestion", []), out_dir, fmt),
|
| 243 |
lambda: class_dominance(data["class_in"], data["class_out"], model_classes, out_dir, fmt),
|
| 244 |
lambda: confidence_dist(data.get("conf_scores", []), out_dir, fmt),
|
| 245 |
lambda: spatial_heatmap(heatmap_points, video_path, out_dir, fmt),
|
| 246 |
+
]
|
| 247 |
+
|
| 248 |
+
if data.get("export_csv", False):
|
| 249 |
+
tasks.append(lambda: export_csv(raw_events, out_dir))
|
| 250 |
+
|
| 251 |
+
if data.get("export_json", False):
|
| 252 |
+
tasks.append(lambda: export_json(
|
| 253 |
data,
|
| 254 |
data.get("video_meta", {}),
|
| 255 |
data.get("engine_config", {}),
|
| 256 |
out_dir,
|
| 257 |
+
))
|
| 258 |
+
|
| 259 |
+
files = []
|
| 260 |
+
for fn in tasks:
|
| 261 |
name = fn()
|
| 262 |
if name:
|
| 263 |
files.append(name)
|
frontend/vehicles.html
CHANGED
|
@@ -467,8 +467,7 @@
|
|
| 467 |
class="text-[10px] font-bold uppercase tracking-widest transition w-full text-center py-1 rounded"
|
| 468 |
style="color:#a89f97" onmouseover="this.style.color='#c89a6c'"
|
| 469 |
onmouseout="this.style.color='#a89f97'">Terms & Conditions</button>
|
| 470 |
-
<p class="text-[9px] mt-1" style="color:#333">© 2026 UrbanFlow</p>
|
| 471 |
-
<p class="text-[8px] mt-0.5" style="color:#222" title="Keyboard shortcuts: 1-6 switch tabs, D downloads artifacts">⌨ Press 1-6 for tabs, D for download</p>
|
| 472 |
</div>
|
| 473 |
</aside>
|
| 474 |
|
|
@@ -740,9 +739,12 @@
|
|
| 740 |
class="text-[10px] text-slate-400 mt-0.5 uppercase tracking-widest font-medium text-center">
|
| 741 |
Execution Telemetry</p>
|
| 742 |
</div>
|
| 743 |
-
<div
|
| 744 |
-
class="px-
|
| 745 |
-
<div
|
|
|
|
|
|
|
|
|
|
| 746 |
</div>
|
| 747 |
</div>
|
| 748 |
<div class="p-8">
|
|
@@ -817,6 +819,10 @@
|
|
| 817 |
|
| 818 |
<!-- TAB: Reports -->
|
| 819 |
<div id="tab-reports" class="hidden flex-1 min-h-0 overflow-y-auto">
|
|
|
|
|
|
|
|
|
|
|
|
|
| 820 |
<div id="reports-pending" class="grid grid-cols-2 xl:grid-cols-3 gap-4 w-full">
|
| 821 |
<!-- Skeleton Loader 1 -->
|
| 822 |
<div class="bg-[#0a0a0a] rounded-xl border border-[#222] shadow-sm flex flex-col overflow-hidden animate-pulse">
|
|
@@ -887,9 +893,9 @@
|
|
| 887 |
|
| 888 |
<!-- TAB: Settings -->
|
| 889 |
<div id="tab-settings" class="hidden flex-1 min-h-0 overflow-y-auto">
|
| 890 |
-
<div class="grid grid-cols-
|
| 891 |
<!-- Processing Parameters -->
|
| 892 |
-
<div class="col-span-
|
| 893 |
<div class="px-6 py-4 border-b border-slate-100 bg-slate-50/50">
|
| 894 |
<h3 class="font-bold text-slate-800 text-sm flex items-center">Inference Configuration Profile
|
| 895 |
<span class="info-wrap">
|
|
@@ -1016,13 +1022,41 @@
|
|
| 1016 |
</div>
|
| 1017 |
</div>
|
| 1018 |
|
| 1019 |
-
<!--
|
| 1020 |
<div
|
| 1021 |
class="col-span-1 bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden flex flex-col">
|
| 1022 |
<div class="px-5 py-3 border-b border-slate-100 bg-slate-50/50">
|
| 1023 |
-
<h3 class="font-bold text-slate-800 text-sm">
|
| 1024 |
</div>
|
| 1025 |
<div class="px-5 py-4 flex-1 flex flex-col">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1026 |
<div class="s-row">
|
| 1027 |
<div>
|
| 1028 |
<div class="text-xs font-semibold text-slate-700 flex items-center">Auto-Download Report
|
|
@@ -1070,43 +1104,57 @@
|
|
| 1070 |
|
| 1071 |
<!-- TAB: Feedback -->
|
| 1072 |
<div id="tab-feedback" class="hidden flex-1 min-h-0 overflow-y-auto" style="padding:16px">
|
| 1073 |
-
<div class="max-w-
|
| 1074 |
<div class="bg-black border border-slate-800 rounded-xl p-8 shadow-2xl space-y-6">
|
| 1075 |
<div class="text-center">
|
| 1076 |
<h2 class="text-xl font-bold" style="color:#f0ece6">Share Your Feedback</h2>
|
| 1077 |
<p class="text-xs mt-2" style="color:#777">We're in the requirements-gathering phase. Your input directly shapes what gets built.</p>
|
| 1078 |
</div>
|
| 1079 |
|
| 1080 |
-
<div class="space-y-
|
| 1081 |
-
<div>
|
| 1082 |
-
<
|
| 1083 |
-
|
| 1084 |
-
<
|
| 1085 |
-
|
| 1086 |
-
|
| 1087 |
-
|
| 1088 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1089 |
</div>
|
| 1090 |
</div>
|
| 1091 |
|
| 1092 |
<div>
|
| 1093 |
<label class="text-[10px] font-bold uppercase tracking-widest block mb-2" style="color:#a89f97">Category</label>
|
| 1094 |
-
<select class="fb-select" id="fb-type">
|
| 1095 |
<option value="general">General Feedback</option>
|
| 1096 |
-
<option value="bug">Bug Report</option>
|
| 1097 |
-
<option value="feature">Feature Request</option>
|
| 1098 |
-
<option value="accuracy">Detection Accuracy</option>
|
| 1099 |
-
<option value="ux">User Experience</option>
|
| 1100 |
</select>
|
| 1101 |
</div>
|
| 1102 |
|
| 1103 |
<div>
|
| 1104 |
<label class="text-[10px] font-bold uppercase tracking-widest block mb-2" style="color:#a89f97">Details</label>
|
| 1105 |
-
<textarea class="fb-textarea" id="fb-text" placeholder="
|
| 1106 |
</div>
|
| 1107 |
|
| 1108 |
-
<button onclick="submitFeedback()" class="w-full py-
|
| 1109 |
-
style="background:#
|
| 1110 |
Submit Feedback <i class="fa-solid fa-paper-plane ml-2 text-[10px]"></i>
|
| 1111 |
</button>
|
| 1112 |
</div>
|
|
@@ -1774,6 +1822,9 @@
|
|
| 1774 |
track_id: document.getElementById('chip-track_id').classList.contains('active')
|
| 1775 |
};
|
| 1776 |
|
|
|
|
|
|
|
|
|
|
| 1777 |
// Apply to config
|
| 1778 |
_params.config.imgsz = imgsz;
|
| 1779 |
_params.config.conf = conf;
|
|
@@ -1791,6 +1842,11 @@
|
|
| 1791 |
document.getElementById('proc-label').innerText = 'Processing';
|
| 1792 |
|
| 1793 |
// Reset Run Tab Results to Awaiting
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1794 |
const badge = document.getElementById('results-status-badge');
|
| 1795 |
if (badge) {
|
| 1796 |
badge.innerText = 'Processing';
|
|
@@ -1815,6 +1871,8 @@
|
|
| 1815 |
config: _params.config,
|
| 1816 |
annotated_video: annotated,
|
| 1817 |
annotated_options: annotated_options,
|
|
|
|
|
|
|
| 1818 |
report_format: reportFmt
|
| 1819 |
}));
|
| 1820 |
};
|
|
@@ -1904,6 +1962,11 @@
|
|
| 1904 |
badge.className = 'px-2.5 py-1 bg-white text-black text-[10px] font-bold rounded-full uppercase tracking-tighter';
|
| 1905 |
}
|
| 1906 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1907 |
document.getElementById('run-results-content').innerHTML =
|
| 1908 |
detailRow('Inference Time', d.processing_time + ' sec') +
|
| 1909 |
infoRow('Throughput (FPS)', d.actual_fps, 'Measured frame throughput during processing.', ' <span class="text-xs text-slate-400 font-normal">fps</span>') +
|
|
@@ -2005,6 +2068,7 @@
|
|
| 2005 |
if (!data.files || !data.files.length) return null;
|
| 2006 |
|
| 2007 |
document.getElementById('reports-pending').classList.add('hidden');
|
|
|
|
| 2008 |
document.getElementById('post-process-cards').classList.remove('hidden');
|
| 2009 |
const grid = document.getElementById('reports-grid');
|
| 2010 |
grid.classList.remove('hidden');
|
|
|
|
| 467 |
class="text-[10px] font-bold uppercase tracking-widest transition w-full text-center py-1 rounded"
|
| 468 |
style="color:#a89f97" onmouseover="this.style.color='#c89a6c'"
|
| 469 |
onmouseout="this.style.color='#a89f97'">Terms & Conditions</button>
|
| 470 |
+
<p class="text-[9px] mt-1 mb-1" style="color:#333">© 2026 UrbanFlow</p>
|
|
|
|
| 471 |
</div>
|
| 472 |
</aside>
|
| 473 |
|
|
|
|
| 739 |
class="text-[10px] text-slate-400 mt-0.5 uppercase tracking-widest font-medium text-center">
|
| 740 |
Execution Telemetry</p>
|
| 741 |
</div>
|
| 742 |
+
<div class="flex items-center gap-3">
|
| 743 |
+
<button id="run-analyze-again-btn" onclick="switchTab('settings')" class="hidden px-4 py-1.5 bg-[#c89a6c] text-white text-[10px] font-bold rounded-full shadow-sm hover:bg-[#8b5e3c] transition-colors"><i class="fa-solid fa-gear mr-1"></i> Configure & Analyze Again</button>
|
| 744 |
+
<div id="results-status-badge"
|
| 745 |
+
class="px-3 py-1.5 bg-amber-900/30 border border-amber-800/50 text-amber-500 text-[10px] font-bold rounded-full uppercase tracking-widest shadow-sm flex items-center gap-2">
|
| 746 |
+
<div class="w-1.5 h-1.5 rounded-full bg-amber-500 animate-pulse"></div>System Standby
|
| 747 |
+
</div>
|
| 748 |
</div>
|
| 749 |
</div>
|
| 750 |
<div class="p-8">
|
|
|
|
| 819 |
|
| 820 |
<!-- TAB: Reports -->
|
| 821 |
<div id="tab-reports" class="hidden flex-1 min-h-0 overflow-y-auto">
|
| 822 |
+
<div id="reports-pending-message" class="mb-4 text-center p-4 border border-[#222] bg-[#0a0a0a] rounded-xl flex items-center justify-center gap-3 shadow-sm">
|
| 823 |
+
<i class="fa-solid fa-circle-notch fa-spin text-[#c89a6c]"></i>
|
| 824 |
+
<span class="text-xs text-[#a89f97] font-medium tracking-wide uppercase">Generating artifacts & rendering analytics... Please wait</span>
|
| 825 |
+
</div>
|
| 826 |
<div id="reports-pending" class="grid grid-cols-2 xl:grid-cols-3 gap-4 w-full">
|
| 827 |
<!-- Skeleton Loader 1 -->
|
| 828 |
<div class="bg-[#0a0a0a] rounded-xl border border-[#222] shadow-sm flex flex-col overflow-hidden animate-pulse">
|
|
|
|
| 893 |
|
| 894 |
<!-- TAB: Settings -->
|
| 895 |
<div id="tab-settings" class="hidden flex-1 min-h-0 overflow-y-auto">
|
| 896 |
+
<div class="grid grid-cols-2 gap-6 w-full">
|
| 897 |
<!-- Processing Parameters -->
|
| 898 |
+
<div class="col-span-1 bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden">
|
| 899 |
<div class="px-6 py-4 border-b border-slate-100 bg-slate-50/50">
|
| 900 |
<h3 class="font-bold text-slate-800 text-sm flex items-center">Inference Configuration Profile
|
| 901 |
<span class="info-wrap">
|
|
|
|
| 1022 |
</div>
|
| 1023 |
</div>
|
| 1024 |
|
| 1025 |
+
<!-- Artifact Generation Settings -->
|
| 1026 |
<div
|
| 1027 |
class="col-span-1 bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden flex flex-col">
|
| 1028 |
<div class="px-5 py-3 border-b border-slate-100 bg-slate-50/50">
|
| 1029 |
+
<h3 class="font-bold text-slate-800 text-sm">Artifact Generation Settings</h3>
|
| 1030 |
</div>
|
| 1031 |
<div class="px-5 py-4 flex-1 flex flex-col">
|
| 1032 |
+
<div class="s-row">
|
| 1033 |
+
<div>
|
| 1034 |
+
<div class="text-xs font-semibold text-slate-700 flex items-center">Export Run Details (JSON)
|
| 1035 |
+
<span class="info-wrap ml-1">
|
| 1036 |
+
<span class="info-btn"><i class="fa-solid fa-info"></i></span>
|
| 1037 |
+
<span class="info-tip">Include analysis.json payload with all run parameters and data structures.</span>
|
| 1038 |
+
</span>
|
| 1039 |
+
</div>
|
| 1040 |
+
<div class="text-[10px] text-slate-400">Structurally represented technical details</div>
|
| 1041 |
+
</div>
|
| 1042 |
+
<div class="toggle-track" id="sv-export-json" onclick="this.classList.toggle('active')">
|
| 1043 |
+
<div class="toggle-thumb"></div>
|
| 1044 |
+
</div>
|
| 1045 |
+
</div>
|
| 1046 |
+
<div class="s-row">
|
| 1047 |
+
<div>
|
| 1048 |
+
<div class="text-xs font-semibold text-slate-700 flex items-center">Export CSV Results
|
| 1049 |
+
<span class="info-wrap ml-1">
|
| 1050 |
+
<span class="info-btn"><i class="fa-solid fa-info"></i></span>
|
| 1051 |
+
<span class="info-tip">Include frame-by-frame data in raw CSV format.</span>
|
| 1052 |
+
</span>
|
| 1053 |
+
</div>
|
| 1054 |
+
<div class="text-[10px] text-slate-400">Include raw metrics and detections</div>
|
| 1055 |
+
</div>
|
| 1056 |
+
<div class="toggle-track" id="sv-export-csv" onclick="this.classList.toggle('active')">
|
| 1057 |
+
<div class="toggle-thumb"></div>
|
| 1058 |
+
</div>
|
| 1059 |
+
</div>
|
| 1060 |
<div class="s-row">
|
| 1061 |
<div>
|
| 1062 |
<div class="text-xs font-semibold text-slate-700 flex items-center">Auto-Download Report
|
|
|
|
| 1104 |
|
| 1105 |
<!-- TAB: Feedback -->
|
| 1106 |
<div id="tab-feedback" class="hidden flex-1 min-h-0 overflow-y-auto" style="padding:16px">
|
| 1107 |
+
<div class="max-w-4xl mx-auto w-full">
|
| 1108 |
<div class="bg-black border border-slate-800 rounded-xl p-8 shadow-2xl space-y-6">
|
| 1109 |
<div class="text-center">
|
| 1110 |
<h2 class="text-xl font-bold" style="color:#f0ece6">Share Your Feedback</h2>
|
| 1111 |
<p class="text-xs mt-2" style="color:#777">We're in the requirements-gathering phase. Your input directly shapes what gets built.</p>
|
| 1112 |
</div>
|
| 1113 |
|
| 1114 |
+
<div class="space-y-6">
|
| 1115 |
+
<div class="grid grid-cols-2 gap-6">
|
| 1116 |
+
<div>
|
| 1117 |
+
<label class="text-[10px] font-bold uppercase tracking-widest block mb-2" style="color:#a89f97">Overall Experience</label>
|
| 1118 |
+
<div class="fb-stars" id="fb-stars">
|
| 1119 |
+
<span class="fb-star" data-v="1" onclick="setRating(1)">★</span>
|
| 1120 |
+
<span class="fb-star" data-v="2" onclick="setRating(2)">★</span>
|
| 1121 |
+
<span class="fb-star" data-v="3" onclick="setRating(3)">★</span>
|
| 1122 |
+
<span class="fb-star" data-v="4" onclick="setRating(4)">★</span>
|
| 1123 |
+
<span class="fb-star" data-v="5" onclick="setRating(5)">★</span>
|
| 1124 |
+
</div>
|
| 1125 |
+
</div>
|
| 1126 |
+
|
| 1127 |
+
<div>
|
| 1128 |
+
<label class="text-[10px] font-bold uppercase tracking-widest block mb-2" style="color:#a89f97">Primary Use Case</label>
|
| 1129 |
+
<select class="fb-select w-full" id="fb-usecase">
|
| 1130 |
+
<option value="" disabled selected>Select your use case</option>
|
| 1131 |
+
<option value="research">Academic / Traffic Research</option>
|
| 1132 |
+
<option value="planning">Urban Planning & Capacity</option>
|
| 1133 |
+
<option value="highway">Highway Authority (NHAI/State)</option>
|
| 1134 |
+
<option value="smartcity">Smart City Integrator</option>
|
| 1135 |
+
<option value="other">Other</option>
|
| 1136 |
+
</select>
|
| 1137 |
</div>
|
| 1138 |
</div>
|
| 1139 |
|
| 1140 |
<div>
|
| 1141 |
<label class="text-[10px] font-bold uppercase tracking-widest block mb-2" style="color:#a89f97">Category</label>
|
| 1142 |
+
<select class="fb-select w-full" id="fb-type">
|
| 1143 |
<option value="general">General Feedback</option>
|
| 1144 |
+
<option value="bug">Bug Report / Processing Failure</option>
|
| 1145 |
+
<option value="feature">Feature Request / Enhancements</option>
|
| 1146 |
+
<option value="accuracy">Detection Accuracy (Misses/False Positives)</option>
|
| 1147 |
+
<option value="ux">User Experience / Interface</option>
|
| 1148 |
</select>
|
| 1149 |
</div>
|
| 1150 |
|
| 1151 |
<div>
|
| 1152 |
<label class="text-[10px] font-bold uppercase tracking-widest block mb-2" style="color:#a89f97">Details</label>
|
| 1153 |
+
<textarea class="fb-textarea w-full min-h-[140px]" id="fb-text" placeholder="Please provide specific details. If reporting accuracy issues, mention vehicle types or lighting conditions..."></textarea>
|
| 1154 |
</div>
|
| 1155 |
|
| 1156 |
+
<button onclick="submitFeedback()" class="w-full py-4 font-bold text-sm rounded-xl transition hover:scale-[1.01] active:scale-95 shadow-lg"
|
| 1157 |
+
style="background:#111;border:1px solid var(--cocoa);color:var(--cocoa-l)">
|
| 1158 |
Submit Feedback <i class="fa-solid fa-paper-plane ml-2 text-[10px]"></i>
|
| 1159 |
</button>
|
| 1160 |
</div>
|
|
|
|
| 1822 |
track_id: document.getElementById('chip-track_id').classList.contains('active')
|
| 1823 |
};
|
| 1824 |
|
| 1825 |
+
const exportJson = document.getElementById('sv-export-json').classList.contains('active');
|
| 1826 |
+
const exportCsv = document.getElementById('sv-export-csv').classList.contains('active');
|
| 1827 |
+
|
| 1828 |
// Apply to config
|
| 1829 |
_params.config.imgsz = imgsz;
|
| 1830 |
_params.config.conf = conf;
|
|
|
|
| 1842 |
document.getElementById('proc-label').innerText = 'Processing';
|
| 1843 |
|
| 1844 |
// Reset Run Tab Results to Awaiting
|
| 1845 |
+
const analyzeAgainBtn = document.getElementById('run-analyze-again-btn');
|
| 1846 |
+
if (analyzeAgainBtn) {
|
| 1847 |
+
analyzeAgainBtn.classList.add('hidden');
|
| 1848 |
+
}
|
| 1849 |
+
|
| 1850 |
const badge = document.getElementById('results-status-badge');
|
| 1851 |
if (badge) {
|
| 1852 |
badge.innerText = 'Processing';
|
|
|
|
| 1871 |
config: _params.config,
|
| 1872 |
annotated_video: annotated,
|
| 1873 |
annotated_options: annotated_options,
|
| 1874 |
+
export_json: exportJson,
|
| 1875 |
+
export_csv: exportCsv,
|
| 1876 |
report_format: reportFmt
|
| 1877 |
}));
|
| 1878 |
};
|
|
|
|
| 1962 |
badge.className = 'px-2.5 py-1 bg-white text-black text-[10px] font-bold rounded-full uppercase tracking-tighter';
|
| 1963 |
}
|
| 1964 |
|
| 1965 |
+
const analyzeAgainBtn = document.getElementById('run-analyze-again-btn');
|
| 1966 |
+
if (analyzeAgainBtn) {
|
| 1967 |
+
analyzeAgainBtn.classList.remove('hidden');
|
| 1968 |
+
}
|
| 1969 |
+
|
| 1970 |
document.getElementById('run-results-content').innerHTML =
|
| 1971 |
detailRow('Inference Time', d.processing_time + ' sec') +
|
| 1972 |
infoRow('Throughput (FPS)', d.actual_fps, 'Measured frame throughput during processing.', ' <span class="text-xs text-slate-400 font-normal">fps</span>') +
|
|
|
|
| 2068 |
if (!data.files || !data.files.length) return null;
|
| 2069 |
|
| 2070 |
document.getElementById('reports-pending').classList.add('hidden');
|
| 2071 |
+
document.getElementById('reports-pending-message').classList.add('hidden');
|
| 2072 |
document.getElementById('post-process-cards').classList.remove('hidden');
|
| 2073 |
const grid = document.getElementById('reports-grid');
|
| 2074 |
grid.classList.remove('hidden');
|