主要内容

执行车道和车辆检测的深度学习Simulink模型的代码生成金宝app

这个例子展示了如何从Simulink®模型开发CUDA®应用程序,使用卷积神经网络(CNN)执行车道和车辆检测。金宝app本例以交通视频的帧作为输入,输出两个车道边界,分别对应自我车辆的左右车道,并检测帧内的车辆。本例使用预先训练的车道检测网络基于GPU编码器的车道检测优化GPU编码器工具箱示例™. 有关详细信息,请参阅基于GPU编码器的车道检测优化。此示例还使用来自的预训练车辆检测网络基于YOLO v2深度学习的目标检测计算机视觉工具箱示例™. 有关详细信息,请参阅基于YOLO v2深度学习的目标检测(计算机视觉工具箱)

这个例子演示了以下概念:

  • 在Simulink中对车道检测应用进行建模。金宝app首先对交通视频进行预处理,调整大小为227x227x3,并乘以常数因子255。然后,由加载的预先训练的网络对其进行处理预测深度学习工具箱中的块™. 最后,如果检测到左侧和右侧车道边界,则可获得用于模拟车道边界轨迹的抛物线系数。

  • 在Simulink中模拟车辆检测应用程序。交通视频由预训练的YOLO v2检测器处理。金宝app该网络检测视频中的车辆,并输出这些车辆的边界框坐标及其置信度分数。

  • 为代码生成配置模型。

  • 为Simulink模型生成CUDA可执行文件。金宝app

第三方的先决条件

验证GPU环境

要验证运行此示例所需的编译器和库是否正确设置,请使用coder.checkGpuInstall函数。

envCfg = coder.gpuEnvConfig (“主持人”);envCfg。DeepLibTarget =“cudnn”;envCfg.DeepCodegen=1;envCfg.Quiet=1;coder.checkGpuInstall(envCfg);

算法流程

Simulink模型的算法工作流程框图如图所示。金宝app

获得预训练车道和车辆检测网络

此示例使用trainedLaneNetYolov2Resnet50车辆示例包含预训练网络的MAT文件。文件大小分别约为143MB和98MB。请从MathWorks网站下载这些文件。

lanenetFile=matlab.internal.examples.downloadSu金宝apppportFile(“gpucoder/cnn\u模型/车道检测”,“trainedLaneNet.mat”); vehiclenetFile=matlab.internal.examples.downloadSu金宝apppportFile(“愿景/数据”,“Yolov2Resnet50车辆示例垫”);

下载测试流量视频

为了测试模型,该示例使用了Caltech车道数据集。文件大小约为16mb。从MathWorks网站下载这些文件。

mediaFile=matlab.internal.examples.downloadSu金宝apppportFile(“gpucoder/media”,“加州理工大学华盛顿分校1.avi”);

车道与车辆检测Simulink模型金宝app

给出了对金宝app交通视频进行车道和车辆检测的Simulink模型。当模型运行时,视频查看器Block显示带有车道和车辆标注的交通视频。

开放式系统(“laneAndVehicleDetection”);

在Simulink模型的预测块和检测器块中设置下载网络模型的文件路径。金宝app设置Simulink模型加载的测试视频的位置。金宝app

设置参数(“laneAndVehicleDetection /车道检测”,“网络文件路径”,lanenetFile)设置参数(“laneAndVehicleDetection /车辆检测器”,“DetectorFilePath”,vehiclenetFile)设置参数(“LaneAndvehicle检测/交通视频”,“inputFileName”,mediaFile)

车道检测

这个预测块加载预训练的车道检测网络训练有素该网络将图像作为输入,并输出两个车道边界,分别对应于ego车辆的左车道和右车道。每个车道边界由抛物线方程表示:

$y=ax^2+bx+c$

这里y是横向偏移量,x是与车辆的纵向距离。网络输出每个车道的三个参数a、b和c。网络结构类似于AlexNet除了最后几层被一个较小的完全连接层和回归输出层所取代平面检测坐标MATLAB函数块定义了一个函数lane_detection_coordinates它从预测块中获取输出并输出三个参数,即。兰福,ltPtsrtPts.阈值用于确定是否同时找到左车道和右车道边界。如果两者都找到了,兰福是否设置为真,边界的轨迹被计算并存储在其中ltPtsrtPts分别地

类型lane_detection_coordinates
函数[laneFound,ltPts,rtPts]=lane_检测坐标(laneNetOut)%2020-2021版权所有MathWorks,Inc.持久laneCoeffMeans;如果isempty(laneCoeffMeans)laneCoeffMeans=[-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];end params=laneNetOut.*laneCoeffStds+lanecoeffsmeans;%%c'应该大于0.5才能成为右车道isRightLaneFound=abs(params(6))>0.5;isLeftLaneFound=abs(params(3))>0.5;永久性车辆点;如果isempty(车辆点)车辆点=3:30;%米,在传感器端之前ltPts=coder.nullcopy(零(28,2,'single');rtPts=coder.nullcopy(零(28,2,'single');如果isRightLaneFound和isLeftLaneFound找到rtBoundary=params(4:6);rt_y=computeBoundaryModel(rtBoundary,vehicleXPoints);ltBoundary=params(1:3);lt_y=computeBoundaryModel(ltBoundary,vehicleXPoints);%可视化ego车辆的车道边界tform=get_tformToImage;%将车辆映射到图像坐标ltPts=tform.transformPointsInverse([vehicleXPoints',lt_y']);rtPts=tform.transformPointsInverse([vehicleXPoints',rt_y']);laneFound=true;else laneFound=false;end end end

车辆检测

YOLO v2目标检测网络由两个子网络组成:特征提取网络和检测网络ResNet-50特征提取。与特征提取网络相比,检测子网络是一个较小的CNN,由几个卷积层和针对YOLO v2的层组成。Simu金宝applink模型使用目标探测器计算机视觉工具箱(TM)中的块。该块将图像作为输入,并输出边界框坐标以及图像中车辆的置信度分数。

交通视频中车辆边界框和车道轨迹的标注

这个拉尼维希克林符号MATLAB函数块定义了一个函数lane_vehicle_annotation注释车辆边界框以及置信度得分。如果兰福如果为true,则左车道和右车道边界存储在ltPtsrtPts在交通视频中有注释。

类型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”,“模拟模式”,“正常”);sim卡(“laneAndVehicleDetection”);

生成和构建Simulink模型金宝app

代码生成窗格中,选择语言c++并使生成GPU代码

set_param (bdroot“塔吉特朗”,“C++”);set_param (bdroot“GenerateGPUCode”,“库达”);

在子类别图书馆代码生成>GPU代码窗格,启用库布拉斯,库索尔弗卡夫特

set_param (bdroot“GPUcuBLAS”,“上”);set_param (bdroot“GPUcuSOLVER”,“上”);set_param (bdroot“GPUcuFFT”,“上”);

在主机GPU上生成并构建Simulink模型金宝appslbuild命令。代码生成器将文件放在建立文件夹,一个名为laneAndVehicleDetection_ert_rtw在当前工作文件夹下。

状态=评估(“slbuild (laneAndVehicleDetection)”);

生成的CUDA代码

名为的子文件夹laneAndVehicleDetection_ert_rtw包含生成的与Simulink模型中的不同块对应的c++代码,以及在这些块中执行的特定操作。金宝app例如,文件trainedLaneNet0_laneAndVehicleDetection0.h包含C++类,其中包含表示预先训练的车道检测网络的属性和成员函数。

类似地,文件Yolov2Resnet50车辆示例0\u Lane和车辆检测0.h包含表示预先训练的YOLO V2检测网络的C++类。

另见

功能

相关话题