На самом деле я пытался изменить какой-то скрипт 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" пусты (после обмена) И что я должен делать?






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.
Пожалуйста, посмотрите мое обновление о многопроцессорной обработке, и если есть какие-то ошибки, пожалуйста, дайте мне знать
Ответ @Daweo, предполагающий использование общей памяти, верен.
Однако также стоит рассмотреть возможность использования блокировки для «защиты» доступа к массиву numpy (который не является потокобезопасным).
См.: - это
Итак, что происходит с данными, если нет защиты?
Хорошо, ребята, спасибо за помощь. Я использовал многопроцессорную очередь для обмена данными. Затем я перевел многопроцессорность своей программы на многопоточность.
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)
Спасибо за комментарий, позвольте мне проверить.