Эффективный способ отправки большого количества изображений с клиента на сервер - PullRequest
0 голосов
/ 13 февраля 2019

Я работаю над проектом, в котором одному клиенту нужно сделать несколько снимков с камеры (т. Е. Он на самом деле снимает короткое видео, отсюда поток кадров), затем отправляет все изображения на сервер , который затем выполняет некоторую обработку этих изображений и возвращает результат клиенту.

Клиент и сервер все работают Python3 код.

Критическая часть - этоотправка одного изображения.

Сначала немного фона, изображения - это файлы * 640 * 480 jpeg *.JPEG был выбран в качестве выбора по умолчанию, но также можно выбрать более низкое качество кодирования.Они последовательно снимаются камерой.Таким образом, у нас есть приблизительно ~ 600 кадров для отправки.Размер кадра составляет около 110 КБ.

Клиент состоит из Raspberry Pi 3 модель B +.Отправляет кадры через wifi на сервер 5с.Сервер и клиент оба находятся в одной локальной сети для версии прототипа.Но будущие развертывания могут отличаться как с точки зрения среды подключения (проводной или беспроводной), так и зоны (LAN или метро).

Я реализовал несколько решений для этого:

  1. Использование Python-сокетов на сервере и клиенте: я либо отправляю один кадр напрямую после захвата одного кадра, или я отправляю все изображения в последовательности после завершения захвата всего потока.

  2. Использование Gstreamer : я запускаю конечную точку GStreamer на своем клиенте и напрямую отправляю кадры на сервер во время потоковой передачи.Я собираю поток на стороне сервера с помощью OpenCV, скомпилированного с поддержкой GStreamer, а затем сохраняю их на диск.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что даже если оба решенияработают «хорошо» (они выполняют «окончательную» работу, то есть отправляют данные на сервер и получают результат на основе некоторой удаленной обработки), я убежден, что лучший способ для отправкибольшое количество данных на сервер, используя либо библиотеку сокетов Python, либо любые другие доступные инструменты.

Все личные исследования, проведенные по этому вопросу, привели меня к решениям, аналогичным моим, с использованием сокетов Python или быливне контекста (полагаясь на другие бэкэнды, кроме чистого Python).

Лучше, я предполагаю:

  1. Решение, которое экономит пропускную способность столько, скольковозможно.
  2. Решение, которое отправляет все данные как можно быстрее .

Для 1. Я немного изменил свое первое решение для архивирования и сжатия всех захваченных кадровв .tgzфайл, который я отправляю на сервер.Это действительно уменьшает использование полосы пропускания, но также увеличивает время, затрачиваемое на обоих концах (из-за процессов un / сжатия).Очевидно, это особенно верно, когда набор данных большой.

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

Как я могу отправить большое количество изображений с одного клиента на один сервер с минимальным использованием полосы пропускания изадержка в Python?

1 Ответ

0 голосов
/ 13 февраля 2019

Если вы хотите передавать изображения в виде кадров, вы можете использовать некоторые существующие приложения, такие как MJPEG-Streamer , которые кодируют изображения из интерфейса веб-камеры в JPG, что уменьшает размер изображения.Но если вам нужна более надежная передача с расширенным кодированием, вы можете использовать некоторые инструменты Linux, такие как FFMPEG с потоковой передачей, которые описаны в здесь .

Если вы хотите снизить реализацию и контролировать весь поток с помощьюВаш код для изменений вы можете использовать веб-фреймворки, такие как Flask и передавать ваши изображения напрямую через HTTP-протокол.Вы можете найти хороший пример в здесь .

Если вы не хотите выполнять потоковую передачу, вы можете преобразовать весь набор изображений в кодированный видеоформат, такой как h264, а затем передать байтыкинь сеть.Вы можете использовать opencv для этого.Есть также несколько хороших библиотек, написанных на python, таких как pyffmpeg .

...