File size: 8,828 Bytes
ab3d215
 
 
 
 
 
 
 
 
bf123e7
ab3d215
bf123e7
 
 
 
ab3d215
 
 
bf123e7
 
 
 
 
 
 
 
 
 
ab3d215
 
 
 
 
 
bf123e7
 
 
ab3d215
 
 
bf123e7
ab3d215
bf123e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab3d215
bf123e7
ab3d215
 
 
 
 
 
bf123e7
 
ab3d215
bf123e7
ab3d215
 
 
 
 
bf123e7
ab3d215
bf123e7
 
ab3d215
bf123e7
ab3d215
bf123e7
 
 
 
 
 
 
ab3d215
bf123e7
ab3d215
bf123e7
 
ab3d215
bf123e7
ab3d215
 
 
 
bf123e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab3d215
 
 
 
bf123e7
 
ab3d215
bf123e7
 
 
ab3d215
 
bf123e7
 
 
ab3d215
 
bf123e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab3d215
 
bf123e7
ab3d215
 
 
bf123e7
 
ab3d215
 
bf123e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
import streamlit as st
import tensorflow as tf
import numpy as np
import cv2
from huggingface_hub import hf_hub_download
from tensorflow.keras.models import load_model
from io import BytesIO
from PIL import Image
import requests
# os module ki ab yahan directly zaroorat nahi hai, kyunki cache_dir specify nahi ho raha.

# IMPORTANT: Ensure your `requirements.txt` includes tensorflow==2.10.0 or 2.15.0.
# The `get_config` error often stems from incompatible TensorFlow versions.

# Download model from Hugging Face
repo_id = "Hammad712/closed_eye_detection"
filename = "Closed_Eye_Detection_98.h5"

try:
    # Download the model to a local temporary file
    # Removing cache_dir as Hugging Face handles caching internally
    model_path = hf_hub_download(repo_id=repo_id, filename=filename)
    # Load the downloaded model
    model = load_model(model_path)
    st.success("Model loaded successfully!")
except Exception as e:
    st.error(f"Error loading model: {e}. Please ensure correct TensorFlow version in requirements.txt.")
    st.stop() # Stop the app if there's an error

# Set image dimensions
img_height, img_width = 150, 150

# Custom CSS
def set_css(style):
    """
    Function to apply custom CSS to the webpage.
    """
    st.markdown(f"<style>{style}</style>", unsafe_allow_html=True)

combined_css = """
    /* Main background and text colors */
    .main, .sidebar .sidebar-content { background-color: #1c1c1c; color: #f0f2f6; }
    /* Styling for the main content block */
    .block-container { padding: 1rem 2rem; background-color: #333; border-radius: 10px; box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.5); margin-bottom: 20px; }
    /* Button styling */
    .stButton>button, .stDownloadButton>button {
        background: linear-gradient(135deg, #ff7e5f, #feb47b); /* Colorful gradient */
        color: white;
        border: none;
        padding: 10px 24px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 4px 2px;
        cursor: pointer;
        border-radius: 5px;
        transition: all 0.3s ease; /* Smooth transition */
    }
    .stButton>button:hover, .stDownloadButton>button:hover {
        opacity: 0.9;
        transform: translateY(-2px); /* Lift slightly on hover */
    }
    /* Spinner color */
    .stSpinner { color: #4CAF50; }
    /* Title styling */
    .title {
        font-size: 3rem;
        font-weight: bold;
        display: flex;
        align-items: center;
        justify-content: center;
        text-shadow: 2px 2px 5px rgba(0,0,0,0.7); /* Shadow on title */
        margin-bottom: 20px;
    }
    /* Colorful text (gradient) */
    .colorful-text {
        background: -webkit-linear-gradient(135deg, #ff7e5f, #feb47b);
        -webkit-background-clip: text;
        -webkit-text-fill-color: transparent;
    }
    /* Black-white text */
    .black-white-text {
        color: white; /* White color will look better */
        margin-left: 10px; /* Give a little spacing */
    }
    /* Input field styling */
    .small-input .stTextInput>div>input {
        height: 2.5rem;
        font-size: 1rem;
        border-radius: 8px;
        border: 1px solid #ff7e5f; /* Border matching gradient color */
        background-color: #444;
        color: #f0f2f6;
        padding: 0 10px;
    }
    /* File uploader styling */
    .small-file-uploader .stFileUploader>div>div {
        height: 2.5rem;
        font-size: 1rem;
    }
    /* Custom text (subtitle) */
    .custom-text {
        font-size: 1.2rem;
        color: #feb47b;
        text-align: center;
        margin-top: -10px; /* Bring closer to title */
        margin-bottom: 30px; /* More space at bottom */
    }
    /* Style for expander title */
    .stExpander {
        border: 1px solid #feb47b;
        border-radius: 10px;
        background-color: #282828;
    }
    .stExpander div[data-baseweb="button"] {
        color: #feb47b !important;
        font-weight: bold;
    }
    .stExpander > div > div > div > div > p {
        color: #f0f2f6 !important;
    }
"""

