import streamlit as st import os from PIL import Image import torch import cv2 from pathlib import Path from detect_dual import run as yolo_run_detection os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' def add_logo(logo_path, size=(200, 150)): logo = Image.open(logo_path) logo = logo.resize(size) st.image(logo, use_column_width=False) def run_detection(source_path): output_dir = Path("runs/detect/exp") yolo_run_detection( weights="models/detect/yolo9trGPR.pt", # Adjust this path to your model weights source=source_path, imgsz=(640, 640), conf_thres=0.25, iou_thres=0.45, max_det=1000, device='', view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=output_dir.parent, name=output_dir.name, exist_ok=True, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False, vid_stride=1, ) output_path = output_dir / Path(source_path).name return str(output_path) def process_video(video_path): cap = cv2.VideoCapture(video_path) if not cap.isOpened(): raise ValueError(f"Unable to open video file: {video_path}") frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) for i in range(0, frame_count, 10): cap.set(cv2.CAP_PROP_POS_FRAMES, i) ret, frame = cap.read() if ret: frame_path = f"temp_frame_{i}.jpg" cv2.imwrite(frame_path, frame) output_frame = run_detection(frame_path) yield output_frame os.remove(frame_path) # Clean up temporary frame file else: break cap.release() def main(): st.title("YOLO9tr GPR detection") add_logo("logo_ai.jpg") source_type = st.radio("Select source type:", ("Image", "Video")) if source_type == "Image": uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"]) if uploaded_file is not None: source_path = "temp_image.jpg" with open(source_path, "wb") as f: f.write(uploaded_file.getbuffer()) else: source_path = "GPR_example.jpg" # Default image st.image(source_path, caption="Image for Detection", use_column_width=True) if st.button("Run Detection"): with st.spinner("Running detection..."): output_path = run_detection(source_path) st.image(output_path, caption="Detection Result", use_column_width=True) elif source_type == "Video": uploaded_file = st.file_uploader("Choose a video...", type=["mp4", "avi", "mov"]) if uploaded_file is not None: source_path = "temp_video.mp4" with open(source_path, "wb") as f: f.write(uploaded_file.getbuffer()) if st.button("Run Detection"): try: with st.spinner("Running detection..."): output_frames = process_video(source_path) result_placeholder = st.empty() for frame in output_frames: result_placeholder.image(frame, caption="Detection Result", use_column_width=True) except Exception as e: st.error(f"An error occurred: {str(e)}") finally: if os.path.exists(source_path): os.remove(source_path) # Clean up temporary video file if __name__ == "__main__": main()