Этот пример показывает генерацию кода для пешеходного приложения обнаружения что глубокое обучение использования. Пешеходное обнаружение является ключевым вопросом в компьютерном зрении. Пешеходное обнаружение имеет несколько приложений в областях автономного управления автомобилем, наблюдения, робототехники, и так далее.
CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты (GPU Coder). Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов (GPU Coder).
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.
Используйте coder.checkGpuInstall
функция, чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Пешеходная сеть обнаружения была обучена при помощи изображений пешеходов и непешеходов. Эта сеть обучена в MATLAB® при помощи trainPedNet.m скрипта помощника. Подход раздвижного окна обрезки исправляет от изображения размера [64 32]. Размерности закрашенной фигуры получены из тепловой карты, которая представляет распределение пешеходов в изображениях в наборе данных. Это указывает на присутствие пешеходов в различных шкалах и местоположениях в изображениях. В этом примере закрашенные фигуры пешеходов близко к камере обрезаются и обрабатываются. Немаксимальное подавление (NMS) применяется на полученные закрашенные фигуры, чтобы объединить их и обнаружить полных пешеходов.
Пешеходная сеть обнаружения содержит 12 слоев, которые включают свертку, полностью соединенную, и классификация выходные слои.
load('PedNet.mat');
PedNet.Layers
ans = 12x1 Layer array with layers: 1 'imageinput' Image Input 64x32x3 images with 'zerocenter' normalization 2 'conv_1' Convolution 20 5x5x3 convolutions with stride [1 1] and padding [0 0 0 0] 3 'relu_1' ReLU ReLU 4 'maxpool_1' Max Pooling 2x2 max pooling with stride [2 2] and padding [0 0 0 0] 5 'crossnorm' Cross Channel Normalization cross channel normalization with 5 channels per element 6 'conv_2' Convolution 20 5x5x20 convolutions with stride [1 1] and padding [0 0 0 0] 7 'relu_2' ReLU ReLU 8 'maxpool_2' Max Pooling 2x2 max pooling with stride [2 2] and padding [0 0 0 0] 9 'fc_1' Fully Connected 512 fully connected layer 10 'fc_2' Fully Connected 2 fully connected layer 11 'softmax' Softmax softmax 12 'classoutput' Classification Output crossentropyex with classes 'NonPed' and 'Ped'
pedDetect_predict
Функция точки входаpedDetect_predict.m функция точки входа берет вход изображений и выполняет предсказание на изображении при помощи нейронной сети для глубокого обучения, сохраненной в PedNet.mat
файл. Функция загружает сетевой объект от PedNet.mat
файл в персистентную переменную pednet. Затем функциональные повторные использования постоянный объект на последующих вызовах.
type('pedDetect_predict.m')
function selectedBbox = pedDetect_predict(img) %#codegen % Copyright 2017-2019 The MathWorks, Inc. coder.gpu.kernelfun; persistent pednet; if isempty(pednet) pednet = coder.loadDeepLearningNetwork(coder.const('PedNet.mat'),'Pedestrian_Detection'); end [imgHt , imgWd , ~] = size(img); VrHt = [imgHt - 30 , imgHt]; % Two bands of vertical heights are considered % patchHt and patchWd are obtained from heat maps (heat map here refers to % pedestrians data represented in the form of a map with different % colors. Different colors indicate presence of pedestrians at various % scales). patchHt = 300; patchWd = patchHt/3; % PatchCount is used to estimate number of patches per image PatchCount = ((imgWd - patchWd)/20) + 2; maxPatchCount = PatchCount * 2; Itmp = zeros(64 , 32 , 3 , maxPatchCount); ltMin = zeros(maxPatchCount); lttop = zeros(maxPatchCount); idx = 1; % To count number of image patches obtained from sliding window cnt = 1; % To count number of patches predicted as pedestrians bbox = zeros(maxPatchCount , 4); value = zeros(maxPatchCount , 1); %% Region proposal for two bands for VrStride = 1 : 2 for HrStride = 1 : 20 : (imgWd - 60) % Obtain horizontal patches with stride 20. ltMin(idx) = HrStride + 1; rtMax = min(ltMin(idx) + patchWd , imgWd); lttop(idx) = (VrHt(VrStride) - patchHt); It = img(lttop(idx): VrHt(VrStride) , ltMin(idx) : rtMax , :); Itmp(:,:,:,idx) = imresize(It,[64,32]); idx = idx + 1; end end for j = 1 : size (Itmp,4) score = pednet.predict(Itmp(:,:,:,j)); % Classify ROI % accuracy of detected box should be greater than 0.90 if (score(1,2) > 0.80) bbox(cnt,:) = [ltMin(j),lttop(j), patchWd , patchHt]; value(cnt,:) = score(1,2); cnt = cnt + 1; end end %% NMS to merge similar boxes if ~isempty(bbox) [selectedBbox,~] = selectStrongestBbox(bbox(1:cnt-1,:),... value(1:cnt-1,:),'OverlapThreshold',0.002); end
pedDetect_predict
ФункцияСоздайте объект GPU Configuration для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig
функция, чтобы создать CuDNN
объект настройки глубокого обучения и присвоение это к DeepLearningConfig
свойство объекта настройки графического процессора кода. Чтобы сгенерировать MEX CUDA, используйте codegen
команда и задает размер входного изображения. Это значение соответствует входному размеру слоя пешеходной сети обнаружения.
% Load an input image. im = imread('test.jpg'); im = imresize(im,[480,640]); cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); codegen -config cfg pedDetect_predict -args {im} -report
Code generation successful: To view the report, open('codegen/mex/pedDetect_predict/html/report.mldatx').
Вызовите pednet_predict_mex
на входном изображении.
imshow(im); ped_bboxes = pedDetect_predict_mex(im);
Отобразите итоговые предсказания.
outputImage = insertShape(im,'Rectangle',ped_bboxes,'LineWidth',3); imshow(outputImage);
Включенный файл помощника pedDetect_predict.m системы координат захватов от видео, выполняет предсказание и отображает результаты классификации на каждом из полученных видеокадров.
v = VideoReader('LiveData.avi'); fps = 0; while hasFrame(v) % Read frames from video im = readFrame(v); im = imresize(im,[480,640]);
% Call MEX function for pednet prediction tic; ped_bboxes = pedDetect_predict_mex(im); newt = toc;
% fps fps = .9*fps + .1*(1/newt);
% display outputImage = insertShape(im,'Rectangle',ped_bboxes,'LineWidth',3); imshow(outputImage) pause(0.2) end
Очистите статический сетевой объект, который загрузился в памяти.
clear mex;