SRUTHI123 commited on
Commit
c452e22
·
verified ·
1 Parent(s): a652f76

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -79
app.py CHANGED
@@ -1,89 +1,71 @@
1
  import streamlit as st
 
2
  from PIL import Image
3
- from ultralytics import YOLO
4
-
5
- # Set up Streamlit page
6
- st.set_page_config(page_title="Suspicious Activity Detection", layout="centered")
7
 
8
  # Load YOLOv11 model
9
  @st.cache_resource
10
  def load_model():
11
- return YOLO("yolo11l.pt") # Ensure model filename matches
12
 
13
  model = load_model()
 
14
 
15
- # ------------------ Improved Action Classification Logic ------------------
16
- def classify_action(detections):
17
- """
18
- Classify activity based on object types, count, and confidence.
19
- """
20
- action_scores = {'Stealing': 0, 'Sneaking': 0, 'Peaking': 0, 'Normal': 0}
21
- objects = [d[0] for d in detections]
22
- confidences = [d[1] for d in detections]
23
-
24
- has_person = 'person' in objects
25
- has_bag = any(obj in objects for obj in ['handbag', 'backpack'])
26
- few_objects = len(set(objects)) <= 2
27
- mostly_person = objects.count('person') >= len(objects) * 0.6 if objects else False
28
- max_conf = max(confidences) if confidences else 0.0
29
-
30
- # Decision tree for classification
31
- if has_person:
32
- if has_bag and len(objects) >= 3:
33
- action_scores['Stealing'] += 1.0
34
- elif max_conf < 0.55 and few_objects:
35
- action_scores['Sneaking'] += 1.0
36
- elif mostly_person and few_objects and max_conf >= 0.55:
37
- action_scores['Peaking'] += 1.0
38
- else:
39
- action_scores['Normal'] += 1.0
40
- else:
41
- action_scores['Normal'] += 1.0
42
-
43
- # Normalize scores
44
- total = sum(action_scores.values())
45
- if total > 0:
46
- for k in action_scores:
47
- action_scores[k] /= total
48
-
49
- return action_scores
50
-
51
- # ------------------ Detection Function ------------------
52
- def detect_action(image_path):
53
- results = model.predict(source=image_path, conf=0.35, iou=0.5, save=False, verbose=False)
54
- result = results[0]
55
-
56
- detections = [
57
- (model.names[int(cls)], float(conf))
58
- for cls, conf in zip(result.boxes.cls, result.boxes.conf)
59
- ]
60
-
61
- annotated_image = result.plot()
62
- action_scores = classify_action(detections)
63
 
64
- return annotated_image, action_scores
65
-
66
- # ------------------ Streamlit UI ------------------
67
- st.title("🛡️ Suspicious Activity Detection")
68
- st.markdown("Upload an image to detect if someone is **Stealing**, **Sneaking**, **Peaking**, or acting **Normal**.")
69
-
70
- uploaded_file = st.file_uploader("📤 Upload an image", type=["jpg", "jpeg", "png"])
71
-
72
- if uploaded_file:
73
- image = Image.open(uploaded_file).convert("RGB")
74
- st.image(image, caption="Uploaded Image", use_column_width=True)
75
-
76
- temp_path = "/tmp/uploaded.jpg"
77
- image.save(temp_path)
78
-
79
- with st.spinner("🔍 Detecting suspicious activity..."):
80
- detected_image, action_scores = detect_action(temp_path)
81
-
82
- st.image(detected_image, caption="🔍 Detection Results", use_column_width=True)
83
-
84
- st.subheader("📊 Action Confidence Scores")
85
- for action, score in action_scores.items():
86
- st.write(f"**{action}**: {score:.2%}")
87
-
88
- top_action = max(action_scores.items(), key=lambda x: x[1])
89
- st.success(f"🎯 **Predicted Action:** {top_action[0]} ({top_action[1]:.2%} confidence)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
+ import torch
3
  from PIL import Image
4
+ import numpy as np
5
+ import cv2
6
+ import tempfile
7
+ import os
8
 
9
  # Load YOLOv11 model
10
  @st.cache_resource
11
  def load_model():
12
+ return torch.hub.load('ultralytics/yolov5', 'custom', path='yolo11l.pt', force_reload=True)
13
 
14
  model = load_model()
15
+ model.conf = 0.25 # confidence threshold
16
 
17
+ # Activity labels
18
+ labels = ['Normal', 'Peaking', 'Sneaking', 'Stealing']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
+ # Streamlit UI
21
+ st.set_page_config(page_title="Suspicious Activity Detection", layout="centered")
22
+ st.title("🚨 Suspicious Activity Detection with YOLOv11")
23
+ st.markdown("Detect **Normal**, **Peaking**, **Sneaking**, and **Stealing** behaviors in real-time from uploaded images or videos.")
24
+
25
+ # Upload section
26
+ file = st.file_uploader("Upload an image or a video", type=['jpg', 'jpeg', 'png', 'mp4'])
27
+
28
+ # Process predictions
29
+ def display_predictions(results):
30
+ df = results.pandas().xyxy[0]
31
+ activity_counts = {label: 0 for label in labels}
32
+ for _, row in df.iterrows():
33
+ label = row['name']
34
+ if label in activity_counts:
35
+ activity_counts[label] += 1
36
+ return activity_counts
37
+
38
+ # Handle image
39
+ if file is not None:
40
+ if file.type.startswith("image"):
41
+ image = Image.open(file).convert('RGB')
42
+ st.image(image, caption="Uploaded Image", use_column_width=True)
43
+ results = model(image, size=640)
44
+ results.render()
45
+ st.image(Image.fromarray(results.ims[0]), caption="Detection Result", use_column_width=True)
46
+ counts = display_predictions(results)
47
+ st.markdown("### 🔍 Detected Activities")
48
+ for act, cnt in counts.items():
49
+ if cnt > 0:
50
+ st.success(f"**{act}**: {cnt}")
51
+
52
+ # Handle video
53
+ elif file.type.startswith("video"):
54
+ tfile = tempfile.NamedTemporaryFile(delete=False)
55
+ tfile.write(file.read())
56
+ video_path = tfile.name
57
+ cap = cv2.VideoCapture(video_path)
58
+ stframe = st.empty()
59
+ st.markdown("### 📹 Processing video...")
60
+
61
+ while cap.isOpened():
62
+ ret, frame = cap.read()
63
+ if not ret:
64
+ break
65
+ results = model(frame)
66
+ results.render()
67
+ output_frame = results.ims[0]
68
+ stframe.image(output_frame, channels="BGR", use_column_width=True)
69
+
70
+ cap.release()
71
+ os.remove(video_path)