Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import numpy as np | |
| import cv2 | |
| from keras.models import load_model | |
| from keras.preprocessing.image import img_to_array | |
| from PIL import Image | |
| # Page settings | |
| st.set_page_config(page_title="Smart Face Mask Scanner", layout="centered") | |
| # Load model | |
| def load_model_cached(): | |
| return load_model("Face%20Detector.keras") | |
| model = load_model_cached() | |
| # Load Haar Cascade | |
| face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") | |
| # Detection and Prediction | |
| def detect_and_predict(image_input): | |
| image_np = np.array(image_input.convert("RGB")) | |
| gray = cv2.cvtColor(image_np, cv2.COLOR_RGB2GRAY) | |
| faces = face_cascade.detectMultiScale(gray, 1.1, 4) | |
| if len(faces) == 0: | |
| return image_input, None, "No face detected" | |
| x, y, w, h = faces[0] | |
| face_roi = image_np[y:y+h, x:x+w] | |
| face_pil = Image.fromarray(face_roi).resize((200, 200)) | |
| img_array = img_to_array(face_pil) / 255.0 | |
| img_array = np.expand_dims(img_array, axis=0) | |
| prediction = model.predict(img_array)[0][0] | |
| confidence = (1 - prediction) if prediction < 0.5 else prediction | |
| label = "β Mask Detected" if prediction < 0.5 else "π« No Mask Detected" | |
| color = (0, 255, 0) if prediction < 0.5 else (255, 0, 0) | |
| cv2.rectangle(image_np, (x, y), (x + w, y + h), color, 2) | |
| cv2.putText(image_np, f"{label} ({confidence*100:.2f}%)", (x, y - 10), | |
| cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) | |
| return Image.fromarray(image_np), confidence, label | |
| # App Header | |
| st.markdown("<h2>π· Smart Face Mask Detection App</h2>", unsafe_allow_html=True) | |
| st.markdown(""" | |
| This app allows you to **instantly check if a person is wearing a mask** by uploading an image or using your webcam. | |
| """) | |
| # Tabs with emphasized titles | |
| tab1, tab2 = st.tabs([ | |
| "πΌοΈ **:blue[Upload Image]**", | |
| "π· **:green[Use Webcam]**" | |
| ]) | |
| # Upload Image Tab | |
| with tab1: | |
| st.markdown("#### :blue[Upload a photo to detect mask status]") | |
| uploaded_file = st.file_uploader("Upload an image", type=["jpg", "jpeg", "png"]) | |
| if uploaded_file: | |
| try: | |
| image_input = Image.open(uploaded_file) | |
| st.image(image_input, caption="Uploaded Image", width=300) | |
| with st.spinner("Analyzing..."): | |
| result_img, confidence, label = detect_and_predict(image_input) | |
| st.image(result_img, caption="Detection Result", width=300) | |
| if confidence is not None: | |
| st.metric("Confidence", f"{confidence*100:.2f}%") | |
| if "Mask" in label: | |
| st.success(label) | |
| else: | |
| st.error(label) | |
| else: | |
| st.warning(label) | |
| except Exception as e: | |
| st.error(f"β Error: {str(e)}") | |
| # Webcam Tab | |
| with tab2: | |
| st.markdown("#### :green[Take a picture using webcam to detect mask]") | |
| camera_image = st.camera_input("Take a picture") | |
| if camera_image: | |
| try: | |
| image_input = Image.open(camera_image) | |
| st.image(image_input, caption="Webcam Snapshot", width=300) | |
| with st.spinner("Analyzing..."): | |
| result_img, confidence, label = detect_and_predict(image_input) | |
| st.image(result_img, caption="Detection Result", width=300) | |
| if confidence is not None: | |
| st.metric("Confidence", f"{confidence*100:.2f}%") | |
| if "Mask" in label: | |
| st.success(label) | |
| else: | |
| st.error(label) | |
| else: | |
| st.warning(label) | |
| except Exception as e: | |
| st.error(f"β Error: {str(e)}") | |