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