主要内容

车道检测部署转移学习网络

这个例子显示了如何创建、编译和部署一个车道检测卷积神经网络(CNN)的FPGA,并使用MATLAB®来检索预测结果。

先决条件

  • Xilinx ZCU102 SoC开发工具包

  • 深度学习HDL工具箱™支持包Xilinx FPGA和S万博1manbetxoC

  • 深度学习工具箱™

  • 深度学习HDL工具箱™

加载Pretrained SeriesNetwork

加载pretrained lanenet网络。

snet = getLaneDetectionNetwork;

正常输入层

正常输入层通过修改它的类型。

inputlayer = imageInputLayer (snet.Layers (1) .InputSize,标准化=“没有”);snet = SeriesNetwork ([inputlayer; snet.Layers(2:结束)]);

视图层的网络使用深度网络设计师应用。

deepNetworkDesigner (snet)

FPGA板接口定义

定义目标FPGA编程接口使用dlhdl.Target对象。创建一个编程接口自定义名称为你的目标设备和一个以太网接口的目标设备连接到主机。

hTarget = dlhdl.Target (“Xilinx”,“界面”,“以太网”);

生成定制的比特流部署网络

车道检测网络由多个横跨海峡的归一化层。硬件上万博1manbetx支持这一层,使LRNBlockGeneration财产conv模块的FPGA比特流,您需要使用的推理。zcu102_single比特流没有该属性。一个新的比特流可以使用下面的代码生成。可以使用生成的比特流dlhdl。工作流对象推理。

当你创建一个dlhdl。ProcessorConfig对象引用比特流,确保比特流名称匹配的数据类型和FPGA板你的目标。在这个例子中,目标FPGA板Xilinx ZCU102 SoC董事会和日期类型是单身。更新处理器的配置LRNBlockGeneration属性启用并SegmentationBlockGeneration财产禁用。禁用SegmentationBlockGeneration属性确保深度学习IP适合FPGA和避免过度使用资源。如果针对Xilinx ZC706董事会,取代“zcu102_single”与“zc706_single在第一个命令。

hPC = dlhdl.ProcessorConfig (“比特流”,“zcu102_single”);setModuleProperty (hPC,“conv”,“LRNBlockGeneration”,“上”);setModuleProperty (hPC,“conv”,“SegmentationBlockGeneration”,“关闭”);

生成一个自定义使用的比特流dlhdl.buildProcessor函数。学习如何使用生成的位流文件,看看生成定制的比特流

dlhdl.buildProcessor (hPC)

如果针对Xilinx ZC706板,用“zc706_single”代替“zcu102_single”上面的第一个命令。

准备网络部署

通过创建一个网络准备部署dlhdl.Workflow对象。指定网络和比特流的名字。确保比特流名称匹配的数据类型和FPGA板你的目标。在这个例子中,目标FPGA板Xilinx®Zynq®UltraScale +™MPSoC ZCU102董事会和比特流使用单一数据类型。

hW = dlhdl.Workflow(网络= snet比特流=“dlprocessor.bit”目标= hTarget);

编制网络

运行编译的方法dlhdl.Workflow反对网络编译和生成指令,重量、部署和偏见。

dn =编译(hW);
_________________ offset_name offset_address allocated_space _______________________ * * *“InputDataOffset”“0 x00000000”“24.0 MB”“OutputResultOffset”“0 x01800000”“4.0 MB”“SystemBufferOffset”“0 x01c00000”“28.0 MB”“InstructionDataOffset”“0 x03800000”“4.0 MB”“ConvWeightDataOffset”“0 x03c00000”“16.0 MB”“FCWeightDataOffset”“0 x04c00000”“148.0 MB”“EndOffset”“0 x0e000000”“总:224.0 MB”

程序比特流到FPGA和下载网络权重

部署网络在Xilinx®Zynq®UltraScale + MPSoC ZCU102硬件,运行部署的方法dlhdl.Workflow对象。这种方法程序FPGA板使用编译方法和编程的输出文件,下载网络权重和偏见,显示进度信息,所花费的时间部署网络。

