主要内容

车道检测

这个例子展示了如何实现fpga lane-marking检测算法。

车道检测是一个重要的加工阶段先进驾驶辅助系统(ADAS)。从视频自动检测车道边界计算硬件加速器fpga和gpu等挑战,因此往往需要实现实时性能。

在这个示例模型中,一个fpga巷人选发生器是加上一个基于软件的多项式拟合引擎,确定车道边界。

输入文件下载

下面的例子使用了visionhdl_caltech。avi文件作为输入。大约是19 MB的文件。从MathWorks网站和下载的文件解压下载的文件。

laneZipFile = matlab.internal.examples.download金宝appSupportFile (“visionhdl_hdlcoder”,“caltech_dataset.zip”);[outputFolder, ~, ~] = fileparts (laneZipFile);解压缩(laneZipFile outputFolder);caltechVideoFile = fullfile (outputFolder,“caltech_dataset”);目录(caltechVideoFile);

系统概述

LaneDetectionHDL.slx系统如下所示。HDLLaneDetector子系统代表了硬件加速设计的一部分,而SWLaneFitandOverlay子系统代表软件基于多项式拟合的引擎。前帧像素块,RGB输入转换为强度的颜色空间。

modelname =“LaneDetectionHDL”;open_system (modelname);set_param (modelname“SampleTimeColors”,“上”);set_param (modelname“SimulationCommand”,“更新”);set_param (modelname“开放”,“上”);集(allchild (0)“可见”,“关闭”);

高密度脂蛋白巷探测器

高密度脂蛋白巷探测器代表了硬件加速设计的一部分。这个子系统接收前置摄像头的输入像素流源,转换视图获取鸟瞰,定位车道标记候选人从转换后的视图,然后缓冲他们分成一个向量发送到软件方面对曲线拟合和覆盖。

set_param (modelname“SampleTimeColors”,“关闭”);open_system ([modelname' / HDLLaneDetector '),“力”);

鸟瞰

鸟瞰块将前置摄像头转换一个角度。处理的图片在这个视图中简化了下游车道检测算法的处理需求。前置的观点透视畸变,导致车道收敛消失点。透视畸变纠正运用是一个逆透视变换。

逆透视映射(IPM)是由以下表达式:

$ $(\帽子{x}, {y} \帽子)=圆\离开(\压裂{h_ {11} x + h_ {12} y + h_ {13}} {h_ {31} x + h_ {32} y + h_{33}}, \压裂{h_ {21} x + h_ {22} y + h_ {23}} {h_ {31} x + h_ {32} y + h_{33}} \右)$ $

单应性矩阵,h,来自四个内在物理相机参数设置,即焦距,音高,高度,和原则(从针孔相机模型)。有关更多细节,请参考计算机视觉工具箱™文档。

你可以使用计算机视觉估计的单应性矩阵的工具箱™estgeotform2d函数或图像处理工具箱™fitgeotform2d函数创建一个projtform2d对象。这些功能需要一组源帧之间的匹配点和鸟瞰框架。源帧点作为顶点梯形区域的兴趣,并能延长过去源帧捕获一个更大的地区的限制。所示的梯形的点映射:

$ $ sourcePoints = [c_ {x}, c_ {y}; \ d_ {x}, d_ {y}; \现代{x},现代{y}; \ b_ {x}, b_ {y}] $ $

$ $ birdsEyePoints = [1,1; \ bAPPL 1; 1 \ bAVL; \ bAPPL bAVL] $ $

在哪里bAPPLbAVL是鸟瞰活跃每行像素分别和活跃的视频线。

源(前置)目标的直接评价(一)实时映射在FPGA和ASIC的硬件是具有挑战性的。要求部门以及潜在的不连续的内存访问从一个帧缓冲意味着这部分设计的计算需求巨大。因此而不是直接评估IPM实时计算,离线分析的输入输出映射已经完成和用于pre-compute映射方案。这是可能的单应性矩阵是固定的工厂校准/安装摄像头后,由于相机的位置、高度和间距是固定的。

