Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import tensorflow as tf | |
| from tensorflow import keras | |
| from PIL import Image | |
| import numpy as np | |
| IMG_SIZE = (224, 224) | |
| MODEL_PATH = "src/final_model.h5" | |
| st.set_page_config( | |
| page_title="Person Detector", | |
| page_icon="👤", | |
| layout="centered", | |
| ) | |
| def load_model(): | |
| model = keras.models.load_model(MODEL_PATH) | |
| return model | |
| model = load_model() | |
| def preprocess_image(image: Image.Image): | |
| image = image.convert("RGB") | |
| image = image.resize(IMG_SIZE) | |
| img_array = np.array(image) | |
| img_array = tf.keras.applications.efficientnet.preprocess_input(img_array) | |
| img_array = np.expand_dims(img_array, axis=0) | |
| return img_array | |
| def show_result(prob): | |
| is_person = prob >= 0.5 | |
| confidence = prob if is_person else 1.0 - prob | |
| if is_person: | |
| st.success("**👤 PERSON**") | |
| else: | |
| st.warning("**🚫 NON-PERSON**") | |
| st.metric( | |
| label="🎯 Độ tin cậy", | |
| value=f"{confidence * 100:.1f}%") | |
| st.title("👤 _:blue[Person Detector]_") | |
| st.markdown("**TRẦN HẢI NAM - 223332840**") | |
| st.markdown("---") | |
| if "upload_result" not in st.session_state: | |
| st.session_state.upload_result = None | |
| if "last_uploaded_file" not in st.session_state: | |
| st.session_state.last_uploaded_file = None | |
| col_img, col_result = st.columns([3, 2]) | |
| with col_img: | |
| st.markdown("#### 🖼️ Chọn ảnh") | |
| uploaded_file = st.file_uploader( | |
| "Chọn ảnh...", | |
| type=["jpg", "jpeg", "png"], | |
| label_visibility="collapsed" | |
| ) | |
| if uploaded_file is not None: | |
| current_file_name = uploaded_file.name | |
| if st.session_state.last_uploaded_file != current_file_name: | |
| st.session_state.upload_result = None | |
| st.session_state.last_uploaded_file = current_file_name | |
| image = Image.open(uploaded_file) | |
| st.image(image) | |
| if st.button("🔍 Dự đoán", type="primary", use_container_width=True): | |
| with st.spinner("⏳ Đang dự đoán..."): | |
| img_array = preprocess_image(image) | |
| prob = float(model.predict(img_array, verbose=0)[0][0]) | |
| st.session_state.upload_result = prob | |
| else: | |
| st.session_state.upload_result = None | |
| st.session_state.last_uploaded_file = None | |
| with col_result: | |
| st.markdown("#### 📊 Kết quả dự đoán") | |
| with st.container(border=True): | |
| if st.session_state.upload_result is not None: | |
| show_result(st.session_state.upload_result) |