import streamlit as st import cv2 import numpy as np import tempfile from collections import Counter import pandas as pd import pyttsx3 # import streamlit.components.v1 as components # # embed streamlit docs in a streamlit app # components.iframe("https://nafisrayan.github.io/ThreeJS-Hand-Control-Panel/", height=500, width=500) p_time = 0 st.sidebar.title('Settings') model_type = st.sidebar.selectbox( 'Choose YOLO Model', ('YOLOv8', 'YOLOv9', 'YOLOv10') ) st.title(f'{model_type} Predictions') sample_img = cv2.imread('logo2.jpg') FRAME_WINDOW = st.image(sample_img, channels='BGR') cap = None def speak(audio): engine = pyttsx3.init('sapi5') voices = engine.getProperty('voices') engine.setProperty('voice', voices[1].id) engine.say(audio) engine.runAndWait() # Inference Mode options = st.sidebar.radio( 'Options:', ('Webcam', 'Image', 'Video'), index=1) # removed RTSP for now # YOLOv8 Model if model_type == 'YOLOv8': path_model_file = 'yolov8m.pt' from ultralytics import YOLO model = YOLO(path_model_file) if model_type == 'YOLOv9': path_model_file = 'yolov9c.pt' from ultralytics import YOLO model = YOLO(path_model_file) if model_type == 'YOLOv10': st.caption("Work in Progress... >_<") # path_model_file = 'yolov10n.pt' # from ultralytics import YOLO # model = YOLO(path_model_file) # Load Class names class_labels = model.names # Confidence confidence = st.sidebar.slider( 'Detection Confidence', min_value=0.0, max_value=1.0, value=0.25) # Draw thickness draw_thick = st.sidebar.slider( 'Draw Thickness:', min_value=1, max_value=20, value=3 ) color_pick_list = [None]*len(class_labels) # Image if options == 'Image': upload_img_file = st.sidebar.file_uploader( 'Upload Image', type=['jpg', 'jpeg', 'png']) if upload_img_file is not None: pred = st.checkbox(f'Predict Using {model_type}') file_bytes = np.asarray( bytearray(upload_img_file.read()), dtype=np.uint8) img = cv2.imdecode(file_bytes, 1) FRAME_WINDOW.image(img, channels='BGR') # st.caption(model(img)[0][0]) if pred: def predict(model, imag, classes=[], conf=confidence): if classes: results = model.predict(imag, classes=classes, conf=confidence) else: results = model.predict(imag, conf=conf) return results def predict_and_detect(model, img, classes=[], conf=confidence, rectangle_thickness=draw_thick, text_scale=draw_thick, text_thickness=draw_thick): results = predict(model, img, classes, conf=conf) # Initialize a Counter to keep track of class occurrences class_counts = Counter() for result in results: for box in result.boxes: # Update the counter with the class name class_name = result.names[int(box.cls[0])] class_counts[class_name] += 1 # Draw the bounding box and label with a random color color = tuple(np.random.randint(0, 255, size=3).tolist()) cv2.rectangle(img, (int(box.xyxy[0][0]), int(box.xyxy[0][1])), (int(box.xyxy[0][2]), int(box.xyxy[0][3])), color, rectangle_thickness) cv2.putText(img, f"{class_name}", (int(box.xyxy[0][0]), int(box.xyxy[0][1]) - 10), cv2.FONT_HERSHEY_PLAIN, text_scale, color, text_thickness) # Convert the Counter to a DataFrame for easy viewing df_fq = pd.DataFrame.from_dict(class_counts, orient='index', columns=['Number']) df_fq.index.name = 'Class' return img, df_fq img, df_fq = predict_and_detect(model, img, classes=[], conf=confidence) FRAME_WINDOW.image(img, channels='BGR') # Updating Inference results with st.container(): st.markdown("

Inference Statistics

", unsafe_allow_html=True) st.markdown("

Detected objects in curret Frame

