#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