Abs6187 commited on
Commit
cc28b48
Β·
verified Β·
1 Parent(s): 18530a7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +76 -140
app.py CHANGED
@@ -1,145 +1,81 @@
1
  import gradio as gr
2
  from ultralytics import YOLO
3
  from PIL import Image
4
- import tensorflow as tf
5
- import numpy as np
6
-
7
- # Global variables
8
- loaded_model = None
9
- selected_model = None
10
-
11
- # Load model on demand
12
- def load_model(choice):
13
- global loaded_model, selected_model
14
- selected_model = choice
15
-
16
- try:
17
- if choice == "YOLO":
18
- loaded_model = YOLO("Suspicious_Activities_nano.pt")
19
- return "βœ… YOLO model loaded successfully!"
20
-
21
- elif choice == "SlowFast":
22
- loaded_model = tf.keras.models.load_model("slowfast_finalmodel.h5")
23
- return "βœ… SlowFast model loaded successfully!"
24
-
25
- else:
26
- return "⚠️ Please select a valid model."
27
- except Exception as e:
28
- return f"❌ Error loading model: {str(e)}"
29
-
30
-
31
- # Prediction function
32
- def predict_suspicious_activity(image):
33
- global loaded_model, selected_model
34
-
35
- if loaded_model is None:
36
- return Image.new("RGB", (400, 200), (30, 30, 30)) # placeholder
37
-
38
- if selected_model == "YOLO":
39
- results = loaded_model.predict(source=image, show=False, conf=0.6)
40
- results_img = results[0].plot()
41
- return Image.fromarray(results_img)
42
-
43
- elif selected_model == "SlowFast":
44
- img = image.resize((224, 224))
45
- arr = np.expand_dims(np.array(img) / 255.0, axis=0)
46
- preds = loaded_model.predict(arr)
47
- class_id = int(np.argmax(preds))
48
- # For now, just return the same image (you can overlay text later)
49
- return image
50
-
51
- return None
52
-
53
-
54
- # 🌟 Attractive CSS
55
- custom_css = """
56
- #main-card {
57
- background: linear-gradient(135deg, rgba(20,20,20,0.8), rgba(60,60,60,0.6));
58
- backdrop-filter: blur(15px);
59
- border-radius: 22px;
60
- box-shadow: 0 10px 40px rgba(0,0,0,0.5);
61
- padding: 35px;
62
- border: 1px solid rgba(255,255,255,0.15);
63
- transition: all 0.4s ease-in-out;
64
- }
65
- #main-card:hover {
66
- transform: translateY(-4px);
67
- box-shadow: 0 15px 45px rgba(0,0,0,0.65);
68
- }
69
- h1 {
70
- font-size: 2.8rem !important;
71
- font-weight: bold;
72
- background: linear-gradient(90deg, #ff4b1f, #ff9068, #1fddff);
73
- -webkit-background-clip: text;
74
- -webkit-text-fill-color: transparent;
75
- text-align: center;
76
- margin-bottom: 15px;
77
- }
78
- .description {
79
- text-align: center;
80
- font-size: 1.15rem;
81
- margin-bottom: 28px;
82
- color: #f0f0f0;
83
- }
84
- .gr-button {
85
- border-radius: 14px !important;
86
- padding: 12px 24px !important;
87
- font-weight: 600 !important;
88
- letter-spacing: 0.5px;
89
- background: linear-gradient(135deg, #ff4b1f, #1fddff) !important;
90
- color: white !important;
91
- border: none !important;
92
- transition: all 0.3s ease-in-out;
93
- }
94
- .gr-button:hover {
95
- transform: scale(1.08) rotate(-1deg);
96
- box-shadow: 0 6px 20px rgba(0,0,0,0.4);
97
- }
98
- .gr-button-secondary {
99
- background: linear-gradient(135deg, #555, #333) !important;
100
- }
101
- label {
102
- color: #ddd !important;
103
- font-weight: 600;
104
- }
105
- """
106
-
107
- # 🌟 Build UI
108
- with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as demo:
109
- with gr.Column(elem_id="main-card"):
110
- gr.Markdown("<h1>🚨 Suspicious Activity Detection</h1>")
111
- gr.Markdown(
112
- "<p class='description'>Choose a model (YOLO or SlowFast), upload your image, and let AI detect activities instantly ⚑</p>"
113
- )
114
-
115
- model_choice = gr.Dropdown(
116
- choices=["YOLO", "SlowFast"], label="Select Model", value=None
117
- )
118
- load_status = gr.Label(label="Model Load Status")
119
- load_btn = gr.Button("πŸ“₯ Load Model")
120
-
121
  with gr.Row():
