Пешеходное обнаружение

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

Предпосылки

  • CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.

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

  • Библиотека NVIDIA cuDNN v7 или выше.

  • Computer Vision Toolbox™.

  • Deep Learning Toolbox™, чтобы использовать объект SeriesNetwork.

  • Image Processing Toolbox™ для чтения и отображения изображений.

  • GPU Coder™ для генерации кода CUDA.

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

  • Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Переменные окружения.

Проверьте среду графического процессора

Используйте coder.checkGpuInstall, функционируют и проверяют, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

coder.checkGpuInstall('gpu','codegen','cudnn','quiet');

О сети

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

% function for predicting the pedestrians
% A persistent object pednet is used to load the series network object.
% At the first call to this function, the persistent object is constructed and
% setup. When the function is called subsequent times, the same object is reused 
% to call predict on inputs, thus avoiding reconstructing and reloading the
% network object.

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

Создайте объект GPU Configuration для цели MEX и установите выходной язык на C++. Используйте кодер. 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').

Запустите сгенерированный MEX

imshow(im);

pednet вызова предсказывают на входном изображении.

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

Используйте ясный mex, чтобы удалить статический сетевой объект, загруженный в памяти.

clear mex;

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте