Проблема проектирования обработки видео в реальном времени

Я новичок в этой области и не знаю, правильно ли я делаю это. Поэтому мне нужна помощь в решении архитектурных и дизайнерских вопросов, чтобы убедиться, что я двигаюсь в правильном направлении.

Я пытаюсь обработать запись видео в реальном времени с камеры клиента. Захваченный видеопоток конвертируется в кадры и отправляется на сервер для обработки. После обработки сервер отправляет его обратно на экран клиента.

Мой бэкэнд-код написан на Python, и я использую SocketIo для отправки кадров из внешнего интерфейса в бэкэнд. Вы можете взглянуть на этот дизайн, чтобы лучше понять, что происходит - изображение

  1. Мой сервер (app.py) будет работать в бэкэнде, а клиент будет обращаться к index.html
  2. Соединение SocketIo будет установлено, и видеопоток, захваченный с помощью веб-камеры, будет посылаться на сервер кадр за кадром.
  3. Эти кадры затем будут обработаны на сервере и отправлены обратно клиенту.
  4. Обработанные кадры, поступающие с сервера, могут быть показаны в теге img.

Итак, моя проблема с этой архитектурой - это отставание. Даже после ограничения fps есть заметная задержка. От клиента к серверу, затем обработка и обратно к клиенту, каждый кадр занимает в среднем 150 мс и не дает ответа в реальном времени. Я пробовал свой код обработки изображений отдельно, без программирования сокетов на локальном компьютере, и он более близок к реальному времени (для одного кадра требуется 80 мс).

Но я здесь не понимаю, как я могу минимизировать запаздывание с этим дизайном или импровизировать? Есть ли лучший способ выполнить эту задачу, чтобы получить больше результатов в реальном времени?

Заранее спасибо!


person akan    schedule 31.01.2020    source источник
comment
Код, которому я следую, - stackoverflow.com/a/59998983/8030133   -  person akan    schedule 31.01.2020
comment
Обрабатывает ли сервер изображение на Python? В таком случае вам следует подумать о переводе серверного кода на C ++. Код Python работает намного медленнее, чем C ++ для задач OpenCV.   -  person karlphillip    schedule 31.01.2020


Ответы (1)


Python - отличный язык для быстрого прототипирования приложений компьютерного зрения. Однако это не рекомендуется для производственного кода из-за его производительности. Преобразуйте код в C ++, и вы увидите значительное улучшение производительности во время выполнения.

SocketIo - не лучший вариант, так как он использует TCP-соединение. Вы заметите лучшую производительность библиотеки, которая передает данные через UDP. Вы можете потерять несколько пикселей здесь и там, но обычно это хороший компромисс для потокового видео.

Вот еще несколько мыслей о SocketIo и TCP против UDP..

person karlphillip    schedule 01.02.2020
comment
Конечно, C ++ может дать толчок по сравнению с python. Если нет возможности, я конвертирую свой код. Но помимо обработки изображений в opencv меня также беспокоил SocketIO. Время, затрачиваемое на отправку и обратную визуализацию результата, также занимает довольно много времени, что, я думаю, также является причиной задержки. Не могли бы вы также помочь мне в этом направлении. Как я могу отладить это? - person akan; 03.02.2020
comment
Обновленный ответ. Это все, что я могу предложить на данный момент. Удачи! - person karlphillip; 03.02.2020
comment
@akan Нет необходимости благодарить людей, так как вы можете проголосовать за полезные ответы. Возможно, у вас недостаточно репутации на сайте для этого прямо сейчас, но не забудьте вернуться в будущем. Увидимся, ура! - person karlphillip; 03.02.2020