В этом примере показана генерация кода для приложения обнаружения пешеходов, использующего глубокое обучение. Обнаружение пешеходов является ключевой проблемой в компьютерном зрении. Обнаружение пешеходов имеет несколько применений в областях автономного вождения, наблюдения, робототехники и так далее.
Графический процессор NVIDIA ® с поддержкой CUDA ®.
Набор инструментов и драйвер NVIDIA CUDA.
NVIDIA cuDNN.
Переменные среды для компиляторов и библиотек. Сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Аппаратное обеспечение сторонних производителей. Сведения о настройке переменных среды см. в разделе Настройка необходимых продуктов.
Пакет поддержки интерфейса кодера GPU для библиотек глубокого обучения. Чтобы установить этот пакет поддержки, используйте обозреватель надстроек.
Используйте 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 =
12×1 Layer array with layers:
1 'imageinput' Image Input 64×32×3 images with 'zerocenter' normalization
2 'conv_1' Convolution 20 5×5×3 convolutions with stride [1 1] and padding [0 0 0 0]
3 'relu_1' ReLU ReLU
4 'maxpool_1' Max Pooling 2×2 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 5×5×20 convolutions with stride [1 1] and padding [0 0 0 0]
7 'relu_2' ReLU ReLU
8 'maxpool_2' Max Pooling 2×2 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 ФункцияСоздайте объект конфигурации графического процессора для цели MEX и установите для целевого языка значение C++. Используйте coder.DeepLearningConfig для создания функции CuDNN глубокий объект конфигурации обучения и назначить его DeepLearningConfig свойства объекта конфигурации кода графического процессора. Для создания CUDA MEX используйте 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;
codegen | coder.checkGpuInstall | coder.DeepLearningConfig | coder.loadDeepLearningNetwork | VideoReader