obj-det2 / app.py
swamisharan's picture
Create app.py
1fae9dc verified
import streamlit as st
import torch
import cv2
import numpy as np
from PIL import Image
from io import BytesIO
st.title("Real-time Object Detection with YOLOv5")
# Load the YOLOv5 model
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
# Function to draw the bounding box while selecting ROI
def draw_roi_box(event, x, y, flags, param):
global roi_start, roi_end, selecting_roi, frame_with_box
if event == cv2.EVENT_LBUTTONDOWN:
selecting_roi = True
roi_start = (x, y)
roi_end = (x, y)
elif event == cv2.EVENT_MOUSEMOVE:
if selecting_roi:
roi_end = (x, y)
elif event == cv2.EVENT_LBUTTONUP:
selecting_roi = False
roi_end = (x, y)
cv2.rectangle(frame_with_box, roi_start, roi_end, (0, 255, 0), 2)
selecting_roi = False
roi_start = (0, 0)
roi_end = (0, 0)
frame_with_box = None
# Set the mouse callback function for ROI selection
cv2.namedWindow("ROI Selector")
cv2.setMouseCallback("ROI Selector", draw_roi_box)
st.text("Select ROI by clicking and dragging on the 'ROI Selector' window.")
# Display the camera input widget
img_file_buffer = st.camera_input("Take a picture")
if img_file_buffer is not None:
# Convert the file-like object to a PIL image
img = Image.open(img_file_buffer)
img_array = np.array(img) # Convert PIL Image to numpy array
st.text("Press 'q' to exit the video stream")
while True:
ret, frame = cap.read()
if not ret:
st.error("Failed to capture image")
break
frame_with_box = frame.copy()
if not selecting_roi:
cv2.rectangle(frame_with_box, roi_start, roi_end, (0, 255, 0), 2)
cv2.imshow("ROI Selector", frame_with_box)
key = cv2.waitKey(1) & 0xFF
if key == 13: # Enter key
break
cv2.destroyWindow("ROI Selector")
# Crop the selected ROI
roi = frame[roi_start[1]:roi_end[1], roi_start[0]:roi_end[0]]
while True:
ret, frame = cap.read()
if not ret:
break
# Resize frame for consistent processing
frame = cv2.resize(frame, (1020, 500))
# Perform object detection on the selected ROI
results = model(roi)
# Draw bounding boxes and labels
for index, row in results.pandas().xyxy[0].iterrows():
x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
label = row['name']
cv2.rectangle(roi, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(roi, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36, 255, 12), 2)
# Display the resulting frame with detections
st.image(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()