主要内容

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

这个例子展示了如何从Simulink®模型开发一个CUDA®应用程序,使用卷积神经网络(CNN)进行车道和车辆检测。金宝app本例以交通视频的帧作为输入,输出与ego车辆左车道和右车道对应的两条车道边界,并检测帧中的车辆。这个例子使用了从Lane检测用GPU编码器进行了优化GPU编码器工具箱™示例。有关更多信息,请参见Lane检测用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

下载示例视频

如果~ ('./caltech_washington1.avi',“文件”)URL =.'//www.tatmou.com/金宝appsupportfiles/gpucoder/media/caltech_washington1.avi';websave (“caltech_washington1.avi”,URL);结束

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

示出了用金宝app于在业务视频上执行车道和车辆检测的Simulink模型。当模型运行时,视频查看器块显示与车道和车辆注释的交通视频。

Open_System(“laneAndVehicleDetection”);

车道检测

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

$ y = ax ^ 2 + bx +加元

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

类型lane_detection_coordinates
函数[lanefound,ltpts,Rtpts] = lane_detection_coordinates(lanenetout)%copyright 2020 the mathworks,Inc。持久Lanecoeffmeans;如果是isempty(lanecoeffmeans)lanecoeffmeans = [-0.0002 0.0002 1.4740 -0.0002 0.0045 -1.3787];结束持久Lanecoeffstds;如果是伊斯克(Lanecoeffstds)Lanecoeffstds = [0.0030 0.0766 0.6313 0.0026 0.0736 0.9846];结束Params = Lanenetout。* Lanecoeffstds + Lanecoeffmeans;IsrightLanefound = ABS(参数(6))> 0.5;%C应该大于0.5,因为它是右侧车道isleftlanefound = abs(Params(3))> 0.5;持久的车辆xpoints;如果是isempty(舰载点)的漏斗= 3:30;%仪表,在传感器端LTPTS之前,= Coder.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的卷积层和层组成。的VehicleDetectionYOLOv2MATLAB功能块定义函数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 = coder.loadDeepLearningNetwork('yolov2ResNet50VehicleExample.mat');end [bboxes,scores,~] = yolodetect .detect(In, 'threshold', .2);结束

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

LanevehicleannotationMATLAB功能块定义函数Lane_vehicle_Annotation.这将车辆边界框与置信度分数一起注释。此外,如果laneFound是真的,那么左边和右车道边界存储在ltPtsRTPTS.在交通视频中注释。

类型Lane_vehicle_Annotation.
函数in = lane_vehicle_annotation(lanefound,ltpts,rtpts,bboxes,sicrors,in)%2020 the mathworks,Inc。如果〜insempty(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)= [Prept LTPTS(K,1)LTPTS(K,2)];prevpt = [ltpts(k,1)ltpts(k,2)];结束= 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 = [[,1)Rtpts(k,2)];结束= instrshape(in,'行',pts,'linewidth',2); In = insertMarker(In, ltPts); In = insertMarker(In, rtPts); end end

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

函数下载训练兰尼特.matYOLOV2RESNET50VEHICEEXAMPLE.MAT.文件,如果它们不存在的话。

getVehicleDetectionAndLaneDetectionNetworks ()

运行仿真

打开配置参数对话框。

仿真目标窗格中,选择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,'世代Pucode','CUDA');

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

set_param(bdroot,'gpucublas',“上”);set_param(bdroot,“GPUcuSOLVER”,“上”);set_param(bdroot,'gpucufft',“上”);

在主机图形处理器上生成并建立仿真模型金宝apprtwbuild命令。代码生成器将文件放在一个中构建文件夹,一个名为的子文件夹laneandvehicledetection_ert_rtw在当前的工作文件夹下。

status = evalc(“RTWBUILD('LANEANDVEHICLECTECTECTIONS')”);

生成的CUDA代码

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

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

清理

关闭Simulink金宝app模型。

close_system(车道和车辆检测/车道和车辆检测输出);close_system(“laneAndVehicleDetection”);