Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import cv2 | |
| import numpy as np | |
| import joblib | |
| import mediapipe as mp | |
| from PIL import Image | |
| import os | |
| import tempfile | |
| # Load the trained MLP Classifier model | |
| model = joblib.load('mlp_model.joblib') | |
| # Loading the class dictionary | |
| class_names = {i: str(i) for i in range(10)} # For numbers 0-9 | |
| class_names.update({10 + i: chr(97 + i) for i in range(26)}) # For letters a-z | |
| # Initialize MediaPipe Hand model | |
| mp_hands = mp.solutions.hands | |
| hands = mp_hands.Hands(static_image_mode=True, max_num_hands=1, min_detection_confidence=0.5) | |
| def skeletal_image(image_path, shape=(256, 256, 3)): | |
| image = cv2.imread(image_path) | |
| image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) | |
| results = hands.process(image_rgb) | |
| if not results.multi_hand_landmarks: | |
| return None | |
| white_background = np.ones(shape, dtype=np.uint8) * 255 | |
| for hand_landmarks in results.multi_hand_landmarks: | |
| mp.solutions.drawing_utils.draw_landmarks(white_background, hand_landmarks, mp_hands.HAND_CONNECTIONS) | |
| white_background_bgr = cv2.cvtColor(white_background, cv2.COLOR_RGB2BGR) | |
| return white_background_bgr | |
| # Function to extract landmarks from an uploaded image | |
| def extract_landmarks(image_path): | |
| image = cv2.imread(image_path) | |
| results = hands.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) | |
| if results.multi_hand_landmarks: | |
| # Extract landmarks | |
| landmarks = np.array([[lm.x, lm.y, lm.z] for lm in results.multi_hand_landmarks[0].landmark]).flatten() | |
| return landmarks | |
| return None | |
| # Streamlit app | |
| st.title('Hand Gesture Recognition') | |
| # Option for the user to choose the input method | |
| input_method = st.radio("Choose the input method:", ("Upload an Image", "Use Webcam")) | |
| if input_method == "Upload an Image": | |
| uploaded_file = st.file_uploader("Upload an Image", type=["jpg", "jpeg", "png"]) | |
| if uploaded_file is not None: | |
| uploaded_image = Image.open(uploaded_file).convert('RGB') | |
| elif input_method == "Use Webcam": | |
| uploaded_file = st.camera_input("Take a picture") | |
| if uploaded_file is not None: | |
| uploaded_image = Image.open(uploaded_file).convert('RGB') | |
| if uploaded_file is not None: | |
| st.image(uploaded_image, caption='Uploaded Image', use_column_width=True) | |
| # Save the uploaded or captured image to a temporary file | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmpfile: | |
| uploaded_image.save(tmpfile, format="JPEG") | |
| tmpfile_path = tmpfile.name | |
| try: | |
| skeletal_img = skeletal_image(tmpfile_path) | |
| if skeletal_img is not None: | |
| st.image(skeletal_img, channels="BGR", caption='This processed image contains your hand landmarks') | |
| processed_image = extract_landmarks(tmpfile_path) | |
| if processed_image is not None: | |
| with st.spinner('Please wait, while the model predicts...'): | |
| # Reshape the processed_image for the model if necessary | |
| processed_image = processed_image.reshape(1, -1) # Reshape if your model expects a specific input shape | |
| predictions = model.predict(processed_image) | |
| predicted_class_name = class_names[predictions[0]] | |
| # Display the prediction | |
| st.write(f"The predicted ASL sign seems to be {predicted_class_name.upper()}") | |
| else: | |
| st.write("No hand landmarks were detected.") | |
| finally: | |
| # Ensure the temporary file is deleted even if an error occurs | |
| os.remove(tmpfile_path) | |