这个例子展示了如何从Simulink®模型开发CUDA®应用程序,使用卷积神经网络(CNN)执行车道和车辆检测。金宝app本例以交通视频的帧作为输入,输出两个车道边界,分别对应自我车辆的左右车道,并检测帧内的车辆。本例使用预先训练的车道检测网络基于GPU编码器的车道检测优化GPU编码器工具箱示例™. 有关详细信息,请参阅基于GPU编码器的车道检测优化.此示例还使用预磨料的车辆检测网络对象检测使用YOLO V2深度学习计算机Vision Toolbox™的示例。有关更多信息,请参阅对象检测使用YOLO V2深度学习(电脑视觉工具箱).
这个例子演示了以下概念:
在Simulink中对车道检测应用进行建模。金宝app首先对交通视频进行预处理,调整大小为227x227x3,并乘以常数因子255。然后,由加载的预先训练的网络对其进行处理预测
深度学习工具箱中的块™. 最后,如果检测到左侧和右侧车道边界,则可获得用于模拟车道边界轨迹的抛物线系数。
模拟Simulink中的车辆检测应用。金宝app流量视频由普拉的YOLO V2检测器处理。该网络检测视频中的车辆,并输出这些车辆的边界盒的坐标及其置信度。
配置代码生成模型。
为Simulink模型生成可执行的CUDA。金宝app
CUDA支持NVIDIA GPU。
NVIDIA CUDA工具包和驱动程序。
NVIDIA cuDNN图书馆。
编译器和库的环境变量。有关更多信息,请参阅第三方硬件和设置前提产品下载188bet金宝搏.
要验证运行此示例所需的编译器和库是否正确设置,请使用coder.checkGpuInstall
函数。
envCfg = coder.gpuEnvConfig (“主持人”);envCfg。DeepLibTarget =“cudnn”;envCfg.DeepCodegen=1;envCfg.Quiet=1;coder.checkGpuInstall(envCfg);
Simulink模型的算法工作流程框图如图所示。金宝app
此示例使用trainedLaneNet
和Yolov2Resnet50车辆示例
包含备用网络的MAT文件。这些文件分别为约143MB和98MB。从Mathworks网站下载文件。
lanenetfile = matlab.internal.examples.Download金宝appSupportFile(“gpucoder / cnn_models / lane_detection”那'trowlanenet.mat');veviclenetfile = matlab.internal.examples.download金宝appsupportfile('愿景/数据'那“Yolov2Resnet50车辆示例垫”);
为了测试模型,该示例使用了Caltech车道数据集。文件大小约为16mb。从Mathworks网站下载文件。
Mediafile = matlab.internal.examples.DownLoad金宝appSupportFile(“gpucoder/media”那'caltech_washington1.avi');
给出了对金宝app交通视频进行车道和车辆检测的Simulink模型。当模型运行时,视频查看器
Block显示带有车道和车辆标注的交通视频。
开放式系统(“laneAndVehicleDetection”);
在Simulink模型的预测块和检测器块中设置下载网络模型的文件路径。金宝app设置Simulink模型加载的测试视频的位置。金宝app
设置参数(“laneAndVehicleDetection /车道检测”那“网络文件路径”,lanenetfile)set_param(“laneAndVehicleDetection /车辆检测器”那“DetectorFilePath”,veviclenetfile)set_param('laneandvehicledetection /交通视频'那'InputFileName',Mediafile)
这预测
块加载预训练的车道检测网络trainedLaneNet.mat
该网络将图像作为输入,并输出两个车道边界,分别对应于ego车辆的左车道和右车道。每个车道边界由抛物线方程表示:
这里Y是横向偏移,x是距车辆的纵向距离。网络输出每通道的三个参数A,B和C.网络架构类似于AlexNet
除了最后几层由较小的完全连接的层和回归输出层替换。这LanedetectionChoordate
MATLAB函数块定义了一个函数lane_detection_coordinates
它从预测块中获取输出并输出三个参数,即。lanefound.
那LTPT.
和rtPts
.阈值用于确定是否同时找到左车道和右车道边界。如果两者都找到了,lanefound.
被设置为真实,并计算边界的轨迹并存储在LTPT.
和rtPts
分别。
类型lane_detection_coordinates
函数[lanefound,ltpts,rtpts] = lane_detection_coordinates(lanenetout)%copyright 2020-2021 Mathworks,Inc。持久Lanecoeffmeans;如果是isempty(lanecoeffmeans)lanecoeffmeans = [-0.0002,0.0002,1.4740,-0.0002,0.0045,-1.3787];结束持久Lanecoeffstds;如果是isempty(lanecoeffstds)lanecoeffstds = [0.0030,0.0766,0.6313,0.0026,0.0736,0.9846];结束Params = Lanenetout。* Lanecoeffstds + Lanecoeffmeans;%'C'应该超过0.5,因为它是右车道IsrightLaneFound = ABS(参数(6))> 0.5;isleftlanefound = abs(Params(3))> 0.5;持久的车辆xpoints;如果是isempty(vishxpoints)的车辆xpintss = 3:30;%仪表,在传感器端LTPTS =编码器.NULLCOPY(零(28,2,'单')); 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的层组成。Simu金宝applink模型使用对象探测器
计算机视觉工具箱(TM)中的块。该块将图像作为输入,并输出边界框坐标以及图像中车辆的置信度分数。
这拉尼维希克林符号
MATLAB函数块定义了一个函数lane_vehicle_annotation
注释车辆边界框以及置信度得分。如果lanefound.
如果为true,则左车道和右车道边界存储在LTPT.
和rtPts
在交通视频中有注释。
类型lane_vehicle_annotation
函数In=lane_vehicle_annotation(laneFound,ltPts,rtPts,bboxes,scores,In)%MathWorks,Inc.版权所有2020-2021如果~isempty(bboxes)In=InsertObject annotation(In,'rectangle',bboxes,scores);end pts=coder.nullcopy(零(零(28,4,'single');如果laneFound prevpt=[ltPts(1,1)ltPts(1,2)];对于k=2:1:28 pts(k,1:4)=[prevpt-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)];对于k=2:1:28 pts(k,1:4)=[prevt-rtPts(k,1)rtPts(k,2)];prevpt=[rtPts(k,pts,1)rtPts(k,2)];end-In=insertShape(In,“Line”,pts,'LineWidth',2);In=insertMarker(In,ltPts),end
打开“配置参数”对话框。
在模拟目标窗格,选择GPU加速.在里面深度学习组,选择目标库为cuDNN.
set_param (bdroot“GPUAcceleration”那'在');set_param (bdroot“SimDLTargetLibrary”那“cudnn”);set_param (bdroot'dltargetlibrary'那“cudnn”);
为了验证车道和车辆检测算法,并显示Simulink模型中加载的交通视频的车道轨迹、车辆包围盒和分数,运行仿真。金宝app
设置参数(“laneAndVehicleDetection”那'simulationmode'那'普通的');sim卡(“laneAndVehicleDetection”);
在代码生成窗格,选择语言作为c++并使生成GPU的代码.
set_param (bdroot'targetlang'那'c ++');set_param (bdroot“GenerateGPUCode”那“库达”);
在子类别图书馆的代码生成>GPU代码窗格,启用Cublas.那Cusolver.和袖口.
set_param (bdroot“GPUcuBLAS”那'在');set_param (bdroot'gpucusolver'那'在');set_param (bdroot“GPUcuFFT”那'在');
在主机GPU上生成并构建Simulink模型金宝appslbuild
命令。代码生成器将文件放在建立文件夹,子文件夹名为laneAndVehicleDetection_ert_rtw
在当前工作文件夹下。
状态=评估(“slbuild (laneAndVehicleDetection)”);
子文件夹命名laneAndVehicleDetection_ert_rtw
包含生成的与Simulink模型中的不同块对应的c++代码,以及在这些块中执行的特定操作。金宝app例如,文件trainedLaneNet0_laneAndVehicleDetection0.h
包含包含代表预制车道检测网络的属性和成员函数的C ++类。
同样,文件YOLOV2RESNET50VEHICEEXAMPLE0_LANEANDVEHICLETECTIONTE0.H.
包含代表普雷雷达yolo v2检测网络的C ++类。
Open_System.
(金宝app模型)|load_system
(金宝app模型)|save_system
(金宝app模型)|close_system
(金宝app模型)|bdclose.
(金宝app模型)|get_param.
(金宝app模型)|set_param
(金宝app模型)|sim卡
(金宝app模型)|slbuild
(金宝app模型)