Генерация кода для обнаружения объектов с помощью Single Shot Multibox Detector

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

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

Необходимые условия для третьих лиц

Необходимый

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

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

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

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

Проверьте окружение GPU

Используйте 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 (Deep Learning Toolbox) функция.

analyzeNetwork(net);

The 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 (GPU Coder) функция для создания CuDNN объект строения глубокого обучения и присвоение его DeepLearningConfig свойство объекта строения кода GPU. Запуск 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: Single shot multibox detector (неопр.) (недоступная ссылка). 14-я Европейская конференция по компьютерному зрению, ECCV 2016. Springer Verlag, 2016.