Обнаружение пешеходов

Этот пример показывает генерацию кода для приложения обнаружения пешеходов, которое использует глубокое обучение. Обнаружение пешеходов является ключевой проблемой компьютерного зрения. Обнаружение пешеходов имеет несколько применений в областях автономного управления автомобилем, наблюдения, робототехники и так далее.

Необходимые условия

  • Графический процессор NVIDIA с поддержкой CUDA ®.

  • Инструментарий и драйвер NVIDIA CUDA.

  • NVIDIA cuDNN.

  • Переменные окружения для компиляторов и библиотек. Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Оборудование сторонних производителей. Для настройки переменных окружения смотрите Настройка обязательных продуктов.

  • Пакет поддержки интерфейса GPU Coder для библиотек глубокого обучения. Для установки этого пакета поддержки используйте браузер Add-On Explorer.

Проверьте окружение 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'

The 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
    

Сгенерируйте MEX CUDA для 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').

Запуск сгенерированного MEX

Функции 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;

См. также

Функции

Объекты

Похожие темы