import logging import queue from collections import deque import json import tempfile import streamlit as st from streamlit_webrtc import WebRtcMode, webrtc_streamer, RTCConfiguration from utils import SLInference logger = logging.getLogger(__name__) RTC_CONFIGURATION = RTCConfiguration({ "iceServers": [{"urls": ["stun:stun.l.google.com:19302"]}] }) def main(): """ Main function of the app. """ config = { "path_to_model": "S3D.onnx", "threshold": 0.3, "topk": 5, "path_to_class_list": "RSL_class_list.txt", "window_size": 32, "provider": "OpenVINOExecutionProvider" } # Сохранение конфигурации во временный файл with tempfile.NamedTemporaryFile(delete=False, mode='w', suffix='.json') as config_file: json.dump(config, config_file) config_file_path = config_file.name inference_thread = SLInference(config_file_path) inference_thread.start() # --- СТИЛЬНЫЙ БЛОК С ОПИСАНИЕМ --- st.markdown("""

📷 Live Camera Recognition

This application is designed to recognize sign language using a webcam feed.
The model has been trained to recognize various sign language gestures and display the corresponding text in real-time.

The project is open for collaboration. If you have any suggestions or want to contribute, please feel free to reach out.

""", unsafe_allow_html=True) # Камера webrtc_ctx = webrtc_streamer( key="video-sendonly", mode=WebRtcMode.SENDONLY, rtc_configuration=RTC_CONFIGURATION, media_stream_constraints={"video": True, "audio": False}, ) gestures_deque = deque(maxlen=5) image_place = st.empty() text_output = st.empty() last_5_gestures = st.empty() while True: if webrtc_ctx.video_receiver: try: video_frame = webrtc_ctx.video_receiver.get_frame(timeout=1) except queue.Empty: logger.warning("Queue is empty") continue img_rgb = video_frame.to_ndarray(format="rgb24") image_place.image(img_rgb, caption="📸 Live Feed", use_column_width=True) inference_thread.input_queue.append(video_frame.reformat(224, 224).to_ndarray(format="rgb24")) gesture = inference_thread.pred if gesture not in ['no', '']: if not gestures_deque or gesture != gestures_deque[-1]: gestures_deque.append(gesture) text_output.markdown( f'

🖐️ Current gesture: {gesture}

', unsafe_allow_html=True ) last_5_gestures.markdown( f'

🧠 Last 5 gestures: {" | ".join(gestures_deque)}

', unsafe_allow_html=True ) if __name__ == "__main__": main()