OpenCV CUDA Морфология намного медленнее, чем на CPU - PullRequest
0 голосов
/ 06 апреля 2020

Я обрабатываю изображения размером 2208x1242 из видео в то время как -l oop, используя C ++ с OpenCV.
Чтобы ускорить процесс, я хотел выполнить операции на Графический процессор моего Nvidia Jetson Nano.
Для преобразования цвета из BGR в HSV с использованием cv::cuda::cvtColor вместо cv::cvtColor ускорение достигается в 5 раз.

К сожалению, морфологические операции намного медленнее Графический процессор:

int num_frame = 10;
int frame = 0;

cv::Mat img;
cv::cuda::GpuMat img_gpu;

cv::Mat open_kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(11, 11));
cv::Mat close_kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(21, 21));

while (frame < num_frame){

  // load image to img
  // ...

  img_gpu.upload(img);

  cv::Ptr<cv::cuda::Filter> morph_filter_open = cv::cuda::createMorphologyFilter(cv::MORPH_OPEN, img_gpu.type(), open_kernel);
  cv::Ptr<cv::cuda::Filter> morph_filter_close = cv::cuda::createMorphologyFilter(cv::MORPH_CLOSE, img_gpu.type(), close_kernel);

  morph_filter_open->apply(img_gpu, img_gpu);
  morph_filter_close->apply(img_gpu, img_gpu);

  frame++;
}

Измеряя только apply() -вызовы, версия графического процессора примерно в 20 раз медленнее, чем cv::morphologyEx на процессоре Jetson Nano ( 0,07 с против 1,5 с для одного кадра).

nvprof показывает, что большую часть времени тратится на выполнение cudaDeviceSynchronize (для всей программы выполняется больше вещей, чем в примере кода выше). , но длительные операции, вероятно, связаны с морфологией):

  API calls:   71.05%  17.2756s       665  25.978ms  25.730us  1.44814s  cudaDeviceSynchronize
                8.36%  2.03194s      1826  1.1128ms  34.844us  847.66ms  cudaLaunchKernel
                5.16%  1.25490s         1  1.25490s  1.25490s  1.25490s  cuCtxDestroy
                4.80%  1.16684s       544  2.1449ms  17.865us  10.378ms  cudaMallocPitch
                1.89%  460.14ms       616  746.98us  20.469us  346.82ms  cudaFree
                1.65%  401.38ms        76  5.2813ms  44.533us  19.211ms  cudaMemcpy2D
                1.45%  352.97ms        51  6.9209ms  18.803us  242.14ms  cudaMalloc
                1.42%  345.25ms         1  345.25ms  345.25ms  345.25ms  cudaFuncGetAttributes
                1.23%  299.95ms         1  299.95ms  299.95ms  299.95ms  cuCtxCreate
                1.03%  251.43ms        20  12.572ms  162.61us  103.74ms  cudaMallocManaged
                0.92%  224.67ms        13  17.283ms  32.553us  65.173ms  cudaMemcpy
                0.56%  135.48ms         1  135.48ms  135.48ms  135.48ms  cudaDeviceReset
...

Я надеюсь, что кто-то может помочь мне выяснить, в чем проблема!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...