执行车道和车辆检测的深度学习Simulink模型的代码生成
这个例子展示了如何从Simulink®模型生成c++代码,该模型通过使用卷积神经网络(cnn)执行车道和车辆检测。该示例以交通视频的帧作为输入,输出对应于自我车辆左右车道的两个车道边界,并检测帧中的车辆。本例使用预训练的车道检测网络和预训练的车辆检测网络使用YOLO v2深度学习的目标检测计算机视觉工具箱™的例子。有关更多信息,请参见使用YOLO v2深度学习的目标检测(计算机视觉工具箱).
本例说明了以下概念:
在Simulink中建模车道检测应用。首先,通过将大小调整为227 × 227 × 3并乘以255的常数因子来处理交通视频。随后,您可以使用深度学习工具箱™中加载在预测块中的预训练网络来处理交通视频。最后,在检测到左右车道边界的情况下,得到用于模拟车道边界轨迹的抛物线系数。
通过使用预训练的YOLO v2检测器处理交通视频,在Simulink中建模车辆检测应用程序。该网络检测视频中的车辆,并输出这些车辆的边界框坐标及其置信度分数。
为代码生成配置模型。
先决条件
深度神经网络的英特尔数学内核库(MKL-DNN)。
指MKLDNN CPU支持参阅支持mml - dnn库的处理器列表。
深度学习工具箱™用于使用
DAGNetwork
对象。计算机视觉工具箱™视频I/O操作。
算法流程
下面是Simulink模型的算法工作流程框图。
预先训练车道和车辆检测网络
本例使用trainedLaneNet
而且yolov2ResNet50VehicleExample
包含预训练网络的MAT文件。文件大小分别约为143 MB和98 MB。下载文件。
lanenetFile = matlab.internal.examples.downloadSupportFile(“gpucoder / cnn_models / lane_detection”,“trainedLaneNet.mat”);vehiclenetFile = matlab.internal.examples.downloadSupportFile(“视觉/数据”,“yolov2ResNet50VehicleExample.mat”);
下载测试交通视频
为了测试该模型,示例使用了加州理工学院的lanes数据集。该文件大小约为16mb。下载这个文件。
mediaFile = matlab.internal.examples.downloadSupportFile(“gpucoder /媒体”,“caltech_washington1.avi”);
车道和车辆检测仿真模型
下图显示了在交通视频上执行车道和车辆检测的Simulink模型。当模型运行时,视频查看器块显示带有车道和车辆注释的交通视频。
模型=“laneAndVehicleDetection”;open_system(模型);
在Simulink模型的“Predict”和“Detector”块中设置下载的网络模型的文件路径。
set_param (“laneAndVehicleDetection /车道检测”,“NetworkFilePath”lanenetFile) set_param (“laneAndVehicleDetection /车辆检测器”,“DetectorFilePath”vehiclenetFile)
设置加载到Simulink模型的测试视频的位置。
set_param (“laneAndVehicleDetection /交通视频”,“inputFileName”mediaFile)
车道检测
预测块加载预训练的车道检测网络从trainedLaneNet.mat
文件。该网络将图像作为输入,并输出两个车道边界,分别对应于自我车辆的左右车道。每个车道边界由抛物方程表示:
这里,y是横向偏移量,x是与车辆的纵向距离。网络在每个车道上输出三个参数a、b和c。的LaneDetectionCoordinates
MATLAB函数块定义了一个函数lane_detection_coordinates
从预测块中获取输出,并输出三个参数:laneFound
,ltPts
,rtPts
.该块使用阈值来确定是否同时找到了左右车道边界。如果找到了,laneFound
设为真,边界的轨迹被计算并存储ltPts
而且rtPts
.
类型lane_detection_coordinates
function [laneFound,ltPts,rtPts] = lane_detection_coordinates(laneNetOut) %版权所有2020if isempty(laneCoeffMeans) laneCoeffMeans = [-0.0002 0.0002 1.4740 -0.0002 0.0045 -1.3787];结束持久化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应该大于0.5,这是一个右车道isLeftLaneFound = abs(params(3)) > 0.5;持久vehicleXPoints;if isempty(vehicleXPoints) = 3:30;%meters, ahead of sensor end ltPts = code .nullcopy(zero (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函数块定义了一个函数lane_vehicle_annotation
,用置信度分数标注车辆边界框。同样,如果laneFound
是真的,那么左右车道的界限存储在哪里呢ltPts
而且rtPts
都在交通视频中标注了。
类型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);结束PTS =编码器。Nullcopy (0 (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 ()
运行仿真
打开配置参数对话框。在模拟目标窗格,在深度学习组,选择目标库为MKL-DNN
.
set_param(模型,“SimDLTargetLibrary”,“MKL-DNN”);
在接口窗格,在深度学习组,选择目标库作为MKL-DNN
.
set_param(模型,“DLTargetLibrary”,“MKL-DNN”);
为了验证车道和车辆检测算法,并显示加载在Simulink模型中的交通视频的车道轨迹、车辆包围框和分数,请运行仿真。
set_param (“laneAndVehicleDetection”,“SimulationMode”,“正常”);sim卡(“laneAndVehicleDetection”);
生成和构建Simulink模型
在代码生成窗格中,选择语言作为c++.
set_param(模型,“TargetLang”,“c++”);
工具生成并构建Simulink模型slbuild
命令。代码生成器将文件放在laneAndVehicleDetection_grt_rtw
在当前工作文件夹下构建子文件夹。
currentDir = pwd;状态= evalc(“slbuild (laneAndVehicleDetection)”);
生成c++代码
子文件夹名为laneAndVehicleDetection_grt_rtw
包含生成的与Simulink模型中不同块对应的c++代码,以及在这些块中执行的特定操作。例如,文件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“MWTensorBase.hpp”#include“MWTensorBase.hpp”#include“MWTensorBase.hpp”#include“MWTensorBase.hpp”#include“MWTensorBase.hpp”#include“MWCNNLayer.hpp”#include“MWFusedConvActivationLayer.hpp”#include“MWNormLayer.hpp”#include“MWFusedConvActivationLayer.hpp”#include“MWNormLayer.hpp”#include“MWFCLayer.hpp”#include“MWOutputLayer.hpp”#include“MWOutputLayer.hpp”#include“MWOutputLayer.hpp”#include "MWYoloExtractionLayer.hpp" #include " mwwyolosoftmaxlayer .hpp" #include "MWConcatenationLayer.hpp" #include "MWActivationFunctionType.hpp" #include "MWRNNParameterTypes.hpp" #include "MWTargetTypes.hpp" #include " shared_layers_export_宏。hpp" #include "MWOnednnUtils.hpp" #include "MWOnednnCustomLayerBase.hpp" #include "MWOnednnCommonHeaders.hpp" class trainedLaneNet0_0 {public: boolean_T isInitialized;boolean_T matlabCodegenIsDeleted;trainedLaneNet0_0 ();setSize无效();空白resetState ();无效的设置();无效的预测();无效的清理();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; MWTensorBase *inputTensors; MWTensorBase *outputTensors; MWCNNLayer *layers[18]; MWOnednnTarget::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_ #include RTW_HEADER_yolov2ResNet50VehicleExample0_0_h_ #include“MWTensorBase.hpp”#include“MWTensorBase.hpp”#include“MWTensorBase.hpp”#include“MWTensorBase.hpp”#include“MWTensorBase.hpp”#include“MWCNNLayer.hpp”#include“MWFusedConvActivationLayer.hpp”#include“MWNormLayer.hpp”#include“MWFusedConvActivationLayer.hpp”#include“MWFCLayer.hpp”#include“MWReLULayer.hpp”#include“MWOutputLayer.hpp”#include#include "MWConvLayer.hpp" #include "MWYoloExtractionLayer.hpp" #include " mwwyolosoftmaxlayer .hpp" #include "MWConcatenationLayer.hpp" #include "MWActivationFunctionType.hpp" #include "MWRNNParameterTypes.hpp" #include "MWTargetTypes.hpp" #include " shared_layers_export_宏。hpp" #include "MWOnednnUtils.hpp" #include "MWOnednnCustomLayerBase.hpp" #include "MWOnednnCommonHeaders.hpp" class yolov2ResNet50VehicleExample0_0 {public:boolean_T isInitialized;boolean_T matlabCodegenIsDeleted;yolov2ResNet50VehicleExample0_0 ();setSize无效();空白resetState ();无效的设置();无效的预测();void激活(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; MWTensorBase *inputTensors; MWTensorBase *outputTensors; MWCNNLayer *layers[57]; MWOnednnTarget::MWTargetNetworkImpl *targetImpl; void allocate(); void postsetup(); void deallocate(); };
注意:如果系统目标文件参数设置为grt.tlc
,则必须选择只生成代码模型配置参数。如果你设置系统目标文件来ert.tlc
,可以清除只生成代码参数,但要创建可执行文件,必须生成一个示例主程序。
清理
关闭Simulink模型。
save_system (“laneAndVehicleDetection”);close_system (“laneAndVehicleDetection”);