как запустить opencv на 4-кратном графическом процессоре с многопроцессорной обработкой без ошибок

#python #opencv #yolo

Вопрос:

Я столкнулся с небольшой проблемой с opencv и yolov3. У меня есть opencv, скомпилированный с помощью CUDA. Все работает нормально, я запускаю вывод на нескольких процессах, все работает на видеокарте. У меня в компьютере 4 видеокарты. Если я использую один процесс, нет проблем с выбором видеокарты, которую должен использовать скрипт.

 cv2.cuda.setDevice (0-3) 
 

работает нормально. Но в сценарии, который зависит от нескольких процессов, я включаю выбор видеокарты и получаю ошибку

 (-217: Gpu API call) initialization error in function 'ManagedPtr'

 
 import cv2
import numpy as np
from datetime import datetime
import os

class YoloEval(object):
  def __init__(self, requestedProbability):
    print("LOADING YOLO")
    cv2.cuda.setDevice(1)    
    self.net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
    self.net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
    self.net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA_FP16)
    self.layer_names = self.net.getLayerNames()
    self.output_layers = [self.layer_names[i[0]-1] for i in self.net.getUnconnectedOutLayers()]
    self.requestedProbability = requestedProbability
    print("YOLO LOADED")
    self.saveImg = True

 def predict(self, imageToPredict, locationName, cameraId):
    height, width, channels = imageToPredict.shape
    blob = cv2.dnn.blobFromImage(imageToPredict, 1/255.0, (416,416), swapRB=True, crop=False)
    self.net.setInput(blob)
    outs = self.net.forward(self.output_layers)
    class_ids = []
    confidences = []
    boxes = []
    detected = False
    for out_index, out in enumerate(outs):
      for detection_index, detection in enumerate(out):
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if confidence > self.requestedProbability and class_id == 0:
          center_x = int(detection[0] * width)
          center_y = int(detection[1] * height)
          w = int(detection[2] * width)
          h = int(detection[3] * height)
          x = int(center_x - w / 2)
          y = int(center_y - h /2)
          boxes.append([x, y, w, h])
          confidences.append(float(confidence))
          class_ids.append(class_id)
          indexes = cv2.dnn.NMSBoxes(boxes, confidences, self.requestedProbability, 0.4)
          font = cv2.FONT_HERSHEY_PLAIN
          colors = np.random.uniform(0, 255, size=(1, 3))
          for i in range(len(boxes)):
            if i in indexes:
              x, y, w, h = boxes[i]
              label = "Osoba"
              color = colors[class_ids[i]]
              cv2.rectangle(imageToPredict, (x, y), (x   w, y   h), color, 2)
              cv2.putText(imageToPredict, label, (x, y   30), font, 2, color, 3)
          detected = True
    if detected: 
      return 1
    else: return 0