用于执行车道和车辆检测的深度学习Simulink模型的代码生成金宝app
本示例展示了如何从Simulink®模型开发CUDA®应用程序,该应用程序使用卷积神经网络(CNN)执行车道和车辆检测。金宝app本例以一段交通视频的帧作为输入,输出对应于自我车辆左右车道的两个车道边界,并检测帧内的车辆。本例使用预训练的车道检测网络车道检测与GPU编码器优化GPU编码器工具箱™的例子。有关更多信息,请参见车道检测与GPU编码器优化.本例还使用了预训练的车辆检测网络使用YOLO v2深度学习的目标检测计算机视觉工具箱™的例子。有关更多信息,请参见使用YOLO v2深度学习的目标检测(计算机视觉工具箱).
本例说明了以下概念:
在Simulink中建模车道检测应用。金宝app首先对交通视频进行预处理,将其大小调整为227x227x3,并乘以255的常数因子。然后,由加载在中预训练的网络进行处理
预测
块从深度学习工具箱™。最后,在检测到左右车道边界的情况下,得到用于模拟车道边界轨迹的抛物线系数。在Simulink中建模车辆检测应用。金宝app交通视频由预先训练的YOLO v2检测器处理。该网络检测视频中的车辆,并输出这些车辆的边界框坐标及其置信度分数。
为代码生成配置模型。
为Simulink模型生成一个CUDA可执行文件。金宝app
第三方的先决条件
CUDA启用NVIDIA GPU。
NVIDIA CUDA工具包和驱动程序。
NVIDIA cuDNN库。
编译器和库的环境变量。有关更多信息,请参见第三方硬件而且设置必备产品下载188bet金宝搏.
检查GPU环境
要验证运行此示例所需的编译器和库是否已正确设置,请使用coder.checkGpuInstall
函数。
envCfg = code . gpuenvconfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);
算法流程
给出了Simulink模型的算法工作流框图。金宝app
预先训练车道和车辆检测网络
本例使用trainedLaneNet
而且yolov2ResNet50VehicleExample
mat -包含预训练网络的文件。文件大小分别为143MB和98MB。从MathWorks网站下载这些文件。
lanenetFile = matlab.internal.examples.download金宝appSupportFile(“gpucoder / cnn_models / lane_detection”,“trainedLaneNet.mat”);vehiclenetFile = matlab.internal.examples.download金宝appSupportFile(“视觉/数据”,“yolov2ResNet50VehicleExample.mat”);
下载测试交通视频
为了测试该模型,示例使用了Caltech lanes数据集。该文件大小约为16mb。从MathWorks网站下载这些文件。
mediaFile = matlab.internal.examples.download金宝appSupportFile(“gpucoder /媒体”,“caltech_washington1.avi”);
车道和车辆检测仿真模型金宝app
展示了在金宝app交通视频上执行车道和车辆检测的Simulink模型。当模型运行时,视频查看器
块显示带有车道和车辆注释的交通视频。
open_system (“laneAndVehicleDetection”);
在Simulink模型的预测块和检测块中设置下载的网络模型的文件路径。金宝app设置要由Simulink模型加载的测试视频的位置。金宝app
set_param (“laneAndVehicleDetection /车道检测”,“NetworkFilePath”lanenetFile) set_param (“laneAndVehicleDetection /车辆检测器”,“DetectorFilePath”vehiclenetFile) set_param (“laneAndVehicleDetection /交通视频”,“inputFileName”mediaFile)
车道检测
的预测
块加载预训练的车道检测网络从trainedLaneNet.mat
文件。该网络将图像作为输入,并输出两个车道边界,分别对应于自我车辆的左右车道。每个车道边界由抛物方程表示:
这里y是横向偏移,x是与车辆的纵向距离。网络在每个车道上输出三个参数a、b和c。网络架构类似于AlexNet
除了最后几层被一个较小的全连接层和回归输出层所取代。的LaneDetectionCoordinates
MATLAB函数块定义了一个函数lane_detection_coordinates
它从预测块中获取输出,并输出三个参数,即。laneFound
,ltPts
而且rtPts
.阈值用于确定是否同时找到了左右车道边界。如果两者都找到了,laneFound
设为真,边界的轨迹被计算并存储ltPts
而且rtPts
分别。
类型lane_detection_coordinates
function [laneFound,ltPts,rtPts] = lane_detection_coordinates(laneNetOut) %版权所有if 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;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的层组成。Simu金宝applink模型使用对象探测器
块从计算机视觉工具箱(TM)。该块以图像作为输入,并输出边界框坐标以及图像中车辆的置信度分数。
交通视频中车辆边界框与车道轨迹标注
的LaneVehicleAnnotation
MATLAB函数块定义了一个函数lane_vehicle_annotation
它随置信度分数注释车辆边界框。同样,如果laneFound
是真的,那么左右车道的界限存储在哪里呢ltPts
而且rtPts
都在交通视频中标注了。
类型lane_vehicle_annotation
function In = lane_vehicle_annotation(laneFound,ltPts,rtPts,bboxes,scores,In) % Copyright 2020-2021 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
运行模拟
打开配置参数对话框。
在模拟目标窗格中,选择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的);set_param (bdroot“GenCodeOnly”,“上”);如果ispc set_param (bdroot“ProdHWDeviceType”,“英特尔- > x86 - 64 (Windows64) ');其他的set_param (bdroot“ProdHWDeviceType”,Intel->x86-64 (Linux 64));结束set_param (bdroot“ProdLongLongMode”,“上”);
在子类别中库的代码生成> GPU代码窗格中,使cuBLAS,cuSOLVER而且cuFFT.
set_param (bdroot“GPUcuBLAS”,“上”);set_param (bdroot“GPUcuSOLVER”,“上”);set_param (bdroot“GPUcuFFT”,“上”);
在主机图形处理器上生成和构建Simulink模金宝app型slbuild
命令。代码生成器将文件放在建立文件夹的子文件夹laneAndVehicleDetection_ert_rtw
在当前工作文件夹下。
状态= evalc(“slbuild (laneAndVehicleDetection)”);
生成的CUDA代码
子文件夹名为laneAndVehicleDetection_ert_rtw
包含生成的c++代码,对应于Simulink模型中的不同块,以及在这些块中执行的特定操作。金宝app例如,文件trainedLaneNet0_laneAndVehicleDetection0.h
包含c++类,其中包含表示预训练车道检测网络的属性和成员函数。
类似地,文件yolov2ResNet50VehicleExample0_laneAndVehicleDetection0.h
包含c++类,表示预训练的YOLO v2检测网络。
另请参阅
功能
open_system
(金宝app模型)|load_system
(金宝app模型)|save_system
(金宝app模型)|close_system
(金宝app模型)|bdclose
(金宝app模型)|get_param
(金宝app模型)|set_param
(金宝app模型)|sim卡
(金宝app模型)|slbuild
(金宝app模型)