Этот пример показывает, как разработать приложение 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.
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');
The Predict
блок загружает предварительно обученную сеть обнаружения маршрута из trainedLaneNet.mat
файл. Эта сеть принимает изображение как вход и выходы два контуров маршрута, которые соответствуют левой и правой полосе автомобиля , оборудованного датчиком. Каждый контур маршрута представлен параболическим уравнением:
Здесь 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');
На панели Генерация кода выберите Язык как 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')");
Подпапка с именем 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)