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

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

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

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

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

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

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

Необходимые условия для третьих лиц

Проверьте окружение GPU

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

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

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

Показан блок алгоритмического рабочего процесса модели Simulink.

Загрузить пример видео

if ~exist('./caltech_washington1.avi', 'file')
    url = 'https://www.mathworks.com/supportfiles/gpucoder/media/caltech_washington1.avi';
    websave('caltech_washington1.avi', url);
end

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

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

open_system('laneAndVehicleDetection');

Обнаружение маршрута

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

$y = ax^2+bx+c$

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

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

% Copyright 2020 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;

isRightLaneFound = abs(params(6)) > 0.5; %c should be more than 0.5 for it to be a right lane
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. The VehicleDetectionYOLOv2 Блок MATLAB function задает функцию vehicle_detection_yolo_v2 который загружает предварительно обученный детектор объектов YOLO v2. Эта сеть принимает изображение как вход и выводит координаты ограничивающего прямоугольника вместе с оценками достоверности для транспортных средств на изображении для последующей аннотации.

type vehicle_detection_yolo_v2
function [bboxes,scores] = vehicle_detection_yolo_v2(In)

% Copyright 2020 The MathWorks, Inc.

persistent yolodetector;
if isempty(yolodetector)
    yolodetector = coder.loadDeepLearningNetwork('yolov2ResNet50VehicleExample.mat');
end

[bboxes,scores,~] = yolodetector.detect(In, 'threshold', .2);

end

Аннотация ограничивающих коробок транспортного средства и траектории маршрута в видео трафика

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

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

% Copyright 2020 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

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

Функция загружает trainedLaneNet.mat и yolov2ResNet50VehicleExample.mat файлы, если они еще не присутствуют.

getVehicleDetectionAndLaneDetectionNetworks()
Downloading pretrained lane detection network (143 MB)...
Downloading pretrained vehicle detection network (98 MB)...

Запуск симуляции

Откройте диалоговое окно Параметры конфигурации.

На панели Simulation Target выберите ускорение графического процессора. В группе Глубокое обучение выберите целевую библиотеку как 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

На панели Генерация кода выберите Язык как C++ и включите Генерация кода GPU.

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

В подкатегории Libraries панели Генерация Кода > GPU Code включите 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.

Очистка

Закройте модель Simulink.

close_system('laneAndVehicleDetection/Lane and Vehicle Detection Output');
close_system('laneAndVehicleDetection');

См. также

Функции

Похожие темы