flask доступ к потоку ответа для нескольких клиентов - PullRequest
0 голосов
/ 03 августа 2020

Я написал простое приложение 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 считывает последний обработанный кадр и передает его в потоковом режиме. Но это плохой патч, и мне нужны предложения по улучшению текущего дизайна. Простите меня, если я неправильно назвал какой-либо термин, у меня минимальные познания в веб-разработке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...