exponenta event banner

Создание кода для обнаружения объектов с помощью мультибоксового детектора одиночного снимка

В этом примере показано, как создать код CUDA ® для сети SSD (объект ssdObjectDetector) и воспользоваться преимуществами библиотек NVIDIA ® cuDNN и TensorRT. Сеть SSD основана на сверточной нейронной сети прямой связи, которая обнаруживает множество объектов в изображении за один снимок. Сеть SSD может рассматриваться как имеющая две подсети. Сеть извлечения элементов, за которой следует сеть обнаружения.

В этом примере генерируется код для сети, обученной на примере «Обнаружение объектов с помощью твердотельных накопителей глубокого обучения» из Computer Vision Toolbox™. Дополнительные сведения см. в разделе Обнаружение объектов с помощью глубокого обучения твердотельных накопителей. В примере «Обнаружение объектов с помощью SSD Deep Learning» для извлечения элементов используются ResNet-50. Подсеть обнаружения является небольшим CNN по сравнению с сетью извлечения признаков и состоит из нескольких сверточных уровней и уровней, специфичных для SSD.

Предварительные условия для сторонних производителей

Необходимый

В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.

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

Дополнительный

Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверка среды графического процессора

Используйте coder.checkGpuInstall Функция (GPU Coder) для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

Получение предварительно подготовленных DAGNetwork

net = getSSDNW();
Downloading pretrained detector (44 MB)...

Сеть DAG содержит 180 уровней, включая уровни свертки, ReLU и пакетной нормализации, якорный ящик, слияние твердотельных накопителей, фокальные потери и другие уровни. Для отображения интерактивной визуализации архитектуры сети глубокого обучения используйте analyzeNetwork (Deep Learning Toolbox).

analyzeNetwork(net);

ssdObj_detect Функция точки входа

Функция начальной точки ssdObj_detect.m принимает входной сигнал изображения и запускает детектор на изображении, используя сеть глубокого обучения, сохраненную в ssdResNet50VehicleExample_20a.mat файл. Функция загружает сетевой объект из ssdResNet50VehicleExample_20a.mat в постоянную переменную ssdObj и повторно использует постоянный объект при последующих вызовах обнаружения.

type('ssdObj_detect.m')
function outImg = ssdObj_detect(in)

%   Copyright 2019-2020 The MathWorks, Inc.

persistent ssdObj;

if isempty(ssdObj)
    ssdObj = coder.loadDeepLearningNetwork('ssdResNet50VehicleExample_20a.mat');
end

% Pass in input
[bboxes,~,labels] = ssdObj.detect(in,'Threshold',0.7);

% Convert categorical labels to cell array of charactor vectors for 
% execution
labels = cellstr(labels);

% Annotate detections in the image.
if ~isempty(labels)
    outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);
else
    outImg = in;
end

Запуск создания кода MEX

Чтобы создать код CUDA для функции точки входа ssdObj_detect.m, создайте объект конфигурации кода GPU для цели MEX и установите для целевого языка значение C++. Используйте coder.DeepLearningConfig (Кодер графического процессора) для создания CuDNN глубокий объект конфигурации обучения и назначить его DeepLearningConfig свойства объекта конфигурации кода графического процессора. Запустить codegen команда, задающая размер ввода [300,300,3]. Это значение соответствует размеру входного уровня сети SSD.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg ssdObj_detect -args {ones(300,300,3,'uint8')} -report
Code generation successful: To view the report, open('codegen/mex/ssdObj_detect/html/report.mldatx').

Выполнить сгенерированный MEX

Настройте устройство чтения видеофайлов и прочитайте входное видео. Создайте видеопроигрыватель для отображения видео и выходных обнаружений.

videoFile = 'highway_lanechange.mp4';
videoFreader = vision.VideoFileReader(videoFile,'VideoOutputDataType','uint8');
depVideoPlayer = vision.DeployableVideoPlayer('Size','Custom','CustomSize',[640 480]);

Считывайте видео, вводимое покадрово, и обнаруживайте транспортные средства в видео с помощью детектора.

cont = ~isDone(videoFreader);
while cont
    I = step(videoFreader);
    in = imresize(I,[300,300]);
    out = ssdObj_detect_mex(in);
    step(depVideoPlayer, out);
    cont = ~isDone(videoFreader) && isOpen(depVideoPlayer); % Exit the loop if the video player figure window is closed
end

Ссылки

[1] Лю, Вэй, Драгомир Ангуэлов, Думитру Эрхан, Кристиан Сегеди, Скотт Рид, Чэн Ян Фу и Александр К. Берг. «SSD: Однокадровый мультибоксовый детектор». 14-я Европейская конференция по компьютерному зрению, ECCV 2016. Спрингер Верлаг, 2016.