Я пытаюсь реализовать многопроцессорную версию обнаружения объектов (источник видео может быть как с камерой, так и видео) с моделью ультралитики YOLO. < /p>
Я реализовал очередь, где добавить кадры и пул процессов с 4 работниками: 1 показывает изображение, а другие 3 обрабатывают кадры. < /p>
Теперь у меня есть проблема: < /p>
Когда Я начинаю программу, обнаружение объекта работает, но видео не гладкое и кажется «задержанным»; Под «отсроченным» я имею в виду, что в отношении исходного видео источника видео он медленнее, как будто он имеет высокую задержку между каждым кадром, таким образом, становится медленнее, чем оригинальный. Я ожидаю, что видео будет плавным в качестве источника ввода. < /P>
Любое предложение? очереди, но это не кажется лучше.from multiprocessing import Pool, Queue, Process, Lock
import cv2
from ultralytics import YOLO
stop_flag = False
def init_pool(d_b, selected_classes):
global detection_buffer, yolo, selected_classes_set
detection_buffer = d_b
yolo = YOLO('yolov8n.pt')
selected_classes_set = set(selected_classes)
def detect_object(frame, frame_id):
global yolo, selected_classes_set
results = yolo.track(frame, stream=False)
for result in results:
classes_names = result.names
for box in result.boxes:
if box.conf[0] > 0.4:
x1, y1, x2, y2 = map(int, box.xyxy[0])
cls = int(box.cls[0])
class_name = classes_names[cls]
if class_name in selected_classes_set:
colour = (0, 255, 0)
cv2.rectangle(frame, (x1, y1), (x2, y2), colour, 2)
cv2.putText(frame, f'{class_name} {box.conf[0]:.2f}', (x1, y1),
cv2.FONT_HERSHEY_SIMPLEX, 1, colour, 2)
detection_buffer.put((frame_id, frame))
def show(detection_buffer):
global stop_flag
next_frame_id = 0
frames_buffer = {}
while not stop_flag:
data = detection_buffer.get()
if data is None:
break
frame_id, frame = data
frames_buffer[frame_id] = frame
while next_frame_id in frames_buffer:
cv2.imshow("Video", frames_buffer.pop(next_frame_id))
next_frame_id += 1
if cv2.waitKey(1) & 0xFF == ord('q'):
stop_flag = True
break
cv2.destroyAllWindows()
return
# Required for Windows:
if __name__ == "__main__":
video_path = "path_to_video"
detection_buffer = Queue(maxsize=3)
selected_classes = ['car']
detect_pool = Pool(3, initializer=init_pool, initargs=(detection_buffer, selected_classes))
num_show_processes = 1
show_processes = Process(target=show, args=(detection_buffer,))
show_processes.start()
if not video_path:
cap = cv2.VideoCapture(0)
else:
cap = cv2.VideoCapture(video_path)
frame_id = 0
futures = []
while not stop_flag:
ret, frame = cap.read()
if ret:
f = detect_pool.apply_async(detect_object, args=(frame, frame_id))
futures.append(f)
frame_id += 1
else:
break
for f in futures:
f.get()
for _ in range(num_show_processes):
detection_buffer.put(None)
for p in show_processes:
p.join()
detect_pool.close()
detect_pool.join()
cv2.destroyAllWindows()
Подробнее здесь: https://stackoverflow.com/questions/793 ... peed-issue
Обнаружение объекта Python Multiplocessing Speed. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение