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

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

Необходимые условия для третьих лиц

Необходимый

Этот пример генерирует CUDA MEX и имеет следующие требования к третьим лицам.

  • Графический процессор NVIDIA с поддержкой CUDA ® и совместимый драйвер.

Дополнительный

Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверьте окружение GPU

Используйте coder.checkGpuInstall (GPU Coder) для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.

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);

The yolov2_detect Функция точки входа

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

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 функции точки входа, создайте объект строения кода GPU для цели MEX и установите целевой язык на C++. Используйте coder.DeepLearningConfig (GPU Coder) функция для создания CuDNN объект строения глубокого обучения и присвоение его DeepLearningConfig свойство объекта строения кода GPU. Запуск 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] Редмон, Джозеф и Али Фархади. YOLO9000: Better, Faster, Stronger ". 2017 IEEE Conference on Компьютерное Зрение and Pattern Recognition (CVPR). IEEE, 2017.