Генерация кода для Глубокого обучения Модель Simulink, которая Выполняет Обнаружение Маршрута и Транспортного средства

В этом примере показано, как разработать приложение CUDA® из модели Simulink®, которая выполняет маршрут и сверточные нейронные сети (CNN) использования обнаружения транспортного средства. Этот пример берет системы координат видео трафика как вход, выходные параметры два контура маршрута, которые соответствуют левым и правым маршрутам автомобиля, оборудованного датчиком, и обнаруживает транспортные средства в системе координат. Этот пример использует предварительно обученную сеть обнаружения маршрута от Обнаружения Маршрута, Оптимизированного с примером GPU Coder GPU Coder Toolbox™. Для получения дополнительной информации смотрите Обнаружение Маршрута, Оптимизированное с GPU Coder. Этот пример также использует предварительно обученную сеть обнаружения транспортного средства от Обнаружения объектов Используя пример YOLO v2 Глубокого обучения Компьютерного зрения toolbox™. Для получения дополнительной информации смотрите, что Обнаружение объектов Использует Глубокое обучение (Computer Vision Toolbox) YOLO v2.

Этот пример иллюстрирует следующие концепции:

  • Смоделируйте приложение обнаружения маршрута в Simulink. Сначала видео трафика предварительно обрабатывается путем изменения размеров к 227x227x3 и умножение постоянным множителем 255. Впоследствии, это обрабатывается предварительно обученной сетью, загруженной в Predict блок из Deep Learning Toolbox™. Наконец, если левые и правые контуры маршрута обнаруживаются, параболические коэффициенты, чтобы смоделировать траектории контуров маршрута получены.

  • Смоделируйте приложение обнаружения транспортного средства в Simulink. Видео трафика обрабатывается предварительно обученным детектором YOLO v2. Эта сеть обнаруживает транспортные средства в видео и выводит координаты ограничительных рамок для этих транспортных средств и их оценки достоверности.

  • Сконфигурируйте модель для генерации кода.

  • Сгенерируйте исполняемый файл CUDA для модели Simulink.

Сторонние необходимые условия

Проверьте среду графического процессора

Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте coder.checkGpuInstall функция.

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

Алгоритмический рабочий процесс

Блок-схему для алгоритмического рабочего процесса модели Simulink показывают.

Получите предварительно обученные сети обнаружения маршрута и транспортного средства

Этот пример использует trainedLaneNet и yolov2ResNet50VehicleExample MAT-файлы, содержащие предварительно обученные сети. Файлы составляют приблизительно 143 МБ и 98 МБ в размере, соответственно. Загрузите файлы с веб-сайта MathWorks.

lanenetFile = matlab.internal.examples.downloadSupportFile('gpucoder/cnn_models/lane_detection','trainedLaneNet.mat');
vehiclenetFile = matlab.internal.examples.downloadSupportFile('vision/data','yolov2ResNet50VehicleExample.mat');

Загрузите тестовое видео трафика

Чтобы протестировать модель, пример использует набор данных маршрутов Калифорнийского технологического института. Файл составляет приблизительно 16 Мбайт в размере. Загрузите файлы с веб-сайта MathWorks.

mediaFile = matlab.internal.examples.downloadSupportFile('gpucoder/media','caltech_washington1.avi');

Маршрут и обнаружение транспортного средства модель Simulink

Модель Simulink для выполнения маршрута и обнаружения транспортного средства на видео трафика показывают. Когда модель запускается, Video Viewer блок отображает видео трафика с аннотациями транспортного средства и маршрутом.

open_system('laneAndVehicleDetection');

Установите пути к файлам dowloaded сетевой модели в предсказывании и блоках детектора модели Simulink. Установите местоположение тестового видео загружаться моделью Simulink.

set_param('laneAndVehicleDetection/Lane Detection','NetworkFilePath',lanenetFile)
set_param('laneAndVehicleDetection/Vehicle Detector','DetectorFilePath',vehiclenetFile)
set_param('laneAndVehicleDetection/Traffic Video','inputFileName',mediaFile)

Детектор линий разметки

Predict блок загружает предварительно обученную сеть обнаружения маршрута от trainedLaneNet.mat файл. Эта сеть берет изображение в качестве входа и выходных параметров два контура маршрута, которые соответствуют левым и правым маршрутам автомобиля, оборудованного датчиком. Каждый контур маршрута представлен параболическим уравнением:

$y = ax^2+bx+c$

Здесь y является боковым смещением, и x является продольным расстоянием от транспортного средства. Сетевые выходные параметры эти три параметра a, b, и c на маршрут. Сетевая архитектура похожа на AlexNet за исключением того, что последние несколько слоев заменяются меньшим полносвязным слоем и регрессией выходной слой. LaneDetectionCoordinates Блок MATLAB function задает функциональный lane_detection_coordinates это берет выход из предсказать блока и выходные параметры три параметра т.е. laneFound, ltPts и rtPts. Пороговая обработка используется, чтобы определить, найдены ли оба левых и правых контура маршрута оба. Если оба найдены, laneFound набор должен быть верным, и траектории контуров вычисляются и хранятся в ltPts и rtPts соответственно.

type lane_detection_coordinates
function [laneFound,ltPts,rtPts] = lane_detection_coordinates(laneNetOut)

% Copyright 2020-2021 The MathWorks, Inc.

persistent laneCoeffMeans;
if isempty(laneCoeffMeans)
    laneCoeffMeans = [-0.0002,0.0002,1.4740,-0.0002,0.0045,-1.3787];
end

persistent laneCoeffStds;
if isempty(laneCoeffStds)
    laneCoeffStds = [0.0030,0.0766,0.6313,0.0026,0.0736,0.9846];
