Могу ли я запустить многопроцессорную обработку с классом объекта в Python? - PullRequest
0 голосов
/ 24 мая 2019

Я хочу запустить алгоритм обнаружения нескольких объектов (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, но я беспокоюсь о задержке ... так что лучше всего запустить многопроцессорную обработку в классе объектов.

Есть ли какое-либо решение, которое я могу запустить многопроцессорную обработку в классе объектов?

1 Ответ

0 голосов
/ 24 мая 2019

Нет, кстати, я думаю, что это ros, boost, многопоточность и все виды мьютекса. займет некоторое время

Самый глупый способ - построить несколько йоло. скажем, с GPU и различные версии процессора. Вызов каждого 1 на другом терминале, чтобы начать новую тему.

Затем разделите обученную модель для другого подмножества путем переподготовки N модели. И каждая версия сборки вызывает подмодель

Затем все находки обнаруживаются в N TXT-файле, а затем объединяются в один TXT, чтобы избежать проблемы блокировки мьютекса.

...