Генерация кода для обнаружения объектов при помощи одного детектора мультиполя выстрела

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

Этот пример генерирует код для сети, обученной в Обнаружении объектов Используя пример Глубокого обучения SSD от Computer Vision Toolbox™. Для получения дополнительной информации смотрите, что Обнаружение объектов Использует Глубокое обучение SSD (Computer Vision Toolbox). Обнаружение объектов Используя пример Глубокого обучения SSD использует ResNet-50 для извлечения признаков. Подсеть обнаружения является маленьким CNN по сравнению с сетью извлечения признаков и состоит из нескольких сверточных слоев и слоев, характерных для SSD.

Сторонние необходимые условия

Необходимый

Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.

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

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

Для сборок не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, и слои нормализации партии., поле привязки, слияние SSD, фокальную потерю и другие слои. Чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения, используйте analyzeNetwork функция.

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 функции точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig (GPU Coder) функция, чтобы создать 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. Springer Verlag, 2016.