在这个特殊的例子中,一个输出图像的帧[700 x640]维度,而前置输入图像的[480 x640]维度。没有足够的可用消隐为了输出完整的一帧之前下一个前置摄像头输入流。因此鸟瞰块将不接受任何新的帧数据,直到它完成处理当前的一个框架。

open_system ([modelname' / HDLLaneDetector '),“力”);

行缓冲和地址计算

一个全尺寸的射影变换从输入到输出会导致900 x640输出图像。这需要完整的[480 x640]输入图像存储在内存中,而源像素位置使用源位置和计算单应性矩阵。理想的片上存储器应该用于这个目的,消除了片外帧缓冲要求。

您可以确定的行数,通过执行逆映射使用行缓冲芯片上的单应性矩阵。下面的脚本计算单应性矩阵的映射,使用它来反变换将源行帧映射到鸟瞰行。

% &一个帧参数来源% AVL:活跃的视频线,达成:主动每行像素sAVL = 480;sAPPL = 640;%一个框架bAVL = 700;bAPPL = 640;
%确定单应性矩阵%点映射[西北;东北;西南;SE)sourcePoints = [218196;421196;-629405;1276年,405年);birdsEyePoints = [001001;640001;001900;640900);%估计变换tf = estgeotform2d (sourcePoints birdsEyePoints,“射影”);%单应性矩阵h = tf.T;
%来源框架上想象一个ROIvidObj = VideoReader (“visionhdl_caltech.avi”);vidFrame = readFrame (vidObj);vidFrameAnnotated = insertShape (vidFrame,“多边形”[sourcePoints (:):sourcePoints (2) sourcePoints (4:) sourcePoints (3:)),“线宽”5,“颜色”,“红色”);vidFrameAnnotated = insertShape (vidFrameAnnotated,“FilledPolygon”,[sourcePoints (1:) sourcePoints (2:) sourcePoints (4:):sourcePoints (3)),“线宽”5,“颜色”,“红色”,“不透明度”,0.2);图(1);次要情节(2,1,1);imshow (vidFrameAnnotated)标题(源视频帧的);
%确定需要一个缓冲线深度%逆行映射框架中心x =圆(sourcePoints (2,1) - ((sourcePoints (2, 1) -sourcePoints (1,1)) / 2));bAVL Y = 0(1日);2 = 1:1:bAVL [~ Y (ii)] = transformPointsInverse (tf, x,二世);结束numRequiredRows =装天花板(Y (0.98 * bAVL) - Y (1));
%可视化逆行映射次要情节(2,1,2);情节(Y,“HandleVisibility”,“关闭”);%逆行映射参照线(0.98 * bAVL,“r”,“98%”,“LabelHorizontalAlignment”,“左”,“HandleVisibility”,“关闭”);%线缓冲区深度yline (Y (1),“r——”,“HandleVisibility”,“关闭”)yline (Y (0.98 * bAVL),“r”)标题(“鸟瞰逆行映射”);包含(“输出行”);ylabel (“输入行”);传奇([“深度缓冲行:”num2str (numRequiredRows),“行”),“位置”,“西北”);轴平等的;网格;

图显示了映射的输入输出线透露,为了生成的第一个700行自顶向下鸟瞰输出图像,输入图像的大约50行是必需的。这是一个可接受的存储使用片上内存的行数。

车道检测

鸟瞰获得的图像,可以执行实际的车道检测。有许多种技术可以考虑这一目的。实现健壮的一个实现,适用于流媒体图像数据,可以在FPGA硬件/ ASIC实现合理的资源成本,这个示例使用描述的方法[1]。该算法执行一个完整的形象与面向垂直的一阶高斯导数卷积过滤器内核,其次是次区域处理。

open_system ([modelname“/ HDLLaneDetector / LaneDetection”),“力”);

垂直定向滤波器卷积

