File size: 3,410 Bytes
ad1bda5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import gradio as gr
import cv2
import numpy as np
from queue_monitor import QueueMonitor
from llm_analyzer import LogAnalyzer
import json

# Initialize components
monitor = QueueMonitor()
# Define a default zone for demonstration
default_polygon = np.array([[100, 100], [1100, 100], [1100, 600], [100, 600]])
monitor.setup_zones([default_polygon])

# Lazy load LLM to save resources until needed
analyzer = None

def get_analyzer():
    global analyzer
    if analyzer is None:
        analyzer = LogAnalyzer()
    return analyzer

def process_video(video_path):
    cap = cv2.VideoCapture(video_path)
    frames = []
    total_stats = []
    
    # Process first 30 frames for demo purposes
    for _ in range(30):
        ret, frame = cap.read()
        if not ret:
            break
        annotated, stats = monitor.process_frame(frame)
        frames.append(cv2.cvtColor(annotated, cv2.COLOR_BGR2RGB))
        total_stats.append(stats)
    
    cap.release()
    return frames[0] if frames else None, json.dumps(total_stats[0] if total_stats else {}, indent=2)

def analyze_logs(log_json):
    try:
        log_data = json.loads(log_json)
        llm = get_analyzer()
        analysis = llm.analyze_logs(log_data)
        return analysis
    except Exception as e:
        return f"Error: {str(e)}"

with gr.Blocks(title="AI Queue Management for CCTV and YOLO") as demo:
    gr.Markdown("# AI Queue Management for CCTV and YOLO")
    
    with gr.Tab("Real-time Monitoring"):
        with gr.Row():
            video_input = gr.Video(label="Upload CCTV Footage")
            image_output = gr.Image(label="Processed Frame")
        with gr.Row():
            stats_output = gr.Code(label="Zone Statistics (JSON)", language="json")
        process_btn = gr.Button("Process Video")
        process_btn.click(process_video, inputs=video_input, outputs=[image_output, stats_output])

    with gr.Tab("AI Log Analysis"):
        gr.Markdown("### Analyze Queue Logs with Qwen-2.5")
        log_input = gr.Textbox(
            label="Input Logs (JSON)", 
            value=json.dumps({
                "date": "2026-01-24",
                "branch": "SBI Jabalpur",
                "avg_wait_time_sec": 420,
                "max_wait_time_sec": 980,
                "customers_served": 134,
                "counter_1_avg_service": 180,
                "counter_2_avg_service": 310,
                "peak_hour": "12:00-13:00",
                "queue_overflow_events": 5
            }, indent=2),
            lines=10
        )
        analyze_btn = gr.Button("Generate AI Insights")
        analysis_output = gr.Markdown(label="AI Recommendations")
        analyze_btn.click(analyze_logs, inputs=log_input, outputs=analysis_output)

    with gr.Tab("Use Cases"):
        gr.Markdown("""
        ## Expanded Use Cases
        - **Retail Heatmap & Dwell Time**: Identify which product sections attract the most customers.
        - **Bank Branch Efficiency**: Optimize staffing based on counter service times.
        - **Airport Security**: Predict wait times and manage lane openings.
        - **Hospital Triage**: Monitor ER waiting areas for timely care.
        - **Smart Parking**: Manage vehicle turnover in specific zones.
        - **Safety Monitoring**: Detect unauthorized presence in restricted zones.
        """)

if __name__ == "__main__":
    demo.launch(server_name="0.0.0.0", server_port=7860)