Оптимизация аппаратного обеспечения NVIDIA Optical Flow с использованием OpenCV Python - PullRequest
0 голосов
/ 10 апреля 2020

Используя код из следующей ссылки https://devblogs.nvidia.com/opencv-optical-flow-algorithms-with-nvidia-turing-gpus/ Я попытался оценить оптический поток примера видео, используя приведенный ниже код.

import numpy as np 
import cv2

def testing(vid_path):
    cap = cv.VideoCapture(vid_path)
    i = 0
    frames = []
    flow = []
    size = None
    while(cap.isOpened()):
        success, frame = cap.read()
        height, width, layers = frame.shape
        size = (width,height)
        if success:
            frames.append(frame)
            if i == 0:
                i += 1
                continue
            else:
                print(frames[i-1].shape, frames[i].shape)
                nvof = cv.cuda_NvidiaOpticalFlow_1_0.create(frame.shape[1], frame.shape[0], 5, False, False, False, 0)
                flow = nvof.calc(frames[i-1], frames[i], None)
                flowUpSampled = nvof.upSampler(flow[0], frame.shape[1], frame.shape[0], nvof.getGridSize(), None)
                flow.append(flowUpSampled)
                i += 1
                nvof.collectGarbage()
    cap.release()
    out = cv.VideoWriter('video.avi',cv.VideoWriter_fourcc(*'DIVX'), i, size)
    for i in range(len(flow)):
        out.write(flow[i])
    out.release()

Функция тестирования имеет все функциональные возможности и берет путь видео, для которого должен был быть оценен оптический поток. Я хочу запустить его на моем графическом процессоре RTX 2070. Приведенный выше код выдает следующую ошибку -

 (240, 320, 3) (240, 320, 3)
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-14-13554636257c> in <module>
----> 1 testing('C:/Users/.../Downloads/TestingVid.mpg')

<ipython-input-13-207420f4d52a> in testing(vid_path)
 17                 print(frames[i-1].shape, frames[i].shape)
 18                 nvof = cv.cuda_NvidiaOpticalFlow_1_0.create(frame.shape[1], frame.shape[0], 5, False, False, False, 0)
---> 19                 flow = nvof.calc(frames[i-1], frames[i], None)
 20                 flowUpSampled = nvof.upSampler(flow[0], frame.shape[1], frame.shape[0], nvof.getGridSize(), None)
 21                 flow.append(flowUpSampled)

error: OpenCV(4.3.0-dev) C:/Users/.../Downloads/opencv/opencv-master/modules/core/src/cuda/gpu_mat.cu:224: error: (-217:Gpu API call) invalid pitch argument in function 'cv::cuda::GpuMat::upload'

Я не понимаю ошибку правильно. Я пытался взглянуть на исходный код, но не смог найти причину этой ошибки. CUDA Toolkit version 10.2 Python 3.8 TIA.

Редактировать - Понимает ошибку. Нашел это. Мой GPU недостаточно большой, чтобы иметь значение шага для (240, 320, 3) кадра в памяти GPU, отсюда и эта ошибка. Как только я изменяю его на оттенки серого, ошибка исчезает.

...