Редукция данных с помощью SURF

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

Необходимые условия для третьих лиц

Необходимый

Этот пример генерирует CUDA MEX и имеет следующие требования к третьим лицам.

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

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

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

Проверьте окружение GPU

Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте 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);

Сгенерируйте MEX CUDA для функции

Чтобы сгенерировать CUDA MEX для SurfDetect function, создайте объект строения GPU Coder, а затем запустите 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: ускоренные робастные функции Герберта Бэя, Тинне Туйтелаарса и Люка Ван Гола.

См. также

Функции

Объекты

Похожие темы