Этот пример показывает генерацию кода для приложения обнаружения пешеходов, которое использует глубокое обучение. Обнаружение пешеходов является ключевой проблемой компьютерного зрения. Обнаружение пешеходов имеет несколько применений в областях автономного управления автомобилем, наблюдения, робототехники и так далее.
Графический процессор NVIDIA с поддержкой CUDA ®.
Инструментарий и драйвер NVIDIA CUDA.
NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Оборудование сторонних производителей. Для настройки переменных окружения смотрите Настройка обязательных продуктов.
Пакет поддержки интерфейса 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 = 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
Функция точки входаThe 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
свойство объекта строения кода GPU. Чтобы сгенерировать 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