Алгоритм распознавания с помощью Speeded-Up Robust Features (SURF) состоит из трех шагов: редукция данных, описание функций и соответствие функций. Этот пример выполняет редукцию данных, которая является первым шагом алгоритма SURF. Используемый здесь алгоритм основан на реализации библиотеки OpenSURF. В этом примере показано, как можно использовать GPU Coder™ для решения этой вычислительной интенсивной задачи с помощью генерации кода CUDA ®.
Необходимый
Этот пример генерирует CUDA MEX и имеет следующие требования к третьим лицам.
CUDA включает графический процессор NVIDIA ® и совместимый драйвер.
Дополнительный
Для сборок, не являющихся 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-битовое представление с плавающей точкой для обеспечения быстрых расчетов на графическом процессоре.
Функция MyIntegralImage.m вычисляет интегральное изображение 32-битного полутонового изображения с плавающей точкой, полученного на предыдущем шаге. Интегральное изображение полезно для упрощения нахождения суммы пикселей, заключенных в любой прямоугольной области изображения. Нахождение суммы пикселей помогает улучшить скорость сверток, выполненных на следующем шаге.
Функция FastHessian.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 вызывается, когда включена генерация кода GPU, и NonMaxSuppression.m вызывается, когда вы выполняете алгоритм непосредственно в MATLAB.
Функция OrientationCalc.m вычисляет и присваивает ориентацию процентным точкам на предыдущем шаге.
Конечным результатом является массив процентных точек, где процентная точка является структурой, которая состоит из этих полей:
x, y (coordinates), scale, orientation, Laplacian
Чтение входа изображения в MATLAB при помощи imread
функция.
imageFile = 'peppers.png';
inputImage = imread(imageFile);
imshow(inputImage);
Чтобы сгенерировать CUDA MEX для SurfDetect
function, создайте объект строения GPU Coder, а затем запустите 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