", unsafe_allow_html=True) st.dataframe(df_fq) # print("🚀 ~ df_fq:", df_fq) list_of_tuples = [(row.Number, row.Index) for row in df_fq.itertuples()] print("🚀 ~ list_of_tuples:", list_of_tuples) speak(f'This is what I have found {list_of_tuples}') # Video if options == 'Video': upload_video_file = st.sidebar.file_uploader( 'Upload Video', type=['mp4', 'avi', 'mkv']) if upload_video_file is not None: pred = st.checkbox(f'Predict Using {model_type}') tfile = tempfile.NamedTemporaryFile(delete=False) tfile.write(upload_video_file.read()) cap = cv2.VideoCapture(tfile.name) while True: success, img = cap.read() if not success: st.error(f"Video NOT working\nCheck Video settings!", icon="🚨") break if pred: def predict(model, img, classes=[], conf=confidence): if classes: results = model.predict(img, classes=classes, conf=confidence) else: results = model.predict(img, conf=conf) return results def predict_and_detect(model, img, classes=[], conf=confidence, rectangle_thickness=draw_thick, text_scale=draw_thick, text_thickness=draw_thick): results = predict(model, img, classes, conf=conf) # Initialize a Counter to keep track of class occurrences class_counts = Counter() for result in results: for box in result.boxes: # Update the counter with the class name class_name = result.names[int(box.cls[0])] class_counts[class_name] += 1 # Draw the bounding box and label with a random color color = tuple(np.random.randint(0, 255, size=3).tolist()) cv2.rectangle(img, (int(box.xyxy[0][0]), int(box.xyxy[0][1])), (int(box.xyxy[0][2]), int(box.xyxy[0][3])), color, rectangle_thickness) cv2.putText(img, f"{class_name}", (int(box.xyxy[0][0]), int(box.xyxy[0][1]) - 10), cv2.FONT_HERSHEY_PLAIN, text_scale, color, text_thickness) # Convert the Counter to a DataFrame for easy viewing df_fq = pd.DataFrame.from_dict(class_counts, orient='index', columns=['Number']) df_fq.index.name = 'Class' return img, df_fq img, df_fq = predict_and_detect(model, img, classes=[], conf=confidence) FRAME_WINDOW.image(img, channels='BGR') # Updating Inference results with st.container(): st.markdown("

Inference Statistics

", unsafe_allow_html=True) st.markdown("

Detected objects in current Frame

", unsafe_allow_html=True) st.dataframe(df_fq) # print("🚀 ~ df_fq:", df_fq) list_of_tuples = [(row.Number, row.Index) for row in df_fq.itertuples()] print("🚀 ~ list_of_tuples:", list_of_tuples) # speak(f'This is what I have found {list_of_tuples}') # Webcam if options == 'Webcam': cam_options = st.sidebar.selectbox('Select Webcam Channel', ('0', '1', '2', '3')) if not cam_options == 'Select Channel': pred = st.checkbox(f'Predict Using {model_type}') cap = cv2.VideoCapture(int(cam_options)) while True: success, img = cap.read() if not success: st.error(f"Webcam NOT working\nCheck Webcam settings!", icon="🚨") break if pred: def predict(model, img, classes=[], conf=confidence): if classes: results = model.predict(img, classes=classes, conf=confidence) else: results = model.predict(img, conf=conf) return results def predict_and_detect(model, img, classes=[], conf=confidence, rectangle_thickness=draw_thick, text_scale=draw_thick, text_thickness=draw_thick): results = predict(model, img, classes, conf=conf) # Initialize a Counter to keep track of class occurrences class_counts = Counter() for result in results: for box in result.boxes: # Update the counter with the class name class_name = result.names[int(box.cls[0])] class_counts[class_name] += 1 # Draw the bounding box and label with a random color color = tuple(np.random.randint(0, 255, size=3).tolist()) cv2.rectangle(img, (int(box.xyxy[0][0]), int(box.xyxy[0][1])), (int(box.xyxy[0][2]), int(box.xyxy[0][3])), color, rectangle_thickness) cv2.putText(img, f"{class_name}", (int(box.xyxy[0][0]), int(box.xyxy[0][1]) - 10), cv2.FONT_HERSHEY_PLAIN, text_scale, color, text_thickness) # Convert the Counter to a DataFrame for easy viewing df_fq = pd.DataFrame.from_dict(class_counts, orient='index', columns=['Number']) df_fq.index.name = 'Class' return img, df_fq img, df_fq = predict_and_detect(model, img, classes=[], conf=confidence) FRAME_WINDOW.image(img, channels='BGR') # Updating Inference results with st.container(): st.markdown("

Inference Statistics

", unsafe_allow_html=True) st.markdown("

Detected objects in current Frame

", unsafe_allow_html=True) st.dataframe(df_fq) # print("🚀 ~ df_fq:", df_fq) list_of_tuples = [(row.Number, row.Index) for row in df_fq.itertuples()] print("🚀 ~ list_of_tuples:", list_of_tuples) # speak(f'This is what I have found {list_of_tuples}')