exponenta event banner

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

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

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

Предпосылки

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

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

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

  • Кодерный интерфейс MATLAB для пакета поддержки Deep Learning

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

  • Компьютерное зрение 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 Функция

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 по компьютерному зрению и распознаванию образов (CVPR), 6517-25. Гонолулу, HI: IEEE, 2017.

См. также

|

Связанные темы