Сгенерируйте Код С++ для Обнаружения объектов Используя YOLO v2 и Intel MKL-DNN

В этом примере показано, как сгенерировать Код С++ для сети обнаружения объектов YOLO v2 на процессоре Intel®. Сгенерированный код использует Math Kernel Library Intel для Глубоких нейронных сетей (MKL-DNN).

Для получения дополнительной информации смотрите, что Обнаружение объектов Использует Глубокое обучение (Computer Vision Toolbox) YOLO v2.

Необходимые условия

  • Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)

  • Пошлите Поддержку центрального процессора MKLDNN знать список процессоров, который поддерживает библиотеку MKL-DNN

  • MATLAB® Coder™ для генерации Кода С++

  • Интерфейс MATLAB Coder для пакета поддержки Глубокого обучения

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

  • Computer Vision Toolbox™ для видео операций I/O

Для получения дополнительной информации о поддерживаемых версиях компиляторов и библиотек, см. Стороннее Аппаратное и программное обеспечение (MATLAB Coder).

Этот пример поддерживается на Linux®, Windows® и macOS платформах и не поддерживаемый для MATLAB Online.

Получите предварительно обученный DAGNetwork Объект

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

net = getYOLOv2();
Downloading pretrained detector (98 MB)...

Используйте команду net.Layers видеть все слои сети.

net.Layers

Генерация кода для yolov2_detection Функция

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

type('yolov2_detection.m')
function outImg = yolov2_detection(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
% set up. Subsequent calls to the function reuse the same object to call detection 
% on inputs, thus avoiding having to reconstruct and reload 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);
outImg = in;

% convert categorical labels to cell array of character vectors 
labels = cellstr(labels);


if ~(isempty(bboxes) && isempty(labels))
% Annotate detections in the image.
    outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);
end

Чтобы сгенерировать код, создайте объект настройки кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig функция, чтобы создать объект настройки глубокого обучения MKL-DNN. Присвойте этот объект DeepLearningConfig свойство объекта настройки кода. Задайте входной размер в качестве аргумента к codegen команда. В этом примере входным размером слоя сети YOLO v2 является [224,224,3].

cfg = coder.config('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn');
codegen -config cfg yolov2_detection -args {ones(224,224,3,'uint8')} -report
Code generation successful: To view the report, open('codegen/mex/yolov2_detection/html/report.mldatx').

Запустите сгенерированную MEX-функцию на входе в качестве примера

Настройте читателя видеофайла и считайте входное видео в качестве примера highway_lanechange.mp4. Создайте видеоплеер, чтобы отобразить видео и выходные обнаружения.

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_detection_mex(in);
    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), 6517–25. Гонолулу, HI: IEEE, 2017.

Смотрите также

(MATLAB Coder) | (MATLAB Coder)

Похожие темы