紧跟在一个映射的输入图像,输出是卷积过滤器设计定位的高强度像素在一个黑暗的背景。内核是8像素的宽度,这与线条的宽度,出现在一个图像。的高度设置为16的大小与虚线车道标记出现在图像。作为一个图像是身体高度相关,沥青等的相机,车道的宽度出现在这幅图像本质上是相关的物理测量在路上。内核的宽度和高度时可能需要更新操作车道检测系统在不同的国家。

滤波器的输出内核如下所示,使用飞机colormap突出强度的差异。因为过滤器的内核是一个将军,垂直面向高斯导数,有一些响应来自许多不同的地区。然而,对于车道标记的位置存在,有一种强烈的积极回应位于一个强烈的负面反应,这是一致的在列。这种特性的滤波器输出用于下一阶段的检测算法来定位有效车道的候选人。

莱恩候选人一代

与高斯导数卷积后的内核,次区域处理执行的输出是为了找到坐标,车道标志。每个地区由18行,乒乓球记忆计划以保证数据可以通过子系统不断地流。

%看到一样open_system ([modelname' / HDLLaneDetector / LaneDetection / LaneCandidateGeneration '),“力”);

柱状图列数

首先,HistogramColumnCount计数阈值的数量在每一列像素18行区域。高列计数表明巷很可能出现在该地区。执行这个计数为积极的和消极的阈值图像。积极的直方图计算偏移量占内核宽度。巷候选人发生的积极的计数和消极的计数都高。这种利用卷积的前所述属性输出,积极跟踪旁边出现消极的踪迹。

在内部,列计算直方图生成控制信号,选择一个18线区域,计算列直方图,并输出结果,当准备好了。一个乒乓缓冲方案,允许一个直方图阅读虽然接下来的写作。

重叠和繁殖

如上所述,当车道出现在一个图像,卷积的结果将产生的高强度正位于一条输出高强度负输出。积极的和消极的列统计直方图定位等地区。为了放大这些位置,积极计数输出是推迟了8个时钟周期(一个内在参数相关的内核宽度),和积极的和消极的数相乘。这列放大正面和负面的数量一致,并减少地区之间存在分歧的积极和消极的方面。设计管线式为了确保高通量操作。

零交叉过滤器

在重叠和繁殖的输出子系统,峰值出现在车道标记礼物。峰值检测算法确定车道标记存在的列。因为信噪比相对较高的数据,这个示例使用一个简单的冷杉过滤操作零交叉检测紧随其后。零交叉过滤器是使用离散滤波器实现块从DSP系统工具箱™。管线式高通量操作。

商店主要航线

零交叉过滤器输出然后传递到存储主要车道子系统。这个子系统的最大内存7项,并重置每次新一批的18行。因此,对于每一个次区域7巷候选人生成潜力。在这个子系统,零交叉过滤输出流,并为潜在的零交叉检查。如果出现零交叉,然后立即地址的区别之前零交叉和零交叉后的地址是为了得到峰值的大小的测量。子系统存储零交叉位置最高的大小。

open_system ([modelname' / HDLLaneDetector / LaneDetection LaneCandidateGeneration / StoreDominantLanes '),“力”);

计算自我道

车道检测子系统输出7最可行的车道标志。在许多应用程序中,我们最感兴趣的车道标记包含车道的车辆驾驶。通过计算所谓的“Ego-Lanes”硬件方面的设计,我们可以减少硬件和软件之间的内存带宽,通过发送2车道,而不是7处理器。Ego-Lane计算分为两个子系统。FirstPassEgoLane子系统假设图像的中心列对应的中间车道,当车辆车道边界内正确操作。莱恩候选人最接近中心因此被认为是自我车道。离群值删除子系统保持距离的平均宽度车道标记中心协调。车道标记当前宽度的公差内不被拒绝。执行早期拒绝车道标记提供了更好的结果在执行曲线拟合后的设计。

open_system ([modelname“/ HDLLaneDetector / ComputeEgoLanes”),“力”);

控制接口

