Генерация кода для Обнаружения объектов Используя YOLO v2

Этот пример показывает, как сгенерировать код CUDA® для Обнаружения объектов Используя пример YOLO v2 Глубокого обучения от Computer Vision Toolbox™.

Предпосылки

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

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

  • Библиотека NVIDIA cuDNN v7 или выше.

  • Библиотеки OpenCV 3.1.0 для видео чтения и изображения отображают операции.

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

  • Deep Learning Toolbox™ для использования объектов SeriesNetwork.

  • GPU Coder™ для генерации кода CUDA.

  • Интерфейс 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 = getYOLOv2();

Сеть DAG содержит 150 слоев включая свертку, ReLU, и пакетные слои нормализации наряду с YOLO v2 преобразовывают и YOLO v2 выходные слои. Используйте сетевую команду. Слои, чтобы видеть все слои сети.

net.Layers

О функции 'yolov2_detect'

Функция yolov2_detect.m берет вход изображений, и запустите детектор на изображении с помощью нейронной сети для глубокого обучения, сохраненной в yolov2ResNet50VehicleExample.mat файле. Функция загружает сетевой объект от yolov2ResNet50VehicleExample.mat в персистентную переменную mynet. На последующих вызовах функции постоянный объект снова используется для обнаружения.

type('yolov2_detect.m')
function outImg = yolov2_detect(in)

%   Copyright 2018-2019 The MathWorks, Inc.

% A persistent object yolov2Obj is used to load the YOLOv2ObjectDetector object.
% At the first call to this function, the persistent object is constructed and
% setup. When the function is called subsequent times, the same object is reused 
% to call detection on inputs, thus avoiding reconstructing and reloading the
% network object.
persistent yolov2Obj;

if isempty(yolov2Obj)
    yolov2Obj = coder.loadDeepLearningNetwork('yolov2ResNet50VehicleExample.mat');
end

% pass in input
[bboxes,~,labels] = yolov2Obj.detect(in,'Threshold',0.5);

% Annotate detections in the image.
outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);

Запустите генерацию кода MEX для функции 'yolov2_detect'

Чтобы сгенерировать код CUDA из файла yolov2_detect.m проекта, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте функцию coder.DeepLearningConfig, чтобы создать объект настройки глубокого обучения CuDNN и присвоить ее свойству DeepLearningConfig объекта настройки графического процессора кода. Запустите команду codegen, задающую вход размера [224,224,3]. Это значение соответствует входному размеру слоя YOLOv2.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg yolov2_detect -args {ones(224,224,3,'uint8')} -report
Code generation successful: To view the report, open('codegen/mex/yolov2_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,[224,224]);
    out = yolov2_detect_mex(in);
    step(depVideoPlayer, out);
    cont = ~isDone(videoFreader) && isOpen(depVideoPlayer); % Exit the loop if the video player figure window is closed
end

Ссылки

[1] Redmon, Джозеф и Али Фархади. "YOLO9000: лучше, быстрее, более сильный". 2 017 конференций по IEEE по компьютерному зрению и распознаванию образов (CVPR). IEEE, 2017.