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