Subh775 commited on
Commit
d55f352
·
1 Parent(s): 9fd9567

ui/ux enhancements..

Browse files
Files changed (3) hide show
  1. backend/server.py +2 -0
  2. backend/visualize.py +12 -6
  3. 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
- files = []
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
- lambda: export_csv(raw_events, out_dir),
248
- lambda: export_json(
 
 
 
 
 
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 &amp; Conditions</button>
470
- <p class="text-[9px] mt-1" style="color:#333">&#169; 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 id="results-status-badge"
744
- 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">
745
- <div class="w-1.5 h-1.5 rounded-full bg-amber-500 animate-pulse"></div>System Standby
 
 
 
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-3 gap-6 w-full">
891
  <!-- Processing Parameters -->
892
- <div class="col-span-2 bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden">
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
- <!-- Display Preferences -->
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">Display Preferences</h3>
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-2xl mx-auto">
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-4">
1081
- <div>
1082
- <label class="text-[10px] font-bold uppercase tracking-widest block mb-2" style="color:#a89f97">Overall Experience</label>
1083
- <div class="fb-stars" id="fb-stars">
1084
- <span class="fb-star" data-v="1" onclick="setRating(1)">&#9733;</span>
1085
- <span class="fb-star" data-v="2" onclick="setRating(2)">&#9733;</span>
1086
- <span class="fb-star" data-v="3" onclick="setRating(3)">&#9733;</span>
1087
- <span class="fb-star" data-v="4" onclick="setRating(4)">&#9733;</span>
1088
- <span class="fb-star" data-v="5" onclick="setRating(5)">&#9733;</span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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="Tell us what worked, what didn't, or what you'd like to see..."></textarea>
1106
  </div>
1107
 
1108
- <button onclick="submitFeedback()" class="w-full py-3 font-bold text-sm rounded-full transition hover:scale-[1.02] active:scale-95"
1109
- style="background:#0a0a0a;border:1px solid var(--cocoa);color:var(--cocoa-l)">
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 &amp; Conditions</button>
470
+ <p class="text-[9px] mt-1 mb-1" style="color:#333">&#169; 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)">&#9733;</span>
1120
+ <span class="fb-star" data-v="2" onclick="setRating(2)">&#9733;</span>
1121
+ <span class="fb-star" data-v="3" onclick="setRating(3)">&#9733;</span>
1122
+ <span class="fb-star" data-v="4" onclick="setRating(4)">&#9733;</span>
1123
+ <span class="fb-star" data-v="5" onclick="setRating(5)">&#9733;</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');