主要内容

生成视觉车辆检测器代码

这个例子展示了如何测试一个基于单目摄像头的车辆检测器,并从虚幻引擎驾驶模拟环境中预构建3D场景,为实时应用程序生成可部署的代码。

在这个例子中,你:

  • 设计了基于地面真实信息的单目摄像头车辆探测器的测试台架模型,验证了该探测器的功能。

  • 仿真了基于ACF和YOLOv2的车辆检测器的试验台模型,并比较了性能。

  • 为基于ACF的检测器生成c++代码,为基于YOLOv2的检测器生成CUDA代码,并通过仿真验证其功能等价性。

简介

车辆检测器是自动驾驶应用程序的基本感知组件。探测器分析使用单目相机传感器捕获的道路图像,并返回相机可见范围内不同车辆的位置信息。您可以使用MATLAB®或Simulink®设计和模拟车辆探测器算法,并使用已知的地面真相评估其准确性。您可以使用不同的探测器来检测车辆,包括vehicleDetectorACF而且vehicleDetectorYOLOv2.根据所选的检测器和目标平台,可以进行c++或CUDA代码生成,并将检测器集成到外部软件环境中,并部署到车辆上。执行Simulink模型的代码生成和验证确保了仿真和实时实现之间的功能等效。

这个例子展示了如何在虚幻引擎驾驶模拟环境中测试车辆检测器,并为实时实现生成可部署的代码。在这个例子中,你:

  1. 探索试验台模型-测试台架模型包含场景和环境、视觉车辆检测器和评估功能的指标。

  2. 用ACF和YOLOv2车辆探测器进行模拟—配置ACF和YOLOv2版本的车辆检测器,并使用指标评估性能。

  3. 生成ACF车辆检测器的c++代码—配置ACF车辆检测器,为CPU目标生成c++代码。

  4. 使用软件在循环中评估生成的代码的功能-通过软件在环(SIL)模拟验证实现。

  5. 为YOLOv2车辆检测器生成CUDA代码—配置YOLOv2车载探测器,为GPU目标生成CUDA代码。

您可以应用本例中使用的建模模式来测试您自己的车辆检测器组件。

该示例在使用Epic Games®的虚幻引擎的3D模拟环境中测试车辆检测器算法。虚幻引擎驱动模拟环境要求Windows®64位平台。

如果~ ispc错误([“3D模拟只支持微软”char (174),“窗口”char (174),“。”])结束

设置示例文件并打开项目。

目录(fullfile (matlabroot,“工具箱”“开车”“drivingdemos”));helperDrivingProjectSetup (“VisionVehicleDetector.zip”“workDir”pwd);

探索试验台模型

本例中的视觉车辆检测系统包括试验台和实现车辆检测算法的参考模型。

  • 试验台模型-试验台模型模拟和测试视觉车辆检测器算法在开环中的行为。

  • 参考模型——测试台架模型中的视觉车辆检测器块调用VisionVehicleDetector参考模型。参考模型实现了车辆检测算法,并生成ACF车辆检测器的c++代码和YOLOv2车辆检测器的CUDA代码。该参考模型可与高速公路车道跟随系统等闭环系统集成。

打开测试台架模型。

open_system (“VisionVehicleDetectorTestBench”);

打开此模型运行helperSLVisionVehicleDetectorSetup脚本,该脚本使用drivingScenario对象。它还配置车辆探测器参数,车辆模型参数,和Simulink总线信号所需的定义输入和输出VisionVehicleDetectorTestBench模型。试验台模型包含以下子系统:

  • 传感器和环境——子系统,指定用于仿真的场景、车辆和摄像机传感器,并计算地面真实车辆边界框。

  • 视觉车辆检测器——实现车辆检测算法的子系统。

  • 指标评估——使用包括真阳性、假阳性和假阴性的指标来评估车辆检测算法的子系统。

传感器和环境子系统配置路网,设置车辆位置,并合成相机传感器。

