Почему YOLO не работает если я запускаю его в отдельном потоке
У меня есть задача: нужно разработать сервис на Fast API, внутри которого будет запущена фоновая задача с распознаванием YOLO v8. Распознаваться будут изображения полученные с IP-камеры, поэтому нужно чтобы человек один раз запустил сервис, и этот сервис работал неограниченное время в фоновом режиме, пока его не отключат. Для реализации этой задачи я использую библиотеки ultralytics
для запуска YOLO и OpenCV
для получения изображения с IP-камеры в реальном времени.
Сейчас у меня есть метод detect
, в котором работает YOLO.
def detect(source_rtsp):
vac = cv2.VideoCapture(source_rtsp)
model = YOLO('yolov8n.pt')
while vac.isOpened():
RTSP_STATUS, RTSP_FRAME = vac.read()
if RTSP_FRAME is None:
continue
res_generator = model.track(RTSP_FRAME, conf=0.4, stream=True, persist=True, tracker='bytetrack.yaml', classes=[x for x in range(10)],verbose=False)
Этот метод я запускаю в отдельном потоке.
detect_thread = Thread(
target=detect,
daemon=True,
kwargs={
'source_rtsp': 'rtsp://1.1.1.0',
}
)
detect_thread.start()
Когда я запускаю метод detect
в отдельном потоке, то он выполняется до строчки res_generator = model.track(...)
, после чего происходит очень долгое ожидание. Если не запускать метод detect
в отдельном потоке, то всё работает нормально.
Что мне надо?
Мне нужно сделать так, чтобы YOLO без проблем работал в отдельном потоке или найти другой способ запускать YOLO как фоновую задачу.