В этом примере показано, как сгенерировать Код С++ из модели Simulink®, которая выполняет маршрут и обнаружение транспортного средства при помощи сверточных нейронных сетей (CNNs). Пример берет системы координат видео трафика как вход, выходные параметры два контура маршрута, которые соответствуют левым и правым маршрутам автомобиля, оборудованного датчиком, и обнаруживает транспортные средства в системе координат. Этот пример использует предварительно обученную сеть обнаружения маршрута и предварительно обученную сеть обнаружения транспортного средства от Обнаружения объектов Используя пример YOLO v2 Глубокого обучения Computer Vision Toolbox™. Для получения дополнительной информации смотрите, что Обнаружение объектов Использует Глубокое обучение (Computer Vision Toolbox) YOLO v2.
Этот пример иллюстрирует следующие концепции:
Смоделируйте приложение обнаружения маршрута в Simulink. Сначала вы обрабатываете видео трафика путем изменения размеров к 227 227 3 и умножения постоянным множителем 255. Впоследствии, вы обрабатываете видео трафика при помощи предварительно обученной сети, загруженной в блоке Predict из Deep Learning Toolbox™. Наконец, если левые и правые контуры маршрута обнаруживаются, параболические коэффициенты, чтобы смоделировать траектории контуров маршрута получены.
Смоделируйте приложение обнаружения транспортного средства в Simulink путем обработки видео трафика использование предварительно обученного детектора YOLO v2. Эта сеть обнаруживает транспортные средства в видео и выводит координаты ограничительных рамок для этих транспортных средств и их оценки достоверности.
Сконфигурируйте модель для генерации кода.
Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN).
Отошлите к Поддержке центрального процессора MKLDNN списка процессоров ту библиотеку MKL-DNN поддержки.
Deep Learning Toolbox™ для использования DAGNetwork
объект.
Computer Vision Toolbox™ для видео операций I/O.
Блок-схема для алгоритмического рабочего процесса модели Simulink следует.
Этот пример использует trainedLaneNet
и yolov2ResNet50VehicleExample
Файлы MAT, содержащие предварительно обученные сети. Файлы составляют приблизительно 143 Мбайта и 98 Мбайт в размере, соответственно. Загрузите файлы.
lanenetFile = matlab.internal.examples.downloadSupportFile('gpucoder/cnn_models/lane_detection','trainedLaneNet.mat'); vehiclenetFile = matlab.internal.examples.downloadSupportFile('vision/data','yolov2ResNet50VehicleExample.mat');
Чтобы протестировать модель, пример использует набор данных маршрутов Калифорнийского технологического института. Файл составляет приблизительно 16 Мбайт в размере. Загрузите этот файл.
mediaFile = matlab.internal.examples.downloadSupportFile('gpucoder/media','caltech_washington1.avi');
Следующая схема показывает модель Simulink для выполнения маршрута и обнаружения транспортного средства на видео трафика. Когда модель запускается, блок Video Viewer отображает видео трафика с аннотациями транспортного средства и маршрутом.
model='laneAndVehicleDetection';
open_system(model);
Установите пути к файлам загруженной сетевой модели в блоках Предсказывания и Детектора модели Simulink.
set_param('laneAndVehicleDetection/Lane Detection','NetworkFilePath',lanenetFile) set_param('laneAndVehicleDetection/Vehicle Detector','DetectorFilePath',vehiclenetFile)
Установите местоположение тестового видео, которое вы загружаете к модели Simulink.
set_param('laneAndVehicleDetection/Traffic Video','inputFileName',mediaFile)
Блок Predict загружает предварительно обученную сеть обнаружения маршрута от trainedLaneNet.mat
файл. Эта сеть берет изображение в качестве входа и выходных параметров два контура маршрута, которые соответствуют левым и правым маршрутам автомобиля, оборудованного датчиком. Каждый контур маршрута представлен параболическим уравнением:
Здесь, y является боковым смещением, и x является продольным расстоянием от транспортного средства. Сетевые выходные параметры эти три параметра a, b, и c на маршрут. 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. Модель Simulink выполняет обнаружение транспортного средства с помощью блока Object Detector. Этот блок берет изображение в качестве входа и выводит координаты ограничительной рамки наряду с оценками достоверности для транспортных средств в изображении.
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
Эта функция загружает yolov2ResNet50VehicleExample.mat
файл.
getVehicleDetectionAndLaneDetectionNetworks()
Открытое диалоговое окно Configuration Parameters. На Целевой панели Симуляции, в группе Глубокого обучения, выбирают библиотеку Target как MKL-DNN
.
set_param(model,'SimDLTargetLibrary','MKL-DNN');
На Интерфейсной панели, в группе Глубокого обучения, выбирают библиотеку Target как MKL-DNN
.
set_param(model, 'DLTargetLibrary','MKL-DNN');
Чтобы проверить маршрут и алгоритмы обнаружения транспортного средства и отобразить траектории маршрута, ограничительные рамки транспортного средства и музыка к видео трафика, загруженному в модели Simulink, запускают симуляцию.
set_param('laneAndVehicleDetection', 'SimulationMode', 'Normal'); sim('laneAndVehicleDetection');
В панели Генерации кода выберите Language как C++.
set_param(model,'TargetLang','C++');
Сгенерируйте и создайте модель Simulink с помощью slbuild
команда. Генератор кода помещает файлы в laneAndVehicleDetection_grt_rtw
создайте подпапку под своей текущей рабочей папкой.
currentDir = pwd;
status = evalc("slbuild('laneAndVehicleDetection')");
Подпапка под названием laneAndVehicleDetection_grt_rtw
содержит сгенерированный Код С++, соответствующий различным блокам в модели Simulink и определенных операциях, выполняемых в тех блоках. Например, файл trainedLaneNet0_0.h
содержит класс C++, который содержит атрибуты и функции членства, представляющие предварительно обученную сеть обнаружения маршрута.
hfile = fullfile(currentDir, 'laneAndVehicleDetection_grt_rtw',... 'trainedLaneNet0_0.h'); rtwdemodbtype(hfile,'#ifndef RTW_HEADER_trainedLaneNet0_0_h_',... '#endif')
#ifndef RTW_HEADER_trainedLaneNet0_0_h_ #define RTW_HEADER_trainedLaneNet0_0_h_ #include "rtwtypes.h" #include "MWMkldnnTargetNetworkImpl.hpp" #include "MWTensorBase.hpp" #include "MWTensor.hpp" #include "MWCNNLayer.hpp" #include "MWInputLayer.hpp" #include "MWElementwiseAffineLayer.hpp" #include "MWFusedConvActivationLayer.hpp" #include "MWNormLayer.hpp" #include "MWMaxPoolingLayer.hpp" #include "MWFCLayer.hpp" #include "MWReLULayer.hpp" #include "MWOutputLayer.hpp" #include "MWConvLayer.hpp" #include "MWYoloExtractionLayer.hpp" #include "MWSigmoidLayer.hpp" #include "MWExponentialLayer.hpp" #include "MWYoloSoftmaxLayer.hpp" #include "MWConcatenationLayer.hpp" #include "MWActivationFunctionType.hpp" #include "MWRNNParameterTypes.hpp" #include "MWTargetTypes.hpp" #include "MWMkldnnUtils.hpp" #include "MWMkldnnCustomLayerBase.hpp" class trainedLaneNet0_0 { public: trainedLaneNet0_0(); void setSize(); void resetState(); void setup(); void predict(); void cleanup(); real32_T *getLayerOutput(int32_T layerIndex, int32_T portIndex); int32_T getLayerOutputSize(int32_T layerIndex, int32_T portIndex); real32_T *getInputDataPointer(int32_T index); real32_T *getInputDataPointer(); real32_T *getOutputDataPointer(int32_T index); real32_T *getOutputDataPointer(); int32_T getBatchSize(); ~trainedLaneNet0_0(); private: int32_T numLayers; boolean_T isInitialized; MWTensorBase *inputTensors; MWTensorBase *outputTensors; MWCNNLayer *layers[18]; MWMkldnnTarget::MWTargetNetworkImpl *targetImpl; void allocate(); void postsetup(); void deallocate(); };
Точно так же файл yolov2ResNet50VehicleExample0_0.h
содержит класс C++, который представляет предварительно обученную сеть обнаружения YOLO v2.
hfile = fullfile(currentDir, 'laneAndVehicleDetection_grt_rtw',... 'yolov2ResNet50VehicleExample0_0.h'); rtwdemodbtype(hfile,'#ifndef RTW_HEADER_yolov2ResNet50VehicleExample0_0_h_',... '#endif')
#ifndef RTW_HEADER_yolov2ResNet50VehicleExample0_0_h_ #define RTW_HEADER_yolov2ResNet50VehicleExample0_0_h_ #include "rtwtypes.h" #include "MWMkldnnTargetNetworkImpl.hpp" #include "MWTensorBase.hpp" #include "MWTensor.hpp" #include "MWCNNLayer.hpp" #include "MWInputLayer.hpp" #include "MWElementwiseAffineLayer.hpp" #include "MWFusedConvActivationLayer.hpp" #include "MWNormLayer.hpp" #include "MWMaxPoolingLayer.hpp" #include "MWFCLayer.hpp" #include "MWReLULayer.hpp" #include "MWOutputLayer.hpp" #include "MWConvLayer.hpp" #include "MWYoloExtractionLayer.hpp" #include "MWSigmoidLayer.hpp" #include "MWExponentialLayer.hpp" #include "MWYoloSoftmaxLayer.hpp" #include "MWConcatenationLayer.hpp" #include "MWActivationFunctionType.hpp" #include "MWRNNParameterTypes.hpp" #include "MWTargetTypes.hpp" #include "MWMkldnnUtils.hpp" #include "MWMkldnnCustomLayerBase.hpp" class yolov2ResNet50VehicleExample0_0 { public: yolov2ResNet50VehicleExample0_0(); void setSize(); void resetState(); void setup(); void predict(); void activations(int32_T layerIdx); void cleanup(); real32_T *getLayerOutput(int32_T layerIndex, int32_T portIndex); int32_T getLayerOutputSize(int32_T layerIndex, int32_T portIndex); real32_T *getInputDataPointer(int32_T index); real32_T *getInputDataPointer(); real32_T *getOutputDataPointer(int32_T index); real32_T *getOutputDataPointer(); int32_T getBatchSize(); ~yolov2ResNet50VehicleExample0_0(); private: int32_T numLayers; boolean_T isInitialized; MWTensorBase *inputTensors; MWTensorBase *outputTensors; MWCNNLayer *layers[57]; MWMkldnnTarget::MWTargetNetworkImpl *targetImpl; void allocate(); void postsetup(); void deallocate(); };
Примечание: Если Системный параметр конечного файла устанавливается на grt.tlc
, необходимо выбрать код Generate только параметр конфигурации модели. Если вы устанавливаете Системный конечный файл на ert.tlc
, можно очистить Сгенерировать код только параметр, но создать исполняемый файл, необходимо сгенерировать пример основная программа.
Закройте модель Simulink.
close_system('laneAndVehicleDetection');