# Streamlit application
st.set_page_config(layout="centered", page_title="Eye Detection") # Center layout, add a page title
set_css(combined_css)

# Title and subtitle
st.markdown('<div class="title"><span class="colorful-text">آँख</span> <span class="black-white-text">डिटेक्शन मॉडल</span></div>', unsafe_allow_html=True)
st.markdown('<div class="custom-text">यह पहचानने के लिए एक छवि अपलोड करें या URL प्रदान करें कि आँखें खुली हैं या बंद।</div>', unsafe_allow_html=True)

# Input for image URL or path
with st.expander("इनपुट विकल्प", expanded=True):
    url = st.text_input("छवि URL दर्ज करें", "")
    uploaded_file = st.file_uploader("या एक छवि अपलोड करें", type=["jpg", "jpeg", "png"])

def load_image_from_url(url):
    """
    Function to load an image from a URL.
    """
    if not url:
        return None
    try:
        response = requests.get(url, timeout=10) # Add a 10-second timeout
        response.raise_for_status() # Raise an exception for HTTP errors
        img = Image.open(BytesIO(response.content)).convert('RGB')
        return np.array(img)
    except requests.exceptions.Timeout:
        st.error("Error: Timeout while downloading image from URL.")
        return None
    except requests.exceptions.RequestException as e:
        st.error(f"Error fetching image from URL: {e}")
        return None
    except Exception as e:
        st.error(f"Error processing image from URL: {e}")
        return None

if uploaded_file is not None or url:
    image = None
    if uploaded_file is not None:
        # Read the uploaded image
        file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8)
        image = cv2.imdecode(file_bytes, 1) # OpenCV reads in BGR format
        st.session_state['current_image'] = image # Save image to session state
    elif url:
        # Read the image from URL
        with st.spinner('URL से छवि लोड हो रही है...'):
            image = load_image_from_url(url)
        if image is not None:
            image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # PIL gives RGB, OpenCV wants BGR
            st.session_state['current_image'] = image # Save image to session state
        else:
            st.warning("No valid image loaded from URL.")
            st.session_state['current_image'] = None

    if st.session_state.get('current_image') is not None:
        image_to_predict = st.session_state['current_image']
        # Resize and preprocess the image
        resized_image = cv2.resize(image_to_predict, (img_height, img_width))
        # Reshape for model input (batch_size, height, width, channels)
        input_image = resized_image.reshape((1, img_height, img_width, 3)) / 255.0

        # Perform inference
        with st.spinner('अनुमान लगाया जा रहा है...'):
            predictions = model.predict(input_image)
        prediction = predictions[0][0] # Get the single scalar value

        def get_label(prediction_value):
            """
            Get the label based on the prediction value.
            """
            return "खुली आँख" if prediction_value >= 0.5 else "बंद आँख"

        label = get_label(prediction)

        # Display the image and prediction
        st.image(image_to_predict, channels="BGR", caption='अपलोड की गई छवि' if uploaded_file is not None else 'URL से छवि', use_column_width=True)
        
        # Predicted result in bold and larger font
        st.markdown(f"### **अनुमान:** `{prediction:.4f}`")
        st.markdown(f"### **लेबल:** <span class='{'colorful-text' if label == 'खुली आँख' else 'black-white-text'}' style='font-size: 2rem;'>{label}</span>", unsafe_allow_html=True)
        
        # Download button for the uploaded image (optional)
        img_byte_arr = BytesIO()
        # Convert from OpenCV (BGR) to PIL (RGB) so PIL can save correctly
        img_pil = Image.fromarray(cv2.cvtColor(image_to_predict, cv2.COLOR_BGR2RGB))
        img_pil.save(img_byte_arr, format='JPEG')
        img_byte_arr = img_byte_arr.getvalue()

        st.download_button(
            label="छवि डाउनलोड करें",
            data=img_byte_arr,
            file_name="processed_eye_image.jpg",
            mime="image/jpeg"
        )
    else:
        st.info("कृपया आगे बढ़ने के लिए एक छवि अपलोड करें या URL प्रदान करें।")