的仿真3D场景子系统类似高速公路车道跟踪的例子。此外,它还使用来自Scenario Reader的实际演员位置和来自Simulation 3D Camera Forward - Facing块的标记图像计算地面真实车辆边界框。打开传感器和环境子系统。

open_system (“视觉车辆探测器测试平台/传感器和环境”);

视觉车辆检测器是用来检测相机帧内车辆的参考模型。打开视觉车辆检测器参考模型。

open_system (“VisionVehicleDetector”);

视觉车辆检测器参考模型包含一个可变子系统。它包含三种车辆探测器变种。

  • ACF

  • YOLOv2模拟

  • YOLOv2代码生成

方法可以配置所需的变体helperSLVisionVehicleDetectorSetup脚本。默认的变体是ACF,可以配置为解释执行和代码生成。

这些变体都将摄像机传感器捕获的帧作为输入,并使用BusVision Simulink总线输出检测到的车辆。

度量评估子系统使用地面真相信息评估检测结果的准确性。打开Metrics Assessment子系统。

open_system (“VisionVehicleDetectorTestBench /指标评估”);

Metrics Assessment子系统计算检测的真阳性、假阴性和假阳性。

用ACF和YOLOv2车辆探测器进行模拟

在本节中,您将使用测试场景评估和比较ACF和YOLOv2车辆探测器的模拟结果。这个场景包含五个载体,包括自我载体。在这个测试场景中,一辆前车在自我车道上以恒定的速度14米/秒行驶,车头距为20米。另一辆目标车辆在相邻的右车道上以14米/秒的恒定速度行驶。另外两辆车在与自我车道相邻的左车道上反向行驶。

ACF模拟

配置视觉车辆检测器试验台模型以使用scenario_VVD_01_Curve_FiveVehicles场景和ACF车辆探测器变体。

helperSLVisionVehicleDetectorSetup (...“scenarioFcnName”“scenario_VVD_01_Curve_FiveVehicles”...“detectorVariantName”“ACF”);

模拟试验台模型。在运行仿真时,使用可视化窗口查看检测结果。

simoutACF = sim(“VisionVehicleDetectorTestBench”);

属性,还可以可视化地面真相车辆边界框EnableTruthDisplaymask参数。

通过将真阳性、假阳性和假阴性的值与地面真相中的车辆数量进行比较,可以对检测结果进行分析,验证算法的整体性能。

  • 车辆的数量(地面真相)是在任何给定的时刻,在相机传感器的范围内可用的车辆的数量。

  • 真正的阳性是算法能够正确检测到的车辆。

  • 假阴性是算法无法检测到的车辆。

  • 假阳性是算法在没有车辆的情况下检测到的车辆。

在模拟过程中,模型将这些值记录到simoutACF.logsout工作空间变量。你可以把这些值画出来simoutACF.logsout通过使用helperPlotDetectionMetrics函数。

hFigACFResults = helperPlotDetectionMetrics(“ACF”, simoutACF.logsout);

注意,真阳性和假阴性的总和总是等于车辆的地面真实数量。

用YOLOv2进行模拟

如果您拥有深度学习工具箱™许可证,则可以运行YOLOv2车辆检测器变体。

isDLTAvailable =许可证(“测试”“Neural_Network_Toolbox”);

配置视觉车辆检测器试验台模型以使用scenario_VVD_01_Curve_FiveVehicles场景和YOLOv2仿真车辆检测仪变型和仿真试验台模型。在本例中,关闭与GPU设备计算能力相关的警告。

警告(“关闭”“平行:gpu设备:DeviceDeprecated”);如果(isDLTAvailable) helperSLVisionVehicleDetectorSetup (...“scenarioFcnName”“scenario_VVD_01_Curve_FiveVehicles”...“detectorVariantName”“YOLOv2模拟”);simoutYOLOv2 = sim(“VisionVehicleDetectorTestBench”);hFigYOLOV2Results = helperPlotDetectionMetrics(“YOLOv2”, simoutYOLOv2.logsout);结束

