В этом примере показано, как разработать приложение 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.
CUDA включил NVIDIA графический процессор.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование и Подготовку Необходимых как условие продуктов.
Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте 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 для выполнения маршрута и обнаружения транспортного средства на видео трафика показывают. Когда модель запускается, Video Viewer
блок отображает видео трафика с аннотациями транспортного средства и маршрутом.
open_system('laneAndVehicleDetection');
Predict
блок загружает предварительно обученную сеть обнаружения маршрута от trainedLaneNet.mat
файл. Эта сеть берет изображение в качестве входа и выходных параметров два контура маршрута, которые соответствуют левым и правым маршрутам автомобиля, оборудованного датчиком. Каждый контур маршрута представлен параболическим уравнением:
Здесь 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 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. 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
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 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)...
Открытое диалоговое окно 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');
В панели Генерации кода выберите 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')");
Подпапка под названием 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');
bdclose
(Simulink) | close_system
(Simulink) | get_param
(Simulink) | load_system
(Simulink) | open_system
(Simulink) | save_system
(Simulink) | set_param
(Simulink) | sim
(Simulink) | slbuild
(Simulink)