关于构建快速实时深度学习应用程序的建议

时间:2018-11-26 13:47:20

标签: python opencv image-processing deep-learning

我正在尝试构建我的第一个可识别车牌的实时深度学习应用程序。我已经具备了检测,分割和识别等所有构建模块,并且能够单独执行这些任务。

在实时摄像头馈送过程中,我发现仅连接所有这些任务是不切实际的,因为每个任务都需要花费一些时间才能完成,并且最终结果比较滞后。

例如,在下面的代码段中,有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 :(得分:1)

我认为一个问题是您等待结果:

    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())

您在一个线程中运行它们中的每个。一个将在您获得帧时排队,而另一个将显示已处理的帧。现在,这将并行运行,并可能导致其他问题。

一件事是输出帧可能会被打乱(一个帧的处理速度可能比另一个帧快,并且首先返回结果)。您可能需要附加一些ID /计数器,以便可以按正确的顺序放置它们。

在处理模型方面可能会有更多收获,但是我不能说太多,因为它们不属于您的示例。