主要内容

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

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

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

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

  • 在Simulink中对车辆检测应用进行建模。金宝app流量视频由经过训练的YOLO v2检测器进行处理。该网络检测视频中的车辆,并输出这些车辆的边界框坐标和置信度。

  • 为代码生成配置模型。

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

第三方的先决条件

验证GPU环境

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

envCfg = coder.gpuEnvConfig ('主持人');envCfg。DeepLibTarget =“cudnn”;envcfg.deepcodegen = 1;Envcf​​g.quiet = 1;Coder.CheckGPuInstall(Envcf​​g);

算法流程

示出了用于Simulink模型的算法工作流的框图。金宝app

预先训练车道和车辆检测网络

本示例使用trainedLaneNetYOLOV2RESNET50VEHICEEXAMPLE.包含预先训练的网络的mat文件。文件大小分别约为143MB和98MB。从MathWorks网站下载这些文件。

lanenetFile = matlab.internal.examples.download金宝appSupportFile ('gpucoder / cnn_models / lane_detection'“trainedLaneNet.mat”);vehiclenetFile = matlab.internal.examples.download金宝appSupportFile (“视觉/数据”'yolov2resnet50vehiceexample.mat');

下载测试流量视频

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

mediaFile = matlab.internal.examples.download金宝appSupportFile ('gpucoder / media'“caltech_washington1.avi”);

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

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

Open_System(“laneAndVehicleDetection”);

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

set_param(“laneAndVehicleDetection /车道检测”'networkfilepath'lanenetFile) set_param (“laneAndVehicleDetection /车辆检测器”“DetectorFilePath”vehiclenetFile) set_param (“laneAndVehicleDetection /交通视频”“inputFileName”mediaFile)

车道检测

预测块加载预训练的车道检测网络训练兰尼特.Mat.文件。该网络将图像作为输入,输出与自助车辆的左侧和右侧相对应的两个车道边界。每个车道边界由抛物线方程表示:

$ y = ax ^ 2 + bx +加元

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

类型lane_detection_coordinates
function [laneFound,ltPts,rtPts] = lane_detection_coordinates(laneNetOut) % Copyright 2020-2021 The MathWorks, Inc. persistent laneCoeffMeans;if isempty(laneCoeffMeans) laneCoeffMeans = [-0.0002,0.0002,1.4740,-0.0002,0.0045,-1.3787];结束持久laneCoeffStds;if is空(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;isLeftLaneFound = abs(params(3)) > 0.5;持久vehicleXPoints;if isempty(vehicleXPoints) vehicleXPoints = 3:30;ltPts = code .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的层组成。Simu金宝applink模型使用对象探测器从计算机视觉工具箱(TM)的块。该块占据图像作为输入,并输出边界框坐标以及图像中车辆的置信区。

交通视频中车辆包围盒和车道轨迹标注

LanevehicleannotationMATLAB函数块定义了一个函数lane_vehicle_annotation这将车辆边界框与置信度分数带注释。此外,如果laneFound是真的,然后存储在左边和右边的车道边界ltPtsrtPts在交通视频中有注释。

类型lane_vehicle_annotation
函数in = lane_vehicle_annotation(lanefound,ltpts,Rtpts,bboxes,sicrors,in)%copyright 2020-2021 mathworks,Inc。如果〜isempty(bboxes)In = InsertObjectAnnotation(in,'矩形',bboxes,sicrors);结束PTS =编码器.NULLCOPY(零(28,4,'单'));如果lanefound prevpt = [ltpts(1,1)ltpts(1,2)];对于k = 2:1:28 pts(k,1:4)= [preptpt ltpts(k,1)ltpts(k,2)];prevpt = [ltpts(k,1)ltpts(k,2)];结束in = instrshape(in,'行',pts,'linewidth',2);prevpt = [RTPTS(1,1)RTPTS(1,2)];对于k = 2:1:28 pts(k,1:4)= [prevpttttpts(k,1)rtpts(k,2)];prevpt = [RTPTS(k,1)RTPTS(k,2)];结束in = instrshape(in,'行',pts,'linewidth',2); In = insertMarker(In, ltPts); In = insertMarker(In, rtPts); end end

运行仿真

打开“配置参数”对话框。

仿真目标窗格中,选择GPU加速.在深度学习组,选择目标库为cuDNN

set_param (bdroot“GPUAcceleration”“上”);set_param (bdroot“SimDLTargetLibrary”“cudnn”);set_param (bdroot“DLTargetLibrary”“cudnn”);

为了验证车道和车辆检测算法,并显示Simulink模型中加载的交通视频的车道轨迹、车辆包围盒和分数,运行仿真。金宝app

set_param(“laneAndVehicleDetection”“SimulationMode”“正常”);SIM(“laneAndVehicleDetection”);

生成和构建Simulink模型金宝app

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

set_param (bdroot“TargetLang”“c++”);set_param (bdroot“GenerateGPUCode”'CUDA');

在子类别图书馆代码> GPU代码窗格,启用cuBLAScuSOLVERcuFFT

set_param (bdroot“GPUcuBLAS”“上”);set_param (bdroot“GPUcuSOLVER”“上”);set_param (bdroot'gpucufft'“上”);

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

status = evalc(“slbuild (laneAndVehicleDetection)”);

生成的CUDA代码

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

同样,该文件yolov2ResNet50VehicleExample0_laneAndVehicleDetection0.h包含c++类,表示预先训练的YOLO v2检测网络。

另请参阅

功能

相关话题