结果表明,YOLOv2车辆检测器对车辆的检测具有较好的一致性。

关闭数字。

关闭(hFigACFResults);关闭(hFigYOLOV2Results);

您还可以通过绘制ACF和YOLOv2车辆探测器的召回率与精度的关系,以及每张图像的误报率与漏检率的关系,来比较它们的总体性能。你可以用helperPlotPrecisionAndMissrate函数。

如果(isDLTAvailable) detectionMetricsACF = helperComputePrecisionAndMissrate(simoutACF.logsout);detectionMetricsYOLOv2 = helperComputePrecisionAndMissrate(simoutYOLOv2.logsout);helperPlotPrecisionAndMissrate (detectionMetricsACF“ACF”detectionMetricsYOLOv2,“YOLOv2”);结束

该图表明,对于这个测试场景,YOLOv2的性能略优于ACF。

您还可以使用这个测试台架为ACF和YOLOv2车辆探测器生成代码。

ACF车辆检测器c++代码生成

您可以为ACF算法生成c++代码,应用公共优化,并生成一个报告,以便于研究生成的代码。配置测试台架模型以使用ACF变体。

helperSLVisionVehicleDetectorSetup (“detectorVariantName”“ACF”);

配置VisionVehicleDetector模型生成c++代码,实现算法的实时实现。设置模型参数以启用代码生成并显示配置值。

设置和查看模型参数以启用c++代码生成。

