Проектирование операций OpenCV.Определение того, когда использовать CPU против GPU - PullRequest
0 голосов
/ 31 декабря 2018

Я работаю над проектом OpenCV, чтобы отслеживать видеопоток 1080p 60fps, а также применять к этому каналу пользовательскую графику.Я ищу общее руководство по проектированию некоторых высокоуровневых операций в моей системе, которые составляют несколько матричных операций.Например, в одной из моих функций я изменяю размер видеокадра и применяю наложение к этому измененному кадру.Следующая диаграмма описывает процесс:

image description

Вот реализация процесса (в настоящее время выполняется в C # opencvsharp, однако я могу перейти на любой язык в этой точке) :

private void updateFrame(Mat currentFrame, Mat background, Mat mask, Mat invertedMask)
{
    int w = 400, h = 224;

    using (var resizedFrame = new Mat(
        new OpenCvSharp.Size(currentFrame.Size().Width - w, currentFrame.Size().Height - h), 
        currentFrame.Type()))
    using (var resizedBorderFrame = new Mat(currentFrame.Size(), currentFrame.Type()))
    using (var maskedFrame = new Mat(currentFrame.Size(), currentFrame.Type()))
    using (var maskedBackground = new Mat(currentFrame.Size(), currentFrame.Type()))
    using (var output = new Mat(currentFrame.Size(), currentFrame.Type()))
    {
        Cv2.Resize(currentFrame, resizedFrame, resizedFrame.Size());
        Cv2.CopyMakeBorder(resizedFrame, resizedBorderFrame, h/4, h*3/4, w/2, w/2, BorderTypes.Constant, new Scalar(0));
        Cv2.BitwiseAnd(resizedBorderFrame, mask, maskedFrame);
        Cv2.BitwiseAnd(background, invertedMask, maskedBackground);
        Cv2.BitwiseOr(maskedBackground, maskedFrame, output);
        pictureBox.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(output);
    }
}

Этот процесс (наряду с несколькими другими операциями) начинает занимать больше времени, чем частота кадров видео, создавая заметную задержку.В настоящее время процесс выполняется с использованием операций на базе процессора, однако я прочитал, что применение операций с графическим процессором может значительно увеличить время выполнения.Далее я прочитал, что создание собственного ядра для объединения операций (или создание всей серии как операции составного ядра) может ускорить это еще больше.Я также пытаюсь проанализировать, какие операции не ограничены процессором, что может сделать операцию, эквивалентную GPU, излишним.

Если бы вы оценили эту проблему с самого начала, как бы вы решили определить, какиеОперации, чтобы поставить на CPU против GPU против собственного ядра?Или, скорее, какие ресурсы и инструменты я мог бы использовать для анализа различий в производительности?И какие еще оптимизации или процессы я должен использовать при рассмотрении проблем такого типа?

...