Генерация кода для Обнаружения объектов при помощи YOLO v2

В этом примере показано, как сгенерировать CUDA® MEX для вы только смотрите однажды (YOLO) v2 детектор объектов. Сеть обнаружения объектов YOLO v2 состоит из двух подсетей. Сеть извлечения признаков сопровождается сетью обнаружения. Этот пример генерирует код для сети, обученной в Обнаружении объектов Используя пример YOLO v2 от Computer Vision Toolbox™. Для получения дополнительной информации смотрите, что Обнаружение объектов Использует Глубокое обучение (Computer Vision Toolbox) YOLO v2.

Предпосылки

  • 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 = getYOLOv2();

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

analyzeNetwork(net);

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.

persistent yolov2Obj;

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

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

% convert categorical labels to cell array of charactor vectors for MATLAB
% execution
if coder.target('MATLAB')
    labels = cellstr(labels);
end

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

Запустите генерацию кода MEX

Чтобы сгенерировать код 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.

Для просмотра документации необходимо авторизоваться на сайте