File size: 3,426 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
96
97
98
99
100
101
102
import streamlit as st
import cv2
import numpy as np
from queue_monitor import QueueMonitor
from llm_analyzer import LogAnalyzer
import json
import pandas as pd

st.set_page_config(page_title="AI Queue Management", layout="wide")

st.title("AI Queue Management for CCTV and YOLO")

# Sidebar for configuration
st.sidebar.header("Configuration")
confidence = st.sidebar.slider("Confidence Threshold", 0.0, 1.0, 0.3)

@st.cache_resource
def load_monitor(conf):
    return QueueMonitor(confidence=conf)

@st.cache_resource
def load_analyzer():
    return LogAnalyzer()

monitor = load_monitor(confidence)

# Default zone
default_polygon = np.array([[100, 100], [1100, 100], [1100, 600], [100, 600]])
monitor.setup_zones([default_polygon])

tab1, tab2, tab3 = st.tabs(["Vision Monitoring", "AI Log Analysis", "Use Cases"])

with tab1:
    st.header("Vision Monitoring")
    uploaded_file = st.file_uploader("Upload CCTV Video", type=['mp4', 'avi', 'mov'])
    
    if uploaded_file is not None:
        # Save uploaded file temporarily
        with open("temp_video.mp4", "wb") as f:
            f.write(uploaded_file.read())
        
        cap = cv2.VideoCapture("temp_video.mp4")
        st_frame = st.empty()
        
        if st.button("Start Processing"):
            while cap.isOpened():
                ret, frame = cap.read()
                if not ret:
                    break
                
                annotated, stats = monitor.process_frame(frame)
                st_frame.image(cv2.cvtColor(annotated, cv2.COLOR_BGR2RGB))
                
                # Display stats in a table
                st.write("Current Zone Stats:")
                st.table(pd.DataFrame(stats))
                
            cap.release()

with tab2:
    st.header("AI Log Analysis")
    st.write("Analyze queue performance logs using Qwen-2.5-1.5B-Instruct.")
    
    sample_log = {
        "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
    }
    
    log_input = st.text_area("Log Data (JSON)", value=json.dumps(sample_log, indent=2), height=250)
    
    if st.button("Analyze with AI"):
        with st.spinner("LLM is thinking..."):
            try:
                analyzer = load_analyzer()
                log_data = json.loads(log_input)
                analysis = analyzer.analyze_logs(log_data)
                st.markdown("### AI Insights & Recommendations")
                st.write(analysis)
            except Exception as e:
                st.error(f"Error: {str(e)}")

with tab3:
    st.header("Expanded Use Cases")
    use_cases = {
        "Retail Heatmap": "Track customer movement and dwell time in specific aisles.",
        "Bank Efficiency": "Monitor counter service times and optimize teller allocation.",
        "Airport Security": "Predict queue growth and manage security lane staffing.",
        "Hospital ER": "Ensure patients are seen within target wait times.",
        "Smart Parking": "Monitor parking bay occupancy and turnover rates.",
        "Safety Zones": "Alert security if someone enters or lingers in restricted areas."
    }
    for title, desc in use_cases.items():
        st.subheader(title)
        st.write(desc)