Как разделить массив numpy между несколькими потоками python?

На самом деле я пытался изменить какой-то скрипт yolov5. Здесь я пытаюсь передать массив между потоками.

def detection(out_q):
    while(cam.isOpened()):
        ref, img = cam.read()
        img = cv2.resize(img, (640, 320))

        result = model(img)
        yoloBbox = result.xywh[0].numpy() # yolo format
        bbox = result.xyxy[0].numpy() # pascal format
        for i in bbox:
            out_q.put(i) # 'i' is the List of length 6
        
def resultant(in_q):

    while(cam.isOpened()):
        ref, img =cam.read()
        img = cv2.resize(img, (640, 320))
        qbbox = in_q.get()
        print(qbbox)
if __name__=='__main__':
    q = Queue(maxsize = 10)

    t1 = threading.Thread(target= detection, args = (q, ))

    t2 = threading.Thread(target= resultant, args = (q, ))

    t1.start()
    t2.start()

    t1.join()
    t2.join()

Я пытался с этим, но это дает мне такие ошибки, как:

Assertion fctx->async_lock failed at libavcodec/pthread_frame.c:155

так есть ли другой способ передать массив? любой учебник/решение приветствуется. Если есть какие-либо недоразумения с моим вопросом, пожалуйста, дайте мне знать. Большое спасибо!!

Обновлять:::

Я пытался так..

def detection(ns, event):#
##    a = np.array([1, 2, 3])   -
####    a= list(a)               | #This is working
##    ns.value = a               |
##    event.set()               -
    while(cam.isOpened()):
        ref, img = cam.read()
        img = cv2.resize(img, (640, 320))
    
        result = model(img)
        yoloBbox = result.xywh[0].numpy() # yolo format
        bbox = result.xyxy[0].numpy() # pascal format
        for i in bbox:
            arr = np.squeeze(np.array(i))
            print("bef: ", arr)      -
            ns.value = arr            |  # This is not working
            event.set()              -

def transfer(ns, event):
    event.wait()
    print(ns.value)

if __name__=='__main__':
    ##    detection()

    manager = multiprocessing.Manager()
    namespace = manager.Namespace()
    event=multiprocessing.Event()

    p1 = multiprocessing.Process(target=detection, args= 
(namespace, event),)
    p2= multiprocessing.Process(target=transfer, args=(namespace, 
 event),)
    p1.start()
    p2.start()
    p1.join()
    p2.join()

The output from the above "arr" = [          0      1.8232      
407.98      316.46     0.92648           0]

но все, что у меня есть, пусто. ни ошибки, ни предупреждения, только пусто. Я проверил, что arr имеет значение. Я проверил список, все массивы np обмениваются данными, которые помечены как работающие. Но почему данные из массива "arr" пусты (после обмена) И что я должен делать?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
39
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

so is there any other method to pass the array?

Да, вы можете использовать multiprocessing.shared_memory, он является частью стандартной библиотеки начиная с python3.8, и PyPI имеет бэкпорт позволяет использовать его в python3.6 и python3.7. См. пример в связанных документах, чтобы узнать, как использовать multiprocessing.shared_memory с numpy.ndarray.

Спасибо за комментарий, позвольте мне проверить.

rohan099 12.05.2022 13:26

Пожалуйста, посмотрите мое обновление о многопроцессорной обработке, и если есть какие-то ошибки, пожалуйста, дайте мне знать

rohan099 13.05.2022 07:29

Ответ @Daweo, предполагающий использование общей памяти, верен.

Однако также стоит рассмотреть возможность использования блокировки для «защиты» доступа к массиву numpy (который не является потокобезопасным).

См.: - это

Итак, что происходит с данными, если нет защиты?

rohan099 13.05.2022 07:30

Хорошо, ребята, спасибо за помощь. Я использовал многопроцессорную очередь для обмена данными. Затем я перевел многопроцессорность своей программы на многопоточность.

def capture(q):
    cap = 
        cv2.VideoCapture(0)
    while True:
        ref, frame = cap.read()
        frame = cv2.resize(frame, (640, 480))
        q.put(frame)

def det(q):
    model = torch.hub.load('ultralytics/yolov5','yolov5s',device='cpu') 
    model.conf = 0.30  # model confidence level
    model.classes = [0]  # model classes (where 0 = person, 2 = car)
    model.iou = 0.55 # bounding box accuracy
    while True:
        mat = q.get()
        det = model(mat)
        bbox = det.xyxy[0].numpy()
        for i in bbox:
            print(i)

Другие вопросы по теме