Распознавание объектов с использованием ускоренных надежных элементов (SURF) состоит из трех этапов: извлечение элементов, описание элементов и сопоставление элементов. В этом примере выполняется извлечение элемента, которое является первым шагом алгоритма SURF. Используемый здесь алгоритм основан на реализации библиотеки OpenSURF. В этом примере показано, как можно использовать Coder™ графического процессора для решения проблемы интенсивного вычисления с помощью генерации кода CUDA ®.
Необходимый
В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.
Графический процессор NVIDIA ® с поддержкой CUDA и совместимый драйвер.
Дополнительный
Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделах Аппаратное обеспечение сторонних производителей и Настройка необходимых продуктов.
Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте 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 для SurfDetect создайте объект конфигурации кодера графического процессора, а затем запустите codegen функция.
cfg = coder.gpuConfig('mex'); evalc('codegen -config cfg SurfDetect -args {inputImage}');
Можно вызвать сгенерированную функцию 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);

Заметки о библиотеке OpenSURF работы Кристофера Эванса.
SURF: Ускоренные надежные функции Герберт Бэй, Тинне Туйтелаарс и Люк Ван Гул.
codegen | coder.checkGpuInstall | coder.gpu.constantMemory | coder.gpu.kernel | coder.gpu.kernelfun | gpucoder.matrixMatrixKernel | gpucoder.stencilKernel