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

В этом примере показано, как сгенерировать Код С++ из модели 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

Следующая схема показывает модель 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 = ax^2+bx+c$

Здесь, 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');

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

В панели Генерации кода выберите 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');
Для просмотра документации необходимо авторизоваться на сайте