最后,自我车道被送到CtrlInterface MATLAB函数计算子系统。这个状态机使用的四个控制信号输入,使hwStart, hwDone, swStart决定何时开始缓冲,接受新巷协调到40 x1缓冲区,最后指出软件所有40一直缓冲,所以巷巷坐标拟合可以执行和叠加。dataReady信号确保软件不会尝试巷40坐标拟合,直到所有缓冲,而swStart信号确保当前的40集坐标将巷配件完成之前举行。

软件巷适合和覆盖

然后发现ego-lanes被传递到西南巷,覆盖子系统,健壮的曲线拟合和执行覆盖的地方。回想一下,产生一个输出每两帧而不是每连续帧。因此曲线拟合和叠加放置在一个子系统启用,仅当启用新的自我车道。

open_system ([modelname' / SWLaneFitandOverlay '),“力”);

司机

司机MATLAB函数控制子系统硬件和软件之间的同步。最初它是在一个轮询状态,定期样品dataReady输入每帧来确定当硬件缓冲巷的完整(40 x1)向量坐标。一旦发生这种情况,它转换到软件处理状态swStart和过程输出。司机仍然在软件处理状态直到swDone输入高。看到随着过程的输出循环回到swDone输入率之间的过渡块,实际上有一个恒定的时间预算为FitLanesandOverlay指定子系统执行配件和叠加。swDone很高时,司机将转换成同步状态,swStart举行低表明硬件处理完成。之间的同步软件和硬件,硬件将持有巷(40 x1)向量的坐标,直到swStart信号转换回低。当这种情况发生时,dataReady输出的硬件将过渡回到低。

适合车道和覆盖

适合车道和覆盖子系统启用的司机。它执行所需的必要的算法以适应一个多项式在车道坐标数据输入,然后将安装巷巷坐标在一个图像。

合适的航线

配合车道子系统运行一个基于RANSAC拟合程序生成的巷的候选人。RANSAC是一种迭代算法,建立表之间的内围层基于距离测量提出了曲线,和输入数据。在这个子系统的输出,有一个[3 x1)向量指定了多项式系数发现RANSAC例程。

覆盖车道标记

覆盖车道标记子系统执行图像可视化操作。它覆盖自我车道和曲线发现lane-fitting例程。

open_system ([modelname“/ SWLaneFitandOverlay / FitLanesAndOverlay”),“力”);

仿真的结果

模型包括两个视频显示器显示仿真结果的输出。的伯兹显示器显示输出后的扭曲视角巷候选人已经覆盖,多项式拟合已经执行,由此产生的多项式叠加到图像上。的OriginalOverlay显示了伯兹输出扭曲回原来的角度。

由于大型帧大小使用在这个模型中,模拟需要相对较长的时间来完成。如果你有一个高密度脂蛋白校验™许可证,您可以直接加快仿真速度运行HDL巷探测器在使用FPGA硬件子系统循环。

HDL代码生成

检查并生成HDL代码中引用这个例子中,您必须有一个高密度脂蛋白编码器™许可证。

生成HDL代码,使用下面的命令。

makehdl (“LaneDetectionHDL / HDLLaneDetector”)

生成测试台上,使用下面的命令。注意,试验台一代需要很长时间由于大数据的大小。你可能想要减少仿真时间生成试验台。

makehdltb (“LaneDetectionHDL / HDLLaneDetector”)

对于快试验台模拟,可以生成一个SystemVerilog DPIC试验台使用以下命令。

makehdltb (“LaneDetectionHDL / HDLLaneDetector”,“GenerateSVDPITestBench”,“ModelSim”)

结论

这个示例提供了洞察设计ADAS系统的挑战,特别强调的加速度在硬件设计的关键部分。

引用

[1]r·k·Satzoda和Mohan m . Trivedi“基于愿景巷分析:探索问题和方法为嵌入式实现”,2013年IEEE计算机视觉与模式识别会议。

[2]视频从加州理工学院车道数据集-默罕默德·阿里,“实时检测车道标记在城市街道”,2008年IEEE智能车辆研讨会——使用许可。

相关的话题