我正在尝试构建我的第一个可识别车牌的实时深度学习应用程序。我已经具备了检测,分割和识别等所有构建模块,并且能够单独执行这些任务。
在实时摄像头馈送过程中,我发现仅连接所有这些任务是不切实际的,因为每个任务都需要花费一些时间才能完成,并且最终结果比较滞后。
例如,在下面的代码段中,有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()
答案 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 /计数器,以便可以按正确的顺序放置它们。
在处理模型方面可能会有更多收获,但是我不能说太多,因为它们不属于您的示例。