Spaces:
Sleeping
Sleeping
File size: 4,880 Bytes
e817788 |
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 |
import streamlit as st
import mediapipe as mp
import cv2 as cv
import numpy as np
import tempfile
import time
# developer modules
from functions import draw_styled_landmarks, real_time_prediction
from params import LENGTH, SELECTED_SIGNS, TRANSITION_FRAMES, SELECTED_LABELS, MODEL
# ------------------------------
# Basic App Scaffolding
# ------------------------------
# Title
st.title('SignMeUp')
# Markdown styling
st.markdown(
"""
<style>
[data-testid="stSidebar"][aria-expanded="true"] > div:first-child{
width: 350px
}
[data-testid="stSidebar"][aria-expanded="false"] > div:first-child{
width: 350px
margin-left: -350px
}
</style>
""",
unsafe_allow_html=True,
)
# Create Sidebar
st.sidebar.title('SignMeUp Sidebar')
st.sidebar.subheader('Parameter')
# Define available pages in selection box
app_mode = st.sidebar.selectbox(
'App Mode',
['Video Recognition', 'About', 'Contact']
)
# ------------------------------
# About Page
# ------------------------------
if app_mode == 'About':
st.markdown('''
## About \n
In this application we are using **MediaPipe** landmark prediction for recognizing American Sign Language. **StreamLit** is used to create the Web Graphical User Interface (GUI) \n
- [Github](https://github.com/vosmani36/Capstone_Project_SignMeUp/tree/main/notebooks) \n
''')
## Add Sidebar and Window style
st.markdown(
"""
<style>
[data-testid="stSidebar"][aria-expanded="true"] > div:first-child{
width: 350px
}
[data-testid="stSidebar"][aria-expanded="false"] > div:first-child{
width: 350px
margin-left: -350px
}
</style>
""",
unsafe_allow_html=True,
)
# ------------------------------
# Video Recognition Page
# ------------------------------
elif app_mode == 'Video Recognition':
st.set_option('deprecation.showfileUploaderEncoding', False)
use_webcam = st.sidebar.button('Use Webcam')
## Get Video
stframe = st.empty()
temp_file = tempfile.NamedTemporaryFile(delete=False)
if use_webcam:
video = cv.VideoCapture(0)
else:
video = cv.VideoCapture('https://cdn.dribbble.com/users/17914/screenshots/4902225/video-placeholder.png')
width = int(video.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv.CAP_PROP_FRAME_HEIGHT))
fps_input = int(video.get(cv.CAP_PROP_FPS))
## Recording
fps = 0
sign_recognized = ' '
prob_recognized = 0
i = 0
kpil, kpil2, kpil3 = st.columns(3)
with kpil:
st.markdown('**Frame Rate**')
kpil_text = st.markdown('0')
with kpil2:
st.markdown('**Sign**')
kpil2_text = st.markdown('0')
with kpil3:
st.markdown('**Probability**')
kpil3_text = st.markdown('0')
st.markdown('<hr/>', unsafe_allow_html=True)
## Live Video Mediapipe Holistic
# New detection variables
sequence = [] # to collect all 22 frames for prediction
sentence = [] # history of all predictions (predicted words)
predictions = []
threshold = 0.5 # confidence metrics (only render prediction results, if confidence is above threshold)
# Real-time prediction
with mp.solutions.holistic.Holistic(
min_detection_confidence=0.5,
min_tracking_confidence=0.5
) as holistic:
prevTime = 0
while video.isOpened():
i +=1
ret, frame = video.read()
if not ret:
continue
# Make MediaPipe detections
results = holistic.process(frame)
# Draw detected landmarks
draw_styled_landmarks(frame, results)
# Real-time prediction
sign_recognized, prob_recognized = real_time_prediction(results, sequence, predictions, threshold, LENGTH, MODEL, SELECTED_LABELS, TRANSITION_FRAMES, SELECTED_SIGNS)
# FPS Counter
currTime = time.time()
fps = 1/(currTime - prevTime)
prevTime = currTime
# Dashboard
kpil_text.write(f"<h1 style='text-align: center; color:(52, 75, 102);'>{int(fps)}</h1>", unsafe_allow_html=True)
kpil2_text.write(f"<h1 style='text-align: center; color:(52, 75, 102);'>{sign_recognized}</h1>", unsafe_allow_html=True)
kpil3_text.write(f"<h1 style='text-align: center; color:(52, 75, 102);'>{prob_recognized}</h1>",
unsafe_allow_html=True)
frame = cv.resize(frame,(0,0), fx=0.8, fy=0.8)
stframe.image(frame,channels='BGR', use_column_width=True) |