Я пытаюсь создать свое первое приложение для глубокого обучения в режиме реального времени, которое распознает номерные знаки.У меня уже есть все строительные блоки, такие как обнаружение, сегментация и распознавание, и я могу выполнять эти задачи индивидуально.
Во время подачи видео с камеры в режиме реального времени я обнаружил, что нецелесообразно просто соединять все эти задачи, так каккаждая задача может занять некоторое время, а конечный результат довольно запаздывает.
Например, в приведенном ниже фрагменте есть 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()