end

params = laneNetOut .* laneCoeffStds + laneCoeffMeans;

% 'c' should be more than 0.5 for it to be a right lane
isRightLaneFound = abs(params(6)) > 0.5;
isLeftLaneFound =  abs(params(3)) > 0.5;

persistent vehicleXPoints;
if isempty(vehicleXPoints)
    vehicleXPoints = 3:30; %meters, ahead of the sensor
end

ltPts = coder.nullcopy(zeros(28,2,'single'));
rtPts = coder.nullcopy(zeros(28,2,'single'));

if isRightLaneFound && isLeftLaneFound
    rtBoundary = params(4:6);
    rt_y = computeBoundaryModel(rtBoundary, vehicleXPoints);
    ltBoundary = params(1:3);
    lt_y = computeBoundaryModel(ltBoundary, vehicleXPoints);
    
    % Visualize lane boundaries of the ego vehicle
    tform = get_tformToImage;
    % Map vehicle to image coordinates
    ltPts =  tform.transformPointsInverse([vehicleXPoints', lt_y']);
    rtPts =  tform.transformPointsInverse([vehicleXPoints', rt_y']);
    laneFound = true;
else
    laneFound = false;
end

end

Обнаружение транспортного средства

Сеть обнаружения объектов YOLO v2 состоит из двух подсетей: сеть извлечения признаков сопровождается сетью обнаружения. Эта предварительно обученная сеть использует ResNet-50 для извлечения признаков. Подсеть обнаружения является маленьким CNN по сравнению с сетью извлечения признаков и состоит из нескольких сверточных слоев и слоев, характерных для YOLO v2. Модель Simulink выполняет обнаружение транспортного средства с помощью Object Detector блок из Computer Vision Toolbox(TM). Этот блок берет изображение в качестве входа и выводит координаты ограничительной рамки наряду с оценками достоверности для транспортных средств в изображении.

Аннотация ограничительных рамок транспортного средства и траектории маршрута в видео трафика

LaneVehicleAnnotation Блок MATLAB function задает функциональный lane_vehicle_annotation который аннотирует ограничительные рамки транспортного средства наряду с оценками достоверности. Кроме того, если laneFound верно, затем левые и правые контуры маршрута, сохраненные в ltPts и rtPts аннотируются в видео трафика.

type lane_vehicle_annotation
function In = lane_vehicle_annotation(laneFound,ltPts,rtPts,bboxes,scores,In)

% Copyright 2020-2021 The MathWorks, Inc.

if ~isempty(bboxes)
    In = insertObjectAnnotation(In, 'rectangle',bboxes,scores);
end

pts = coder.nullcopy(zeros(28, 4, 'single'));
if laneFound
    prevpt =  [ltPts(1,1) ltPts(1,2)];
    for k = 2:1:28
        pts(k,1:4) = [prevpt ltPts(k,1) ltPts(k,2)];
        prevpt = [ltPts(k,1) ltPts(k,2)];
    end
    In = insertShape(In, 'Line', pts, 'LineWidth', 2);
    prevpt =  [rtPts(1,1) rtPts(1,2)];
    for k = 2:1:28
        pts(k,1:4) = [prevpt rtPts(k,1) rtPts(k,2)];
        prevpt = [rtPts(k,1) rtPts(k,2)];
    end
    In = insertShape(In, 'Line', pts, 'LineWidth', 2);
    In = insertMarker(In, ltPts);
    In = insertMarker(In, rtPts);
end

end

Запустите симуляцию

Открытое диалоговое окно Configuration Parameters.

В Целевой панели Симуляции выберите ускорение GPU. В группе Глубокого обучения выберите целевую библиотеку как cuDNN.

set_param(bdroot,'GPUAcceleration','on');
set_param(bdroot,'SimDLTargetLibrary','cudnn');
set_param(bdroot,'DLTargetLibrary','cudnn');

Чтобы проверить маршрут и алгоритмы обнаружения транспортного средства и отобразить траектории маршрута, ограничительные рамки транспортного средства и музыку к видео трафика, загруженному в модели Simulink, запускают симуляцию.

set_param('laneAndVehicleDetection', 'SimulationMode', 'Normal');
sim('laneAndVehicleDetection');

Сгенерируйте и создайте модель Simulink

В панели Генерации кода выберите Language как C++ и включите, Генерируют код графического процессора.

set_param(bdroot,'TargetLang','C++');
set_param(bdroot,'GenerateGPUCode','CUDA');

В Библиотеках подкатегории Генерации кода> панель графического процессора Кода, включите cuBLAS, cuSOLVER и cuFFT.

set_param(bdroot,'GPUcuBLAS','on');
set_param(bdroot,'GPUcuSOLVER','on');
set_param(bdroot,'GPUcuFFT','on');

Сгенерируйте и создайте модель Simulink на хосте графический процессор при помощи slbuild команда. Генератор кода помещает файлы в папку сборки, подпапку под названием laneAndVehicleDetection_ert_rtw под вашей текущей рабочей папкой.

status = evalc("slbuild('laneAndVehicleDetection')");

Сгенерированный код CUDA

Подпапка под названием laneAndVehicleDetection_ert_rtw содержит сгенерированные Коды С++, соответствующие различным блокам в модели Simulink и определенных операциях, выполняемых в тех блоках. Например, файл trainedLaneNet0_laneAndVehicleDetection0.h содержит класс C++, который содержит атрибуты и функции членства, представляющие предварительно обученную сеть обнаружения маршрута.

Точно так же файл yolov2ResNet50VehicleExample0_laneAndVehicleDetection0.h содержит класс C++, представляющий предварительно обученную сеть обнаружения YOLO v2.

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

Функции

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте