Многомасштабный вывод Cuda CascadeClassifier Detect нечитаем

#python #opencv #opencv4

#python #opencv

Вопрос:

Я пытаюсь выполнить каскадную классификацию, используя CUDA с openCV4.4, однако, когда я запускаю функцию detectMultiScale, это выдает ошибку сегментации. Что я делаю не так?

В python имеется ограниченная документация от OpenCV для CUDA, что затрудняет поиск правильной процедуры для выполнения каскадной классификации с использованием CUDA.

Моя система:

  • Quadro P620
  • Debian 6.3.0-18
  • Python 3.5.3
  • Сборка OpenCV 4.5.0 с CUDA = ВКЛЮЧЕНО, CUDNN = ВКЛЮЧЕНО

Код, который я придумал:

 vidcap = cv2.VideoCapture('video_file.mp4')
classifier_cuda = cv2.cuda_CascadeClassifier('cascades_file.xml')
while True:
    success, frame = vidcap.read()
    cuda_frame = cv2.cuda_GpuMat(frame)
    result = classifier_cuda.detectMultiScale(cuda_frame)
    print (result) 
  

classifier_cuda и cuda_frame соответственно распознаются как <cuda_GpuMat 0x7fffa9446d10> <cuda_CascadeClassifier 0x7fffa9446cf0>

Проблема была решена путем изменения кода на:

 classifier_cuda = cv2.cuda.CascadeClassifier_create('model.xml')
while True:
    success, frame = vidcap.read()
    cuFrame = cv2.cuda_GpuMat(frame)
    output2 = cv2.cuda_GpuMat()
    output = classifier_cuda.detectMultiScale(cuFrame, output2)
    
    # And then its unclear what to use to get the detections
    # I Tried:
    final = classifier_cuda.convert(output)
    # And:
    final = classifier_cuda.convert(output2)
    # And:
    final = output.download()
    # And:
    final = output2.download()
  

Проблема теперь в том, что результат во всех отношениях пустой. Итак, как мне извлечь данные из моего detectmultiscale? Мне нужно иметь список полей привязки [x, y, w, h].

Комментарии:

1. Попробуйте указать полный путь к CascadeClassifier подобному C:User....opencvdatahaarcascadescascade_file.xml

2. попробуйте указать абсолютные пути как для видео, так и для каскадных файлов.

3. Спасибо @Ahmet и Micka, но я уже пробовал, к сожалению, это не сработало

4. Вы получили cascade_file.xml из Интернета? У меня такая же проблема, когда я использую çxml из Интернета. Кажется, что .xml только из /opencv/data/haarcascades каталога работает с detectMultiScale .

5. @Ahmet нет, это пользовательский каскад, пробовал как новый, так и старый макет

Ответ №1:

output.download() на самом деле работает для меня, но будет None , если ничего не было обнаружено.

Я думаю, ваша проблема в том, что вам нужно преобразовать фреймы в COLOR_BGR2GRAY .

Это должно сработать:

 source = cv2.VideoCapture('video_file.mp4')
classifier = cv2.cuda.CascadeClassifier_create('model.xml')

while True:
    success, frame = source.read()

    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gpu_frame = cv2.cuda_GpuMat(gray_frame)
    gpu_result = classifier.detectMultiScale(gpu_frame) # cuda_GpuMat
    result = gpu_result.download() # UMat

    if result is not None:
        for item in result[0]:
            (x, y, w, h) = item
            print(x, y, w, h)

  

(OpenCV 4.4)

Комментарии:

1. Я также меняю элемент [0] на элемент, а результат на результат [0], чтобы устранить проблему с одним результатом. Спасибо 🙂

2. Именно то, что я сделал, обновит мой ответ. Tnx!