Siddharth Ravikumar commited on
Commit
d1b7eeb
Β·
1 Parent(s): f658e30

Wrap run_analysis_fn in try-except to return structured tracebacks

Browse files
Files changed (1) hide show
  1. app.py +50 -48
app.py CHANGED
@@ -228,28 +228,27 @@ def get_case_photos_fn(case_id):
228
  @spaces.GPU(duration=120)
229
  def run_analysis_fn(case_id, progress=gr.Progress()):
230
  """Run the full AI analysis pipeline (GPU-accelerated)."""
231
- if not case_id:
232
- return "❌ Enter a Case ID.", "", ""
233
- ensure_init()
234
-
235
  try:
 
 
 
 
236
  case = run_async(db.get_case(int(case_id)))
237
  if not case:
238
  return "❌ Case not found.", "", ""
239
  photos = run_async(db.get_photos_by_case(int(case_id)))
240
  if not photos:
241
  return "❌ No photos uploaded.", "", ""
242
- except Exception as e:
243
- return f"❌ {e}", "", ""
244
 
245
- if not inference_engine.is_loaded:
246
- inference_engine.load_model()
247
 
248
- # Step 1: Analyze each photo
249
- analysis_results = []
250
- for i, photo in enumerate(photos):
251
- progress((i + 1) / len(photos) * 0.5, desc=f"Analyzing photo {i+1}/{len(photos)}...")
252
- try:
253
  img = Image.open(photo["filepath"])
254
  start = time.perf_counter()
255
  raw = gpu_run_inference(img, SCENE_ANALYSIS_PROMPT)
@@ -268,42 +267,45 @@ def run_analysis_fn(case_id, progress=gr.Progress()):
268
  except Exception as e:
269
  analysis_results.append({"filename": photo["filename"], "analysis": f"Error: {e}", "time_ms": 0})
270
 
271
- # Identify parties
272
- progress(0.55, desc="Identifying parties...")
273
- all_analyses = run_async(db.get_analyses_by_case(int(case_id)))
274
- parties_data = scene_analyzer._identify_parties(all_analyses)
275
- run_async(db.clear_parties(int(case_id)))
276
- for p in parties_data:
277
- run_async(db.add_party(
278
- case_id=int(case_id), label=p.get("label", "Unknown"),
279
- vehicle_type=p.get("vehicle_type"), vehicle_color=p.get("vehicle_color"),
280
- vehicle_description=p.get("description"),
281
- ))
 
 
 
 
 
 
 
 
 
282
 
283
- # Step 2: Rule matching
284
- progress(0.65, desc="Matching traffic rules...")
285
- violations = run_async(rule_matcher.match_violations(int(case_id)))
286
-
287
- # Step 3: Fault deduction
288
- progress(0.8, desc="Deducing fault...")
289
- fault_result = run_async(fault_deducer.deduce_fault(int(case_id)))
290
- run_async(db.update_case_status(int(case_id), "complete"))
291
-
292
- # Format output
293
- total_time = sum(r["time_ms"] for r in analysis_results)
294
- analysis_text = ""
295
- for r in analysis_results:
296
- analysis_text += f"### πŸ“· {r['filename']} ({r['time_ms']}ms)\n```\n{r['analysis']}\n```\n---\n\n"
297
-
298
- violations_text = f"Found {len(violations)} violation(s):\n"
299
- for v in violations:
300
- violations_text += f"\nβ€’ **{v.get('rule_title', '?')}** ({v.get('severity', '?')}) β€” {v.get('confidence', 0):.0%}"
301
- violations_text += f"\n\n### Fault: {fault_result.get('primary_fault_party', 'N/A')}"
302
- violations_text += f"\nConfidence: {fault_result.get('overall_confidence', 0):.0%}"
303
- violations_text += f"\n\n{fault_result.get('analysis_summary', '')}"
304
-
305
- progress(1.0, desc="Complete!")
306
- return f"βœ… Done! {len(photos)} photos in {total_time/1000:.1f}s", analysis_text, violations_text
307
 
