Рекомендации по созданию быстрого приложения для глубокого обучения в реальном времени - PullRequest
0 голосов
/ 26 ноября 2018

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

Во время подачи видео с камеры в режиме реального времени я обнаружил, что нецелесообразно просто соединять все эти задачи, так каккаждая задача может занять некоторое время, а конечный результат довольно запаздывает.

Например, в приведенном ниже фрагменте есть 3 основных задачи, каждая из которых может занять 0,1-1,5 секунды, а каждая задачанеобходимо завершить, прежде чем перейти к следующему.Таким образом, прямая трансляция не сразу загрузит следующий кадр, и это делает меня очень неловким.

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

Я запускаю это на относительно мощной машине и понял, что это проблема проектирования.Может ли кто-нибудь подсказать мне правильный способ создания быстрой и неблокирующей системы глубокого обучения в реальном времени?Любая помощь будет оценена!

import cv2
from imutils import resize
from imutils.video import VideoStream
from multiprocessing import Pool, Queue, cpu_count

def worker(inQueue, outQueue):
    while True:
        image = inQueue.get()
        # detection
        # segmentation
        # recognition
        outQueue.put(result)

inQueue, outQueue = Queue(maxsize=8), Queue(maxsize=8)
pool = Pool(processes=cpu_count(), initializer=self.worker, initargs=(inQueue, outQueue))

vs = VideoStream(src=0).start()

while True:
    frame = vs.read()
    if frame is not None:
        frame = resize(frame, 800)

        inQueue.put(frame)

        # get result
        print(outQueue.get())

        cv2.imshow("Frame", frame)

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break

cv2.destroyAllWindows()
vs.stop()

1 Ответ

0 голосов
/ 26 ноября 2018

Я думаю, что одна проблема в том, что вы ждете результатов:

    inQueue.put(frame)
    # get result
    print(outQueue.get())

Это поместит кадр в очередь, а затем дождется результата.Параллельная обработка не происходит.

Простым решением было бы иметь два цикла:

def InputThread(inQueue):
  vs = VideoStream(src=0).start()

  while True:
    frame = vs.read()
    if frame is not None:
      frame = resize(frame, 800)
      inQueue.put(frame)
      cv2.imshow("Frame", frame)

def OutputThread(outQueue):
    print(outQueue.get())

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

Одна вещь состоит в том, что выходные кадры могут быть перетасованы (один кадр может обрабатываться быстрее другого и возвращать результаты первым).Возможно, вы захотите прикрепить некоторые идентификаторы / счетчики, чтобы вы могли расположить их в правильном порядке.

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

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