exponenta event banner

Извлечение элементов с помощью SURF

Распознавание объектов с использованием ускоренных надежных элементов (SURF) состоит из трех этапов: извлечение элементов, описание элементов и сопоставление элементов. В этом примере выполняется извлечение элемента, которое является первым шагом алгоритма SURF. Используемый здесь алгоритм основан на реализации библиотеки OpenSURF. В этом примере показано, как можно использовать Coder™ графического процессора для решения проблемы интенсивного вычисления с помощью генерации кода CUDA ®.

Предварительные условия для сторонних производителей

Необходимый

В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.

  • Графический процессор NVIDIA ® с поддержкой CUDA и совместимый драйвер.

Дополнительный

Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверка среды графического процессора

Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте coder.checkGpuInstall функция.

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

Извлечение элементов

Извлечение признаков является фундаментальным шагом в любом алгоритме распознавания объектов. Оно относится к процессу извлечения полезной информации, называемой признаками, из входного изображения. Извлеченные элементы должны быть репрезентативными по своему характеру, несущими важные и уникальные атрибуты изображения.

Функция SurfDetect.m является основной точкой входа, которая выполняет извлечение элементов. Эта функция принимает 8-битное изображение RGB или 8-битное изображение в градациях серого в качестве входных данных. Возвращенный результат представляет собой массив извлеченных процентных баллов. Эта функция состоит из следующих вызовов функций, которые содержат вычисления, подходящие для параллелизации графического процессора:

  • Функция Convert32bitFPGray.m преобразует 8-битное изображение RGB в 8-битное изображение в градациях серого. Если введенные данные уже имеют 8-битный формат градаций серого, пропустите этот шаг. После этого шага 8-битное изображение в градациях серого преобразуется в 32-битное представление с плавающей запятой для обеспечения быстрых вычислений на GPU.

  • Функция MyImage.m вычисляет интегральное изображение 32-битного изображения в градациях серого с плавающей запятой, полученного на предыдущем шаге. Интегральное изображение полезно для упрощения поиска суммы пикселей, заключенных в пределах любой прямоугольной области изображения. Поиск суммы пикселей помогает улучшить скорость сверток, выполняемых на следующем шаге.

  • Функция StartHessian.m выполняет свертку изображения с помощью боксовых фильтров различных размеров и сохраняет вычисленные отклики. В этом примере используются следующие параметры:

    Number of Octaves: 5
    Number of Intervals: 4
    Threshold: 0.0004
    Filter Sizes: Octave 1 -  9,  15,  21,  27
                  Octave 2 - 15,  27,  39,  51
                  Octave 3 - 27,  51,  75,  99
                  Octave 4 - 51,  99, 147, 195
                  Octave 5 - 99, 195, 291, 387
  • Функция NonMaxSuppression_gpu.m выполняет несимметричное подавление, чтобы отфильтровывать только полезные точки интереса из ответов, полученных ранее. Чтобы создать ядро, которое использует atomicAdd , используйте coder.ceval конструкция. Поскольку эта конструкция несовместима при вызове непосредственно из MATLAB ®, существует два различных вызова функций. Функция NonMaxSuppression_gpu.m вызывается, когда генерация кода графического процессора включена, а файл NonMaxSuppression.m вызывается при выполнении алгоритма непосредственно в MATLAB.

  • Функция OrientationCalc.m вычисляет и присваивает ориентацию процентным точкам на предыдущем шаге.

Конечным результатом является массив процентных пунктов, где процентная точка представляет собой структуру, состоящую из следующих полей:

    x, y (coordinates), scale, orientation, Laplacian

Чтение входного изображения

Считывание входного изображения в MATLAB с помощью imread функция.

imageFile = 'peppers.png';
inputImage = imread(imageFile);
imshow(inputImage);

Создание CUDA MEX для функции

Создание CUDA MEX для SurfDetect создайте объект конфигурации кодера графического процессора, а затем запустите codegen функция.

cfg = coder.gpuConfig('mex');
evalc('codegen -config cfg SurfDetect -args {inputImage}');

Выполнение функции MEX на графическом процессоре

Можно вызвать сгенерированную функцию MEX. SurfDetect_mex для запуска на графическом процессоре:

disp('Running GPU Coder SURF');
interestPointsGPU = SurfDetect_mex(inputImage);
fprintf('    GPU Coder SURF found: %d interest points\n',length(interestPointsGPU));
Running GPU Coder SURF
    GPU Coder SURF found: 249 interest points

Отображение извлеченных процентных баллов

Продукция interestPointsGPU представляет собой массив извлеченных процентных пунктов. Эти процентные баллы изображены над входным изображением в окне рисунка.

DrawIpoints(imageFile, interestPointsGPU);

Ссылки

  1. Заметки о библиотеке OpenSURF работы Кристофера Эванса.

  2. SURF: Ускоренные надежные функции Герберт Бэй, Тинне Туйтелаарс и Люк Ван Гул.

См. также

Функции

Объекты

Связанные темы