helperSetModelParametersForCodeGeneration (“VisionVehicleDetector”);save_system (“VisionVehicleDetector”);
模型配置参数:参数值描述  ___________________________________ _______________ ______________________________________________________________________________________________________________________ {' SystemTargetFile}{的ert。tlc的}{“代码生成>系统目标文件”}{‘TargetLang}{“c++”}{的代码生成语言>}{‘SolverType}{'固定'}{“解决者>类型”}{‘FixedStep}{‘汽车’}{的解算器>固定步大小(基本样本时间)}{‘EnableMultiTasking}{”“}{的解算器>对待每个离散率作为一个单独的任务”}{‘ProdLongLongMode}{”“}{硬件实现>支持很久的}{‘BlockReduction}{”“}{“模拟目标>块还原”}{‘MATLABDynamicMemAlloc}{”的}{'仿真目标>仿真目标> MATLAB函数中的动态内存分配'}{'OptimizeBlockIOStorage'}{' '上'}{'仿真目标>信号存储重用'}{'InlineInvariantSignals'}{' '上'}{'仿真目标>内联不变信号'}{'BuildConfiguration'}{'快速运行'}{'代码生成>构建配置'}{'RTWVerbose'}{'关闭'}{'代码生成>详细构建'}{'CombineSignalStateStructs'}{' '上'}{'代码生成>接口>组合信号/状态结构'}}{'SupportVariableSizeSignals'}{' '上'}{'代码生成>接口>支持变大小信号'}{' codeinterfacepacking'} {' c++类'}{'代码生成>接口>代码接口封装'}{'GenerateExternalIOAccessMethods'}{'方法'}{'代码生成>接口>数据成员可视性>外部I/O访问'}{'效率浮点float2intcast '}{' '上'}{' '代码生成>优化>从包装范围外值的浮点到整数转换中删除代码'}{‘ZeroExternalMemoryAtStartup}{‘off’}{“代码生成>优化I / O >删除根水平零初始化(逆逻辑)”}{‘CustomSymbolStrGlobalVar} {N M美元的}{“代码生成>符号>全局变量”}{‘CustomSymbolStrType} {' N M_T美元}{“代码生成符号> >全球类型”}{‘CustomSymbolStrField} {N M美元的}{“代码生成>符号>全球类型”字段名称}{‘CustomSymbolStrFcn} {APV_ $ N M美元$ F '}{“代码生成方法> >符号子系统”}{'CustomSymbolStrTmpVar'} {'$N$M'}{'代码生成>符号>本地临时变量'}{'CustomSymbolStrMacro'} {'$N$M'}{'代码生成>符号>常量宏'}

从参考模型生成代码并检查代码生成报告。

rtwbuild (“VisionVehicleDetector”);
成功完成的构建过程:VisionVehicleDetector构建摘要顶级模型目标已构建:模型动作重建原因====================================================================================================== VisionVehicleDetector代码生成和编译的代码生成信息文件不存在。构建1个模型(0个模型已经更新)构建持续时间:0h 1m 14.916s

使用代码生成报告来查看生成的代码。有关代码生成报告的更多信息,请参见用于代码生成的报告(嵌入式编码).使用代码生成报告中的代码接口报告链接来探索这些生成的方法:

  • 初始化-初始化时调用一次。

  • 一步—每一步定期调用,执行车辆检测算法。

  • 终止-终止时调用一次。

中声明了信号接口的其他get和set方法VisionVehicleDetector.h定义在VisionVehicleDetector.cpp

使用SIL评估功能

在为ACF视觉车辆检测器变体生成c++代码之后,您现在可以使用SIL模拟评估代码功能。它提供了对已部署应用程序行为的早期洞察。有关SIL模拟的更多信息,请参见SIL和PIL模拟(嵌入式编码)

SIL模拟使您能够验证在主机上编译生成的代码在功能上是否等同于正常模式。

配置算法和测试台架模型参数,以支持SIL仿真和日志执行分析信息。

helperSetModelParametersForSIL (“VisionVehicleDetector”);helperSetModelParametersForSIL (“VisionVehicleDetectorTestBench”);
VisionVehicleDetector配置参数:参数值描述  ________________________________ ____________________ ____________________________________________________________ {' SystemTargetFile}{的ert。tlc'}{'代码生成>系统目标文件'}{{'TargetLang'} {' c++ '}{'代码生成>语言'}{'CodeExecutionProfiling'} {'on'}{'代码生成>验证>测量任务执行时间'}{'CodeProfilingSaveOptions'} {'AllData'}{'代码生成>验证>保存选项'}{' codeexecutionprofilvariable '} {'executionProfile'}{'代码生成>验证>工作区变量'}VisionVehicleDetectorTestBench配置参数:参数值描述  ________________________________ ____________________ ____________________________________________________________ {' SystemTargetFile}{的ert。tlc'}{'代码生成>系统目标文件'}{'TargetLang'} {' c++ '}{'代码生成>语言'}{'CodeExecutionProfiling'} {'on'}{'代码生成>验证>测量任务执行时间'}{'CodeProfilingSaveOptions'} {'AllData'}{'代码生成>验证>保存选项'}{' codeexecutionprofilvariable '} {'executionProfile'}{'代码生成>验证>工作区变量'}

配置试验台模型,以模拟SIL模式下的视觉车辆检测器。

set_param ('VisionVehicleDetectorTestBench/Vision VehicleDetector '“SimulationMode”“Software-in-the-loop (SIL)”);save_system (“VisionVehicleDetector”);simoutACFSIL = sim(“VisionVehicleDetectorTestBench”);
成功完成:VisionVehicleDetector的构建过程构建摘要顶级模型目标已构建:模型动作重建原因===================================================================================== VisionVehicleDetector代码已生成和编译生成的代码已过时。构建1个模型(0个模型已经更新)构建持续时间:0h 0m 47.784 ###准备开始SIL模拟…使用“Microsoft Visual c++ 2019 (C)”构建。MEX成功完成。##停止组件的SIL模拟:VisionVehicleDetector ##应用程序已停止

可以比较普通模拟模式和SIL模拟模式的输出。您可以使用以下代码验证这些运行之间的差异是否在公差限制内。绘制正常模拟模式和SIL模拟模式之间的真阳性、假阳性和假阴性值的差异。

runIDs = Simulink.sdi.getAllRunIDs;normalSimRunID = runIDs(end - 2);SilSimRunID = runIDs(end);diffResult = Simulink.sdi.compareRuns(normalSimRunID, SilSimRunID);

绘制从正常模式和SIL模式计算的检测度量值之间的差异。

helperPlotDiffSignals (diffResult);

正常模拟模式与SIL模拟模式的检测度量值之间的差异为零。

评估执行时间

在SIL模拟期间,将宿主计算机上生成的代码的执行时间度量记录到变量executionProfile在MATLAB基础工作区中。这些时间可以作为生成代码性能的早期指示器。为了精确地测量执行时间,当生成的代码集成到外部环境中时,或者当您使用循环中处理器(PIL)模拟时,对其进行概要分析。要了解更多关于PIL分析的信息,请参考为生成的代码创建执行时间配置文件(嵌入式编码)

画出这段时间VisionVehicleDetector_step函数接受执行usinghelperPlotExecutionProfile函数。

helperPlotExecutionProfile (simoutACFSIL.executionProfile);

使用图,您可以推断视觉车辆检测器执行每一帧所需的平均时间。有关生成执行概要文件和在SIL模拟期间分析它们的更多信息,请参见SIL和PIL的执行时间分析(嵌入式编码)

为YOLOv2车辆检测器生成CUDA代码

如果您有GPU Coder™许可证,您可以配置模型为YOLOv2车辆检测器生成CUDA代码。配置测试台架模型以使用YOLOv2代码生成变体。

isGPCAvailable = license(“测试”“GPU_Coder”);如果(isGPCAvailable && isDLTAvailable)“detectorVariantName”“YOLOv2代码生成”);结束

验证GPU环境

要验证运行此部分所需的编译器和库是否已正确设置,请使用coder.checkGpuInstall函数。集DeepLibTarget要么“cudnn”“tensorrt”基于目标上相关库的可用性。

如果(isGPCAvailable && isDLTAvailable)为目标库cuDNN生成深度学习代码需要GPU Coder接口的深度学习库支持包。info = matlabshared. supportkkg . getinstalled;isDLGPUCodegenAvailable = 0;如果(~ isempty(信息))I = 1:length(info)如果(比较字符串(信息(我)。的名字,“用于深度学习库的GPU编码器接口”isDLGPUCodegenAvailable = 1;结束结束结束如果(isDLGPUCodegenAvailable) envCfg = code . gpuenvconfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);结束结束

打开配置参数对话框。在“代码生成”窗格中设置语言c++并使生成GPU代码

如果(isGPCAvailable && isDLTAvailable && isDLGPUCodegenAvailable)“VisionVehicleDetector”“TargetLang”“c++”);set_param (“VisionVehicleDetector”“GenerateGPUCode”CUDA的);set_param (“VisionVehicleDetector”“DLTargetLibrary”“cuDNN”);save_system (“VisionVehicleDetector”);结束

在主机图形处理器上生成和构建Simulink模型rtwbuild命令。代码生成器将文件放在构建文件夹中,该文件夹是一个名为VisionVehicleDetector_ert_rtw在您当前的工作文件夹下。

如果(isGPCAvailable && isDLTAvailable && isDLGPUCodegenAvailable) rtwbuild(“VisionVehicleDetector”);结束

使用代码生成报告来查看生成的代码。有关代码生成报告的更多信息,请参见用于代码生成的报告(嵌入式编码).使用代码生成报告中的代码接口报告链接来探索这些生成的方法:

  • 初始化-初始化时调用一次。

  • 一步—每一步定期调用,执行车辆检测算法。

  • 终止-终止时调用一次。

在为视觉车辆检测器生成CUDA代码之后,您现在可以使用类似于ACF车辆检测器变体的SIL模拟来评估代码功能。

关闭GPU设备计算能力相关的警告。

警告(“上”“平行:gpu设备:DeviceDeprecated”);

在本例中,您比较了ACF和YOLOv2车辆检测算法的性能,生成ACF检测器的c++代码,并使用SIL模拟评估功能,生成YOLOv2检测器的CUDA代码。

另请参阅

||||

相关的话题

Baidu
map