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