Spaces:
Sleeping
Sleeping
from ultralytics import YOLO | |
import time | |
import numpy as np | |
import mediapipe as mp | |
import cv2 | |
from flask import Flask, render_template, request, Response, session, redirect, url_for | |
from flask_socketio import SocketIO | |
import yt_dlp as youtube_dl | |
model_object_detection = YOLO("bisindov2.pt") | |
app = Flask(__name__) | |
app.config['SECRET_KEY'] = 'secret!' | |
socketio = SocketIO(app, async_mode='threading') | |
stop_flag = False | |
# Translation mappings | |
classes_translation = { | |
# Add your translations here | |
} | |
class VideoStreaming(object): | |
def __init__(self): | |
print ("===== Video Streaming =====") | |
self._preview = False | |
self._flipH = False | |
self._detect = False | |
self._mediaPipe = False | |
self._confidence = 75.0 | |
self.mp_hands = mp.solutions.hands | |
self.hands = self.mp_hands.Hands() | |
def confidence(self): | |
return self._confidence | |
def confidence(self, value): | |
self._confidence = int(value) | |
def preview(self): | |
return self._preview | |
def preview(self, value): | |
self._preview = bool(value) | |
def flipH(self): | |
return self._flipH | |
def flipH(self, value): | |
self._flipH = bool(value) | |
def detect(self): | |
return self._detect | |
def detect(self, value): | |
self._detect = bool(value) | |
def mediaPipe(self): | |
return self._mediaPipe | |
def mediaPipe(self, value): | |
self._mediaPipe = bool(value) | |
def show(self, url): | |
print(url) | |
self._preview = False | |
self._flipH = False | |
self._detect = False | |
self._mediaPipe = False | |
self._confidence = 75.0 | |
# Video capture setup | |
ydl_opts = { | |
"quiet": True, | |
"no_warnings": True, | |
"format": "best", | |
"forceurl": True, | |
} | |
cap = cv2.VideoCapture(0 if url == '0' else url) | |
while True: | |
if self._preview: | |
if stop_flag: | |
print("Process Stopped") | |
return | |
grabbed, frame = cap.read() | |
if not grabbed: | |
break | |
if self.flipH: | |
frame = cv2.flip(frame, 1) | |
# Perform YOLO object detection | |
if self.detect: | |
frame_yolo = frame.copy() | |
results_yolo = model_object_detection.predict(frame_yolo, conf=self._confidence / 100) | |
frame_yolo, labels = results_yolo[0].plot() | |
for label in labels: | |
confidence = label.split(" ")[-1] | |
label_name = " ".join(label.split(" ")[:-1]) | |
translated_label = classes_translation.get(label_name, label_name) | |
list_labels = [translated_label, confidence] | |
socketio.emit('label', list_labels) | |
# Process hand landmarks with MediaPipe | |
if self.mediaPipe: | |
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
results = self.hands.process(image) | |
if results.multi_hand_landmarks: | |
for hand_landmarks in results.multi_hand_landmarks: | |
mp.solutions.drawing_utils.draw_landmarks( | |
frame, | |
hand_landmarks, | |
self.mp_hands.HAND_CONNECTIONS, | |
landmark_drawing_spec=mp.solutions.drawing_utils.DrawingSpec(color=(255, 0, 0), thickness=4, circle_radius=3), | |
connection_drawing_spec=mp.solutions.drawing_utils.DrawingSpec(color=(255, 255, 255), thickness=2, circle_radius=2), | |
) | |
frame = cv2.imencode(".jpg", frame)[1].tobytes() | |
yield (b'--frame\r\nContent-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') | |
else: | |
snap = np.zeros((1000, 1000), np.uint8) | |
label = "Streaming Off" | |
H, W = snap.shape | |
font = cv2.FONT_HERSHEY_PLAIN | |
color = (255, 255, 255) | |
cv2.putText(snap, label, (W//2 - 100, H//2), font, 2, color, 2) | |
frame = cv2.imencode(".jpg", snap)[1].tobytes() | |
yield (b'--frame\r\nContent-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') | |
# Initialize VideoStreaming object | |
VIDEO = VideoStreaming() | |
# Flask routes for the web application | |
def homepage(): | |
return render_template('hompage.html') | |
def index(): | |
global stop_flag | |
stop_flag = False | |
if request.method == 'POST': | |
url = request.form['url'] | |
session['url'] = url | |
return redirect(url_for('index')) | |
return render_template('index.html') | |
def video_feed(): | |
url = session.get('url', None) | |
if url is None: | |
return redirect(url_for('homepage')) | |
return Response(VIDEO.show(url), mimetype='multipart/x-mixed-replace; boundary=frame') | |
# Button request routes for controlling settings | |
def request_preview_switch(): | |
VIDEO.preview = not VIDEO.preview | |
return "nothing" | |
def request_flipH_switch(): | |
VIDEO.flipH = not VIDEO.flipH | |
return "nothing" | |
def request_run_model_switch(): | |
VIDEO.detect = not VIDEO.detect | |
return "nothing" | |
def request_mediapipe_switch(): | |
VIDEO.mediaPipe = not VIDEO.mediaPipe | |
return "nothing" | |
def update_slider_value(): | |
slider_value = request.form['sliderValue'] | |
VIDEO.confidence = slider_value | |
return 'OK' | |
def stop_process(): | |
global stop_flag | |
stop_flag = True | |
return 'Process Stop Request' | |
def test_connect(): | |
print('Connected') | |
if __name__ == '__main__': | |
socketio.run(app, host="0.0.0.0", allow_unsafe_werkzeug=True,port=7860) | |