Этот пример показывает генерацию кода для пешеходного приложения обнаружения что глубокое обучение использования. Пешеходное обнаружение является ключевым вопросом в компьютерном зрении. Пешеходное обнаружение имеет несколько приложений в областях автономного управления автомобилем, наблюдения, робототехники, и так далее.
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;