Извлечение признаков Используя SURF

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

Предпосылки

  • CUDA включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.

  • NVIDIA инструментарий CUDA и драйвер.

  • Image Processing Toolbox™ для чтения и отображения изображений.

  • Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов.

Проверьте среду графического процессора

Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте 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 вызывается, когда генерации кода графического процессора включают, и NonMaxSuppression.m вызывается, когда вы выполняете алгоритм непосредственно в MATLAB.

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

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

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

Считайте входное изображение

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

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

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

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