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

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

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

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

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

  • Обратитесь к разделу Поддержка Центральному Процессору MKLDNN, чтобы узнать список процессоров, поддерживающих библиотеку MKL-DNN

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

  • MATLAB Coder Interface для пакета поддержки глубокого обучения

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

  • Computer Vision Toolbox™ для операций ввода-вывода видео

Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Оборудование и программное обеспечение сторонних производителей.

Этот пример поддерживается на платформах 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 Функция

The 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 for MATLAB
% execution
if coder.target('MATLAB')
    labels = cellstr(labels);
end

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] Редмон, Джозеф и Али Фархади. «YOLO9000: Лучше, Быстрее, Сильнее». В 2017 году IEEE Conference on Компьютерное Зрение and Pattern Recognition (CVPR), 6517-25. Гонолулу, HI: IEEE, 2017.

См. также

|

Похожие темы