exponenta event banner

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

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

Предварительные условия для сторонних производителей

Необходимый

В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.

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

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

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

Проверка среды графического процессора

Используйте 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 (Deep Learning Toolbox).

analyzeNetwork(net);

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 (Кодер графического процессора) для создания 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] Редмон, Джозеф и Али Фархади. «YOLO9000: лучше, быстрее, сильнее». Конференция IEEE 2017 по компьютерному зрению и распознаванию образов (CVPR). IEEE, 2017.