这个例子展示了如何从Simulink®模型开发CUDA®应用程序,使用卷积神经网络(CNN)执行车道和车辆检测。万博1manbetx本例以交通视频的帧作为输入,输出两个车道边界,分别对应自我车辆的左右车道,并检测帧内的车辆。本例使用预先训练的车道检测网络基于GPU编码器的车道检测优化GPU编码器工具箱™的示例。有关更多信息,请参见基于GPU编码器的车道检测优化.本例还使用了预先训练的车辆检测网络使用YOLO v2进行对象检测计算机视觉工具箱的示例™。有关更多信息,请参见使用YOLO v2进行对象检测(计算机视觉工具箱).
这个例子演示了以下概念:
在Simulink中对车道检测应用进行建模。万博1manbetx首先对交通视频进行预处理,调整大小为227x227x3,并乘以常数因子255。然后,由加载的预先训练的网络对其进行处理预测
区块从深度学习工具箱™。最后,如果检测到左右车道边界,则得到抛物线系数来模拟车道边界的轨迹。
在Simulink中对车辆检测应用进行建模。万博1manbetx流量视频由经过训练的YOLO v2检测器进行处理。该网络检测视频中的车辆,并输出这些车辆的边界框坐标和置信度。
为代码生成配置模型。
为Simulink模型生成一个CUDA可执行文件。万博1manbetx
CUDA支持NVIDIA GPU。
NVIDIA CUDA工具包和驱动程序。
英伟达cuDNN图书馆。
编译器和库的环境变量。有关更多信息,请参见第三方硬件和设置前提产品s manbetx 845.
要验证运行此示例所需的编译器和库是否正确设置,请使用coder.checkGpuInstall
函数。
envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);
给出了Simulink模型的算法流程框图。万博1manbetx
如果~ (”。/ caltech_washington1.avi ',“文件”) url =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/gpucoder/media/caltech_washington1.avi”;websave (“caltech_washington1.avi”url);结束
给出了对万博1manbetx交通视频进行车道和车辆检测的Simulink模型。当模型运行时,视频查看器
Block显示带有车道和车辆标注的交通视频。
open_system (“laneAndVehicleDetection”);
的预测
块加载预训练的车道检测网络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) % Copyright 2020 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的层组成。的VehicleDetectionYOLOv2
MATLAB函数块定义了一个函数vehicle_detection_yolo_v2
加载预训练的YOLO v2对象检测器。该网络以图像为输入,输出边界框坐标和图像中车辆的置信度得分,用于后续标注。
类型vehicle_detection_yolo_v2
function [bboxes,scores] = vehicle_detection_yolo_v2(In) % Copyright 2020 The MathWorks, Inc. persistent yolodetector;if isempty(yolodetector) yolodetector = code . loaddeeplearningnetwork ('yolov2ResNet50VehicleExample.mat');end [bboxes,scores,~] = yolodetector.detect(In, 'threshold', .2);结束
的LaneVehicleAnnotation
MATLAB函数块定义了一个函数lane_vehicle_annotation
它标注了车辆的边界框和置信度得分。同样,如果laneFound
是真的吗,那么左右车道的边界存储在哪里呢ltPts
和rtPts
在交通视频中有注释。
类型lane_vehicle_annotation
if ~isempty(bboxes) In = insertObjectAnnotation(In, 'rectangle', bboxes, scores);End PTS =编码器。nullcopy(0(28 4 '单'));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
函数下载trainedLaneNet.mat
和yolov2ResNet50VehicleExample.mat
文件,如果它们不存在。
getVehicleDetectionAndLaneDetectionNetworks ()
下载预训练车道侦测网络(143mb)…下载预先训练的车辆侦测网络(98mb)…
打开“配置参数”对话框。
在模拟目标窗格中,选择GPU加速.在深度学习组,选择目标库为cuDNN.
set_param (bdroot“GPUAcceleration”,“上”);set_param (bdroot“SimDLTargetLibrary”,“cudnn”);set_param (bdroot“DLTargetLibrary”,“cudnn”);
为了验证车道和车辆检测算法,并显示Simulink模型中加载的交通视频的车道轨迹、车辆包围盒和分数,运行仿真。万博1manbetx
set_param (“laneAndVehicleDetection”,“SimulationMode”,“正常”);sim卡(“laneAndVehicleDetection”);
在代码生成窗格中,选择语言作为c++并使生成GPU的代码.
set_param (bdroot“TargetLang”,“c++”);set_param (bdroot“GenerateGPUCode”,CUDA的);
在子类别库的代码生成> GPU代码窗格中,使cuBLAS,cuSOLVER和cuFFT.
set_param (bdroot“GPUcuBLAS”,“上”);set_param (bdroot“GPUcuSOLVER”,“上”);set_param (bdroot“GPUcuFFT”,“上”);
在主机GPU上生成并构建Simulink模型万博1manbetxslbuild
命令。代码生成器将文件放在建立文件夹,子文件夹名为laneAndVehicleDetection_ert_rtw
在当前工作文件夹下。
状态= evalc (“slbuild (laneAndVehicleDetection)”);
子文件夹命名laneAndVehicleDetection_ert_rtw
包含生成的与Simulink模型中的不同块对应的c++代码,以及在这些块中执行的特定操作。万博1manbetx例如,文件trainedLaneNet0_laneAndVehicleDetection0.h
包含c++类,该类包含表示预先训练的车道检测网络的属性和成员函数。
同样,该文件yolov2ResNet50VehicleExample0_laneAndVehicleDetection0.h
包含c++类,表示预先训练的YOLO v2检测网络。
关闭Simulink万博1manbetx模型。
close_system (“车道和车辆检测/车道和车辆检测输出”);close_system (“laneAndVehicleDetection”);
bdclose
(万博1manbetx模型)|close_system
(万博1manbetx模型)|get_param
(万博1manbetx模型)|load_system
(万博1manbetx模型)|open_system
(万博1manbetx模型)|save_system
(万博1manbetx模型)|set_param
(万博1manbetx模型)|sim卡
(万博1manbetx模型)|slbuild
(万博1manbetx模型)