这个例子展示了如何从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
启用NVIDIA GPU。
nvidia cuda工具包和司机。
nvidia cudnn图书馆。
编译器和库的环境变量。有关更多信息,请参见第三方硬件和设置先决条件产品下载188bet金宝搏。
要验证运行此示例所需的编译器和库是否正确设置,请使用Coder.CheckGPuInstall.
函数。
envcfg = coder.gpuenvconfig('主持人');envCfg。DeepLibTarget ='cudnn';envcfg.deepcodegen = 1;Envcfg.quiet = 1;Coder.CheckGpuInstall(Envcfg);
示出了用于Simulink模型的算法工作流的框图。金宝app
如果~ ('./caltech_washington1.avi',“文件”)URL =.'//www.tatmou.com/金宝appsupportfiles/gpucoder/media/caltech_washington1.avi';websave (“caltech_washington1.avi”,URL);结束
示出了用金宝app于在业务视频上执行车道和车辆检测的Simulink模型。当模型运行时,视频查看器
块显示与车道和车辆注释的交通视频。
Open_System(“laneAndVehicleDetection”);
的预测
块加载预先训练好的车道检测网络训练兰尼特.mat
文件。该网络将图像作为输入,输出与自助车辆的左侧和右侧相对应的车道边界。每个车道边界由抛物线方程表示:
y是横向偏移量,x是与车辆的纵向距离。网络输出三个参数a, b和c每个通道。网络架构类似AlexNet
除了最后几个层被一个更小的完全连接层和回归输出层取代之外。的LaneDetectionCoordinates
MATLAB功能块定义函数lane_detection_coordinates
这从预测块中获取输出并输出三个参数即,即laneFound
,ltPts
和RTPTS.
。阈值化用于确定是否找到左和右车道边界。如果两个都被发现,laneFound
设置为真,边界的轨迹被计算并存储在ltPts
和RTPTS.
分别。
类型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的卷积层和层组成。的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 = coder.loadDeepLearningNetwork('yolov2ResNet50VehicleExample.mat');end [bboxes,scores,~] = yolodetect .detect(In, 'threshold', .2);结束
的Lanevehicleannotation
MATLAB功能块定义函数Lane_vehicle_Annotation.
这将车辆边界框与置信度分数一起注释。此外,如果laneFound
是真的,那么左边和右车道边界存储在ltPts
和RTPTS.
在交通视频中注释。
类型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
函数下载训练兰尼特.mat
和YOLOV2RESNET50VEHICEEXAMPLE.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”);
在代码生成窗格中,选择语言作为c++和启用生成GPU代码。
set_param(bdroot,“TargetLang”,“c++”);set_param(bdroot,'世代Pucode','CUDA');
在子类别图书馆的代码> GPU代码窗格,启用cuBLAS,cuSOLVER和cuFFT。
set_param(bdroot,'gpucublas',“上”);set_param(bdroot,“GPUcuSOLVER”,“上”);set_param(bdroot,'gpucufft',“上”);
在主机图形处理器上生成并建立仿真模型金宝apprtwbuild
命令。代码生成器将文件放在一个中构建文件夹,一个名为的子文件夹laneandvehicledetection_ert_rtw
在当前的工作文件夹下。
status = evalc(“RTWBUILD('LANEANDVEHICLECTECTECTIONS')”);
子文件夹命名laneandvehicledetection_ert_rtw
包含与Simulink模型中的不同块对应的生成的C ++代码以及在这些块中执行的特定操作。金宝app例如,文件训练兰尼特0_laneandvehicledetection0.h.
包含了一个c++类,该类包含了表示预先训练好的车道检测网络的属性和成员函数。
同样,该文件yolov2ResNet50VehicleExample0_laneAndVehicleDetection0.h
包含表示预先训练的YOLO v2检测网络的c++类。
关闭Simulink金宝app模型。
close_system(车道和车辆检测/车道和车辆检测输出);close_system(“laneAndVehicleDetection”);