部署(hW)
# # # FPGA比特流编程已经跳过了相同的比特流已经加载目标FPGA。# # #装载重量FC的处理器。# # # 13%完成,当前时间是2020年6月28日12:36:09。# # # 25%完成,当前时间是2020年6月28日12:36:10。# # # 38%完成,当前时间是2020年6月28日12:36:11。# # # 50%完成,当前时间是2020年6月28日12:36:12。# # # 63%完成,当前时间是2020年6月28日12:36:13。# # # 75%完成,当前时间是2020年6月28日12:36:14。# # # 88%完成,当前时间是2020年6月28日12:36:14。# # # FC重量加载。 Current time is 28-Jun-2020 12:36:15

测试网络

运行demoOnVideohelper函数。这个函数加载视频的例子中,执行预测的方法dlhdl.Workflow对象,然后阴谋的结果。看到辅助函数

demoOnVideo (hW, 1);
# # #写完输入激活。# # #运行单个输入激活。深度学习处理器分析器性能结果LastLayerLatency(周期)LastLayerLatency总延迟(秒)FramesNum帧/ s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -网络24904175 0.11320 - 1 24904175 8.8 conv1 conv_module 8967009 0.04076 1396633 0.00635 623003年norm1 0.00283 pool1 0.01550 norm2 378531 0.00172 226855 0.00103 conv2 3410044 pool2 conv4 0.00518 233635 0.00106 conv3 1139419 0.00023 892918 0.00406 conv5 615897 0.00280 pool5 50189 fc_module fcLane1 0.07191 15937166 0.07244 fc6 15937166 117125 0.00053 fcLane2 782 0.00000 * DL处理器的时钟频率是:220 mhz

辅助函数

函数demoOnVideo (hW frameLimit)如果输入参数个数< 2 frameLimit = 1000000;结束writeToFile = false;videoFile =“caltech_cordova1.avi”;如果~ isfile (videoFile) url = append (“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/gpucoder/media/”,videoFile);websave (“caltech_cordova1.avi”url);结束党卫军= getLaneDetectionData ();传感器= caltechMonoCamera ();%初始化视频的读者和作家vR = VideoReader (videoFile);vPlayer = vision.DeployableVideoPlayer ();如果writeToFile[~、名称、ext] = fileparts (videoFile);outFileName =[名字“找到”ext);大众= VideoWriter (outFileName);大众。帧速率= vR.FrameRate;打开(大众);结束isOpen = true;frameCount = 0;frameCount < frameLimit & & isOpen & & hasFrame (vR) testImg = readFrame (vR);inputImg = imresize (testImg (227 227));%概要文件了输出= hW.predict (inputImg,“配置文件”,“上”);laneim = showNetworkOutputs (testImg、输出、ss.laneCoeffMeans、ss.laneCoeffsStds、传感器);步骤(vPlayer laneim);frameCount = frameCount + 1;如果writeToFile writeVideo(大众、laneim);结束isOpen = vPlayer.isOpen ();结束如果writeToFile关闭(大众);结束释放(vPlayer);删除(vR);结束函数laneim = showNetworkOutputs (img lanecoeffsNetworkOutput、laneCoeffMeans laneCoeffStds,传感器)%params = lanecoeffsNetworkOutput。* laneCoeffStds + laneCoeffMeans;isRightLaneFound = abs (params (6)) > 0.5;isLeftLaneFound = abs (params (3)) > 0.5;如果isRightLaneFound rtBoundary = parabolicLaneBoundary (params (4:6));其他的rtBoundary = parabolicLaneBoundary。空(1,0);结束如果isLeftLaneFound ltBoundary = parabolicLaneBoundary (params (1:3));其他的ltBoundary = parabolicLaneBoundary。空(1,0);结束laneboundaries = [ltBoundary, rtBoundary];vehicleXPoints = 3;laneim = insertLaneBoundary (vehicleXPoints laneboundaries编码器,传感器,“颜色”,“绿色”);结束

另请参阅

||||

相关的话题