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

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

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

Предпосылки

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

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

  • Библиотека NVIDIA cuDNN.

  • Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты (GPU Coder). Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов (GPU Coder).

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

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

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

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

Будьте предварительно обучены DAGNetwork

net = getSSDNW();

Сеть 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 функция, чтобы создать 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.