Я написал простое приложение flask для своего проекта компьютерного зрения. Я использовал потоковый ответ для потоковой передачи обработанных кадров.
Вот основное приложение flask:
from flask import Flask, render_template, Response
from vid_reader_streamer import Stream
import video_capture_Q_buf as vid_cap_q # import as alias
from video_capture_Q_buf import VideoCaptureQ # class import
import cv2
import numpy as np
import gc
app = Flask(__name__)
stream = Stream()
@app.route('/')
def index():
return render_template('index.html')
def gen(stream):
while True:
frame, frames_left = stream.get_frame() # get processed frame
try:
if frame.shape != (1080, 1920, 3):
# not proper dimension
frame = cv2.resize(frame, (1920, 1080))
except:
print('failed')
frame = np.random.randint(0, 1, (1080,1920,3))
(flag, encodedImage) = cv2.imencode(".jpg", frame)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + bytearray(encodedImage) + b'\r\n')
@app.route('/video_feed')
def video_feed():
return Response(gen(stream),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=6001, debug=False)
Stream
- это класс, который загружает две модели глубокого обучения в графический процессор (__init__
), считывает кадр из cv2.VideoCapture
, обрабатывает кадр с помощью моделей глубокого обучения и возвращает обработанный кадр (функция get_frame()
).
Все работает нормально, если я получаю доступ к веб-приложению из одного окно браузера. Приложение вылетает с ошибкой «Ошибка CUDA: обнаружен незаконный доступ к памяти», если я открываю приложение в нескольких окнах / нескольких браузерах.
Я отследил проблему, похоже, для каждого отдельного окна / браузера запросы и ответы не синхронизируются, поэтому для нового окна некоторые новые запросы отправляются на GPU, пока выполняется другое вычисление (или модели перезагружаются), что нарушает работу программы.
Как я могу сделать свое приложение полностью синхронный (одинаковый вывод для всех клиентов), чтобы потоки были одинаковыми для всех пользователей, которые обращаются к приложению независимо от клиента? сохраняя кадры, приложение flask считывает последний обработанный кадр и передает его в потоковом режиме. Но это плохой патч, и мне нужны предложения по улучшению текущего дизайна. Простите меня, если я неправильно назвал какой-либо термин, у меня минимальные познания в веб-разработке.