# Python In-built packages from pathlib import Path import PIL # External packages import streamlit as st import algorithm import helper # Local Modules import settings st.set_page_config( page_title="YOLOv8 目标检测", page_icon="🤖", layout="wide", initial_sidebar_state="expanded" # 或者 "collapsed" ) # # Main page heading st.title("目标检测预览") # Sidebar st.sidebar.header("模型配置") # Model Options model_type = st.sidebar.selectbox( "任务选择", ['检测', '分割',"周界入侵","安防检测"]) confidence = float(st.sidebar.slider( "选择模型Confidence", 25, 100, 40)) / 100 # Selecting Detection Or Segmentation if model_type == '检测': model_path = Path(settings.DETECTION_MODEL) elif model_type == '分割': model_path = Path(settings.SEGMENTATION_MODEL) elif model_type == "周界入侵": model_path = Path(settings.DETECTION_MODEL) elif model_type == "安防检测": model_path = Path(settings.SECURITY_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("图像/视频 配置") source_radio = st.sidebar.radio( "选择来源", settings.SOURCES_LIST) source_img = None # If image is selected if source_radio == settings.IMAGE: source_img = st.sidebar.file_uploader( "选择一张图像...", 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="默认图像", 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='检测图像', use_column_width=True) else: if st.sidebar.button('检测目标'): 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.RTSP: if model_type == '检测': algorithm.YoloV8Detection().play_rtsp_stream(confidence,model) elif model_type == '分割': algorithm.YoloV8Detection().play_rtsp_stream(confidence,model) elif model_type == "周界入侵": algorithm.BoundaryDetection().play_rtsp_stream(confidence,model) elif model_type == "安防检测": algorithm.YoloV8Detection().play_rtsp_stream(confidence,model) #helper.play_rtsp_stream(confidence, model) else: st.error("Please select a valid source type!")