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

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

Предпосылки

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

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

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

  • Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Переменные окружения.

Создайте папку и скопируйте соответствующие файлы

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

gpucoderdemo_setup('gpucoderdemo_feature_extraction');

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

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

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

Извлечение признаков

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

Функция 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 выполняет немаксимальное подавление, чтобы отфильтровать только полезные точки интереса от ответов, полученных ранее, на основе нескольких факторов. Мы используем построение coder.ceval, чтобы сгенерировать ядро, которое использует atomicAdd операция. Поскольку это построение не совместимо, когда вызвано непосредственно от 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);

Команда выполнения: Очистка

Удалите файлы, выполните, моются и возвращаются к исходной папке.

cleanup

Ссылки

  1. Примечания по библиотеке OpenSURF Кристофером Эвансом

  2. Surf: ускоренные устойчивые функции Гербертом Бэем, Тинном Тейтелэарсом и Люком Ван Гулом