Я хочу запустить алгоритм обнаружения нескольких объектов (YOLOv3) с разными параметрами.
Я должен использовать больше ядер ЦП, которые по алгоритму обнаружения и подсчета слишком тяжелы для управления.
Так что ясделал объектный класс, который может устанавливать разные имена видео и номера графических процессоров, но я новичок в многопроцессорности в python, который не может хорошо обрабатывать многопроцессорный класс.
Особенности
1. Draw baselines in PySide2 or PyQt.
2. Select a GPU which will run the YOLOv3.
3. Count cars which crossed a specific line in a road.
Но я хочу проверитьесли многопроцессорная обработка может запускать объектный класс перед реальной реализацией.
# main.py
from stream import video
import multiprocessing as mp
print(mp.current_process())
process1 = mp.Process(target=video, args=('DJI_0474_2.MOV', 0))
process2 = mp.Process(target=video, args=('DJI_0474_3.MOV', 1))
process1.daemon = True
process2.daemon = True
process1.start()
process2.start()
# stream.py
import cv2
from threading import Timer
import multiprocessing as mp
# from yolov3 import YOLO
class video(object):
def __init__(self, name, gpu_num):
print(mp.current_process())
self.cap = cv2.VideoCapture(name)
# self.detector = YOLO(gpu_num)
self.timer = Timer(0.066, self.run)
self.timer.start()
def run(self):
ret, frame = self.cap.read()
if ret:
# frame = self.detector(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
Я сделал простой код для проверки многопроцессорной обработки.
Но когда я инициализирую видео класс с двумя аргументами ('DJI_0474_2.MOV ', 0), main.py закрылся сам.
Я попытался инициализировать перед запуском многопроцессорной обработки, но ошибка говорит: «Невозможно выбрать объекты cv2.VideoCapture».
# main2.py
from stream2 import video
import multiprocessing as mp
print(mp.current_process())
play = video('DJI_0474_2.MOV')
# process = mp.Process(target=video, args=('DJI_0474_2.MOV',))
process = mp.Process(target=play.run)
process.daemon = True
process.start()
# stream2.py
import cv2
from threading import Timer
import multiprocessing as mp
# from yolov3 import YOLO
class video(object):
def __init__(self, name ):
print(mp.current_process())
self.cap = cv2.VideoCapture(name)
def run(self):
self.timer = Timer(0.066, self.update)
self.timer.start()
def update(self):
ret, frame = self.cap.read()
if ret:
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
Я думаю, это потому, что 'video class' находится на главном ядре, а 'run' на другом ядре, поэтому они не могут общаться одновременно.
Я попытаюсь установить очередь для общения междуen core, но я беспокоюсь о задержке ... так что лучше всего запустить многопроцессорную обработку в классе объектов.
Есть ли какое-либо решение, которое я могу запустить многопроцессорную обработку в классе объектов?