308
 
309
  def generate_report_fn(case_id):
 
228
  @spaces.GPU(duration=120)
229
  def run_analysis_fn(case_id, progress=gr.Progress()):
230
  """Run the full AI analysis pipeline (GPU-accelerated)."""
231
+ import traceback
 
 
 
232
  try:
233
+ if not case_id:
234
+ return "❌ Enter a Case ID.", "", ""
235
+ ensure_init()
236
+
237
  case = run_async(db.get_case(int(case_id)))
238
  if not case:
239
  return "❌ Case not found.", "", ""
240
  photos = run_async(db.get_photos_by_case(int(case_id)))
241
  if not photos:
242
  return "❌ No photos uploaded.", "", ""
 
 
243
 
244
+ if not inference_engine.is_loaded:
245
+ inference_engine.load_model()
246
 
247
+ # Step 1: Analyze each photo
248
+ analysis_results = []
249
+ for i, photo in enumerate(photos):
250
+ progress((i + 1) / len(photos) * 0.5, desc=f"Analyzing photo {i+1}/{len(photos)}...")
251
+ try:
252
  img = Image.open(photo["filepath"])
253
  start = time.perf_counter()
254
  raw = gpu_run_inference(img, SCENE_ANALYSIS_PROMPT)
 
267
  except Exception as e:
268
  analysis_results.append({"filename": photo["filename"], "analysis": f"Error: {e}", "time_ms": 0})
269
 
270
+ # Identify parties
271
+ progress(0.55, desc="Identifying parties...")
272
+ all_analyses = run_async(db.get_analyses_by_case(int(case_id)))
273
+ parties_data = scene_analyzer._identify_parties(all_analyses)
274
+ run_async(db.clear_parties(int(case_id)))
275
+ for p in parties_data:
276
+ run_async(db.add_party(
277
+ case_id=int(case_id), label=p.get("label", "Unknown"),
278
+ vehicle_type=p.get("vehicle_type"), vehicle_color=p.get("vehicle_color"),
279
+ vehicle_description=p.get("description"),
280
+ ))
281
+
282
+ # Step 2: Rule matching
283
+ progress(0.65, desc="Matching traffic rules...")
284
+ violations = run_async(rule_matcher.match_violations(int(case_id)))
285
+
286
+ # Step 3: Fault deduction
287
+ progress(0.8, desc="Deducing fault...")
288
+ fault_result = run_async(fault_deducer.deduce_fault(int(case_id)))
289
+ run_async(db.update_case_status(int(case_id), "complete"))
290
 
291
+ # Format output
292
+ total_time = sum(r["time_ms"] for r in analysis_results)
293
+ analysis_text = ""
294
+ for r in analysis_results:
295
+ analysis_text += f"### πŸ“· {r['filename']} ({r['time_ms']}ms)\n```\n{r['analysis']}\n```\n---\n\n"
296
+
297
+ violations_text = f"Found {len(violations)} violation(s):\n"
298
+ for v in violations:
299
+ violations_text += f"\nβ€’ **{v.get('rule_title', '?')}** ({v.get('severity', '?')}) β€” {v.get('confidence', 0):.0%}"
300
+ violations_text += f"\n\n### Fault: {fault_result.get('primary_fault_party', 'N/A')}"
301
+ violations_text += f"\nConfidence: {fault_result.get('overall_confidence', 0):.0%}"
302
+ violations_text += f"\n\n{fault_result.get('analysis_summary', '')}"
303
+
304
+ progress(1.0, desc="Complete!")
305
+ return f"βœ… Done! {len(photos)} photos in {total_time/1000:.1f}s", analysis_text, violations_text
306
+ except Exception as e:
307
+ import traceback
308
+ return f"❌ Python Error: {e}", traceback.format_exc(), ""
 
 
 
 
 
 
309
 
310
 
311
  def generate_report_fn(case_id):