В этом примере показано, как сгенерировать CUDA® MEX для вы только смотрите однажды (YOLO) v2 детектор объектов. Сеть обнаружения объектов YOLO v2 состоит из двух подсетей. Сеть извлечения признаков сопровождается сетью обнаружения. Этот пример генерирует код для сети, обученной в Обнаружении объектов Используя пример YOLO v2 Глубокого обучения от Computer Vision Toolbox™. Для получения дополнительной информации смотрите, что Обнаружение объектов Использует Глубокое обучение (Computer Vision Toolbox) YOLO v2. Можно изменить этот пример, чтобы сгенерировать CUDA® MEX для сети, импортированной в Импорте Предварительно обученный пример ONNX YOLO v2 Детектора объектов от Computer Vision Toolbox™. Для получения дополнительной информации смотрите Импорт Предварительно обученный Детектор объектов (Computer Vision Toolbox) ONNX YOLO v2.
Необходимый
Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.
CUDA® включил NVIDIA® графический процессор и совместимый драйвер.
Дополнительный
Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование и Подготовку Необходимых как условие продуктов.
Используйте coder.checkGpuInstall
функция, чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Этот пример использует yolov2ResNet50VehicleExample
MAT-файл, содержащий предварительно обученную сеть. Файл составляет приблизительно 98 МБ в размере. Загрузите файл с веб-сайта MathWorks.
matFile = matlab.internal.examples.downloadSupportFile('vision/data','yolov2ResNet50VehicleExample.mat'); vehicleDetector = load(matFile); net = vehicleDetector.detector.Network
net = DAGNetwork with properties: Layers: [150×1 nnet.cnn.layer.Layer] Connections: [162×2 table] InputNames: {'input_1'} OutputNames: {'yolov2OutputLayer'}
Сеть DAG содержит 150 слоев включая свертку, ReLU, и слои нормализации партии. и YOLO v2 преобразовывают и YOLO v2 выходные слои. Чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения, используйте analyzeNetwork
(Deep Learning Toolbox) функция.
analyzeNetwork(net);
yolov2_detect
Функция точки входаyolov2_detect.m
функция точки входа берет вход изображений и запускает детектор на изображении с помощью нейронной сети для глубокого обучения, сохраненной в yolov2ResNet50VehicleExample.mat
файл. Функция загружает сетевой объект от yolov2ResNet50VehicleExample.mat
файл в персистентную переменную yolov2Obj и повторные использования постоянный объект на последующих вызовах обнаружения.
type('yolov2_detect.m')
function outImg = yolov2_detect(in,matFile) % Copyright 2018-2021 The MathWorks, Inc. persistent yolov2Obj; if isempty(yolov2Obj) yolov2Obj = coder.loadDeepLearningNetwork(matFile); end % Call to detect method [bboxes,~,labels] = yolov2Obj.detect(in,'Threshold',0.5); % Convert categorical labels to cell array of charactor vectors labels = cellstr(labels); % Annotate detections in the image. outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);
Чтобы сгенерировать код CUDA для функции точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig
функция, чтобы создать CuDNN
объект настройки глубокого обучения и присвоение это к DeepLearningConfig
свойство объекта настройки графического процессора кода. Запустите codegen
команда, задающая входной размер 224 224 3. Это значение соответствует входному размеру слоя YOLOv2.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); cfg.GenerateReport = true; inputArgs = {ones(224,224,3,'uint8'),coder.Constant(matFile)}; codegen -config cfg yolov2_detect -args inputArgs
Code generation successful: View report
Настройте читателя видеофайла и считайте входное видео. Создайте видеоплеер, чтобы отобразить видео и выходные обнаружения.
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,[224,224]); out = yolov2_detect_mex(in,matFile); step(depVideoPlayer, out); % Exit the loop if the video player figure window is closed cont = ~isDone(videoFreader) && isOpen(depVideoPlayer); end
[1] Redmon, Джозеф и Али Фархади. "YOLO9000: лучше, быстрее, более сильный". 2 017 конференций по IEEE по компьютерному зрению и распознаванию образов (CVPR). IEEE, 2017.
Copyright 2017-2021The MathWorks, Inc.
coder.gpuConfig
| coder.gpuEnvConfig
| coder.CuDNNConfig
| vision.VideoFileReader
(Computer Vision Toolbox) | vision.DeployableVideoPlayer
(Computer Vision Toolbox)