wayandadang's picture
first commit
22b2bcd
raw
history blame contribute delete
No virus
4.55 kB
# Python In-built packages
from pathlib import Path
import PIL
import time
# External packages
import streamlit as st
import cv2
# Local Modules
import settings
import helper
# Setting page layout
st.set_page_config(
page_title="Object Detection using YOLOv9",
page_icon="🤖",
layout="wide",
initial_sidebar_state="expanded"
)
# Main page heading
st.title("Object Detection using YOLOv9")
# Sidebar
st.sidebar.header("ML Model Config")
# Model Options
model_type = st.sidebar.radio(
"Select Task", ['Detection', 'Segmentation'])
confidence = float(st.sidebar.slider(
"Select Model Confidence", 25, 100, 40)) / 100
# Selecting Detection Or Segmentation
if model_type == 'Detection':
model_path = Path(settings.DETECTION_MODEL)
elif model_type == 'Segmentation':
model_path = Path(settings.SEGMENTATION_MODEL)
# Load Pre-trained ML Model
try:
model = helper.load_model(model_path)
except Exception as ex:
st.error(f"Unable to load model. Check the specified path: {model_path}")
st.error(ex)
st.sidebar.header("Image/Video Config")
source_radio = st.sidebar.radio(
"Select Source", settings.SOURCES_LIST)
source_img = None
# If image is selected
if source_radio == settings.IMAGE:
source_img = st.sidebar.file_uploader(
"Choose an image...", type=("jpg", "jpeg", "png", 'bmp', 'webp'))
col1, col2 = st.columns(2)
with col1:
try:
if source_img is None:
default_image_path = str(settings.DEFAULT_IMAGE)
default_image = PIL.Image.open(default_image_path)
st.image(default_image_path, caption="Default Image",
use_column_width=True)
else:
uploaded_image = PIL.Image.open(source_img)
st.image(source_img, caption="Uploaded Image",
use_column_width=True)
except Exception as ex:
st.error("Error occurred while opening the image.")
st.error(ex)
with col2:
if source_img is None:
default_detected_image_path = str(settings.DEFAULT_DETECT_IMAGE)
default_detected_image = PIL.Image.open(
default_detected_image_path)
st.image(default_detected_image_path, caption='Detected Image',
use_column_width=True)
else:
if st.sidebar.button('Detect Objects'):
res = model.predict(uploaded_image,
conf=confidence
)
boxes = res[0].boxes
res_plotted = res[0].plot()[:, :, ::-1]
st.image(res_plotted, caption='Detected Image',
use_column_width=True)
try:
with st.expander("Detection Results"):
for box in boxes:
st.write(box.data)
except Exception as ex:
# st.write(ex)
st.write("No image is uploaded yet!")
elif source_radio == settings.VIDEO:
helper.play_stored_video(confidence, model)
elif source_radio == settings.YOUTUBE:
helper.play_youtube_video(confidence, model)
elif source_radio == settings.WEBCAM: # Adding webcam option
st.sidebar.markdown("**Webcam**")
webcam = cv2.VideoCapture(1)
if not webcam.isOpened():
st.error("Unable to open webcam. Please make sure it's connected.")
else:
webcam_status = st.sidebar.empty()
start_stop_button = st.sidebar.button("Start Webcam")
if start_stop_button:
webcam_started = True
webcam_status.text("Webcam Started!")
while webcam_started:
ret, frame = webcam.read()
if not ret:
st.error("Failed to capture frame from webcam")
break
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Perform object detection on the frame
res = model.predict(frame, conf=confidence)
boxes = res[0].boxes
frame = res[0].plot()[:, :, ::-1]
# Display the frame
st.image(frame, channels="RGB", use_column_width=True)
stop_button = st.sidebar.button("Stop Webcam" + str(hash(time.time()))) # Unique key
if stop_button:
webcam_started = False
webcam_status.text("Webcam Stopped!")
webcam.release()