В этом примере показано, как сгенерировать код CUDA® для сети SSD (ssdObjectDetector объект) и использовать в своих интересах библиотеки TensorRT и NVIDIA® cuDNN. Сеть SSD основана на сверточной нейронной сети прямого распространения, которые обнаруживают несколько объектов в изображении в одном выстреле. Сеть SSD может считаться наличием двух подсетей. Сеть извлечения признаков, сопровождаемая сетью обнаружения.
Этот пример генерирует код для сети, обученной в Обнаружении объектов Используя пример Глубокого обучения SSD от Computer Vision Toolbox™. Для получения дополнительной информации смотрите, что Обнаружение объектов Использует Глубокое обучение SSD. Обнаружение объектов Используя пример Глубокого обучения SSD использует ResNet-50 для извлечения признаков. Подсеть обнаружения является маленьким CNN по сравнению с сетью извлечения признаков и состоит из нескольких сверточных слоев и слоев, характерных для SSD.
Необходимый
Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.
CUDA® включил NVIDIA® графический процессор и совместимый драйвер.
Дополнительный
Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование (GPU Coder) и Подготовка Необходимых как условие продуктов (GPU Coder).
Используйте coder.checkGpuInstall
Функция (GPU Coder), чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
net = getSSDNW();
Downloading pretrained detector (44 MB)...
Сеть DAG содержит 180 слоев включая свертку, ReLU, и слои нормализации партии., поле привязки, слияние SSD, фокальную потерю и другие слои. Чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения, используйте 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
Чтобы сгенерировать код 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').
Настройте читателя видеофайла и считайте входное видео. Создайте видеоплеер, чтобы отобразить видео и выходные обнаружения.
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.