В этом примере показано обнаружение краев в изображении с функцией CUDA ® MEX, созданной из функции MATLAB ®. Алгоритм обнаружения краев реализован с типом данных с полупрецизионной точностью.
Необходимый
В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.
CUDA поддерживает графический процессор NVIDIA ® с минимальной вычислительной способностью 6.0 и совместимым драйвером.
Дополнительный
Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделах Аппаратное обеспечение сторонних производителей и Настройка необходимых продуктов.
Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте coder.checkGpuInstall функция.
envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);
В алгоритме обнаружения ребер Собеля sobelEdgeDetectionAlg.m выполняют операцию 2-D пространственного градиента на изображении серой шкалы. Эта операция подчеркивает области высокой пространственной частоты, которые соответствуют краям в изображении.
type sobelEdgeDetectionAlg
function edgeImg = sobelEdgeDetectionAlg(img,thresh) %#codegen %sobelEdgeDetection Example MATLAB function for edge detection. % Copyright 2018 The MathWorks, Inc. kern = half([1 2 1; 0 0 0; -1 -2 -1]); % Finding horizontal and vertical gradients. h = conv2(img(:,:,2),kern,'same'); v = conv2(img(:,:,2),kern','same'); % Finding magnitude of the gradients. e = sqrt(h.*h + v.*v); % Threshold the edges edgeImg = uint8((e > thresh) * 240); end
Алгоритм ребра Собеля вычисляет горизонтальный градиент resX и вертикальный градиент resY входного изображения с использованием двух ортогональных ядер фильтров maskX и maskY. После операции фильтрации алгоритм вычисляет величину градиента и применяет порог для поиска областей изображений, которые считаются краями.
Использовать стандарт imread для чтения изображений. imread представляет RGB-каналы изображений с целыми числами, по одному для каждого пикселя. Целые числа находятся в диапазоне от 0 до 255. Простое приведение входных данных к половинному типу может привести к переполнению во время свертки. В этом случае можно масштабировать изображения до значений от 0 до 1.
im = imread('peppers.png');
figure();
image(im);
imPacked = half(im)/255;
thresh = half(100)/255;

Создание CUDA MEX для sobelEdgeDetectionAlg создайте объект конфигурации кода графического процессора и запустите codegen команда. Для создания и выполнения кода с типами данных с полупрецизионной точностью необходима вычислительная способность CUDA 6.0 или выше. Установите ComputeCapability свойство объекта конфигурации кода для '6.0'. Для половинной точности режим выделения памяти (malloc) для генерации кода CUDA должен быть установлен в «Дискретный».
cfg = coder.gpuConfig('mex'); cfg.GpuConfig.ComputeCapability = '6.0'; cfg.GpuConfig.MallocMode = 'Discrete'; codegen -config cfg -args {imPacked,thresh} sobelEdgeDetectionAlg;
Code generation successful.
После создания функции MEX можно проверить, что она обладает теми же функциями, что и исходная функция начального уровня MATLAB. Выполнить сгенерированное sobelEdgeDetectionAlg_mex и постройте график результатов.
out_disp = sobelEdgeDetectionAlg_mex(imPacked,thresh); imagesc(out_disp);

Очистить статический сетевой объект, загруженный в память.
clear mex;
codegen | coder.checkGpuInstall | coder.gpu.constantMemory | coder.gpu.kernel | coder.gpu.kernelfun | gpucoder.matrixMatrixKernel | gpucoder.stencilKernel