122
- input_image = gr.Image(type="pil", label="Upload Image", height=350)
123
- output_image = gr.Image(type="pil", label="Detection Result", height=350)
124
-
 
 
 
 
 
125
  with gr.Row():
126
- detect_btn = gr.Button("πŸ” Detect")
127
- clear_btn = gr.Button("πŸ—‘οΈ Clear", elem_classes="gr-button-secondary")
128
-
129
- load_btn.click(fn=load_model, inputs=model_choice, outputs=load_status)
130
- detect_btn.click(fn=predict_suspicious_activity, inputs=input_image, outputs=output_image)
131
- clear_btn.click(fn=lambda: (None, None), inputs=None, outputs=[input_image, output_image])
132
-
133
- gr.Markdown(
134
- """
135
- ---
136
- πŸ“‚ **Dataset Reference:**
137
- [DCSASS Dataset on Kaggle](https://www.kaggle.com/mateohervas/dcsass-dataset)
138
- *(Used for training the SlowFast model)*
139
- """
140
- )
141
-
142
-
143
- # βœ… Hugging Face needs this
144
- if __name__ == "__main__":
145
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
1
  import gradio as gr
2
  from ultralytics import YOLO
3
  from PIL import Image
4
+ import tempfile
5
+ import cv2
6
+ import os
7
+
8
+ # ---------------------------
9
+ # Load models EARLY
10
+ # ---------------------------
11
+ yolo_model = YOLO("Suspicious_Activities_nano.pt")
12
+
13
+ # ---------------------------
14
+ # Prediction for IMAGE
15
+ # ---------------------------
16
+ def predict_image(image):
17
+ results = yolo_model.predict(source=image, show=False, conf=0.6)
18
+ results_img = results[0].plot()
19
+ return Image.fromarray(results_img)
20
+
21
+ # ---------------------------
22
+ # Prediction for VIDEO
23
+ # ---------------------------
24
+ def predict_video(video):
25
+ temp_out = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4")
26
+ cap = cv2.VideoCapture(video)
27
+ fourcc = cv2.VideoWriter_fourcc(*"mp4v")
28
+ fps = int(cap.get(cv2.CAP_PROP_FPS))
29
+ width, height = int(cap.get(3)), int(cap.get(4))
30
+ out = cv2.VideoWriter(temp_out.name, fourcc, fps, (width, height))
31
+
32
+ while cap.isOpened():
33
+ ret, frame = cap.read()
34
+ if not ret:
35
+ break
36
+ results = yolo_model.predict(source=frame, conf=0.6, verbose=False)
37
+ annotated_frame = results[0].plot()
38
+ out.write(annotated_frame)
39
+
40
+ cap.release()
41
+ out.release()
42
+ return temp_out.name
43
+
44
+ # ---------------------------
45
+ # Gradio UI
46
+ # ---------------------------
47
+ with gr.Blocks(css="""
48
+ body {background: linear-gradient(135deg, #1f1c2c, #928DAB);}
49
+ .gradio-container {font-family: 'Segoe UI', sans-serif;}
50
+ h1 {text-align: center; color: white; padding: 20px; font-size: 2.5em;}
51
+ .tabs {margin-top: 20px;}
52
+ .footer {text-align:center; color:#eee; font-size:14px; margin-top:25px;}
53
+ .gr-button {border-radius:12px; font-weight:bold; padding:10px 18px;}
54
+ """) as demo:
55
+
56
+ gr.HTML("<h1>🚨 Suspicious Activity Detection</h1>")
57
+
58
+ with gr.Tab("πŸ“· Image Detection"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  with gr.Row():
60
+ with gr.Column(scale=1):
61
+ img_input = gr.Image(type="pil", label="Upload Image")
62
+ img_btn = gr.Button("πŸ” Detect Suspicious Activity")
63
+ with gr.Column(scale=1):
64
+ img_output = gr.Image(type="pil", label="Detection Result")
65
+ img_btn.click(predict_image, inputs=img_input, outputs=img_output)
66
+
67
+ with gr.Tab("πŸŽ₯ Video Detection"):
68
  with gr.Row():
69
+ with gr.Column(scale=1):
70
+ vid_input = gr.Video(label="Upload Video")
71
+ vid_btn = gr.Button("🎬 Detect in Video")
72
+ with gr.Column(scale=1):
73
+ vid_output = gr.Video(label="Processed Video")
74
+ vid_btn.click(predict_video, inputs=vid_input, outputs=vid_output)
75
+
76
+ gr.HTML("<div class='footer'>Made with ❀️ using YOLO + Gradio</div>")
77
+
78
+ # ---------------------------
79
+ # Launch App
80
+ # ---------------------------
81
+ demo.launch(share=True)