这个例子展示了如何实现一种fpga的车道标记检测算法。
车道检测是高级驾驶辅助系统(ADA)的关键处理阶段。自动检测来自视频流的车道边界是计算的具有挑战性,因此通常需要硬件加速器,例如FPGA和GPU来实现实时性能。
在这个例子模型中,一个基于fpga的车道候选生成器与一个基于软件的多项式拟合引擎相结合,来确定车道边界。
这LaneDetectionHDL.slx系统如下所示。HDLLaneDetector子系统代表了硬件加速部分的设计,而SWLaneFitandOverlay子系统代表了基于软件的多项式拟合引擎。在帧到像素块之前,RGB输入被转换为强度颜色空间。
HDL通道检测器代表了硬件加速部分的设计。该子系统接收来自前置摄像头源的输入像素流,将视图转换为鸟瞰图,从转换后的视图中定位候选车道标记,然后将它们缓冲为一个矢量发送到软件侧进行曲线拟合和叠加。
鸟瞰视图块将前置摄像头视图转换为鸟瞰视角。使用该视图中的图像简化了下游车道检测算法的处理要求。正面视图遭受透视失真,导致车道在消失点处收敛。通过应用反透视变换来校正透视失真。
逆透视映射(IPM)由以下表达式给出:
单应性矩阵,h,是由物理相机设置的四个内在参数,即焦距、俯仰、高度和原理点(来自针孔相机模型)推导出来的。有关更多细节,请参阅计算机视觉工具箱™文档。
您可以使用计算机视觉工具箱™估计单应矩阵estimateGeometricTransform2D
函数或图像处理工具箱™fitgeotrans
函数创建projective2d
对象。这些函数需要源帧和鸟瞰图帧之间的一组匹配点。源框架点作为感兴趣的梯形区域的顶点,可以扩展到超过源框架限制的区域来捕获更大的区域。对于所示的梯形,点映射为:
在哪里Bappl.和bAVL分别为每行鸟瞰活动像素和活动视频线。
在FPGA / ASIC硬件上实时地直接评估目的地(鸟瞰)映射的目的地(鸟瞰)是具有挑战性的。对于来自帧缓冲区的非顺序内存访问的可能性以及来自帧缓冲区的潜力的要求意味着该设计的本部分的计算要求是大幅的。因此,已经实时直接评估了IPM计算,已经执行了对输出映射的输入的离线分析,并用于预计映射方案。由于相机位置,高度和俯仰,因此可以在备用校准/安装时固定时,这是可能的。
在这个特定的示例中,鸟瞰输出图像是[700x640]尺寸的一帧,而正面输入图像是[480x640]尺寸。在下一个前置摄像头输入流进之前,没有足够的消隐以输出完整的鸟瞰图。因此,bird -eye视图块在处理完当前的bird -eye帧之前不会接受任何新的帧数据。
从输入到输出的全尺寸投影变换将产生[900x640]的输出图像。这就要求将完整的[480x640]输入图像存储在内存中,同时使用源位置和单应矩阵计算源像素位置。理想情况下,片内存储器应该用于此目的,而不需要片外帧缓冲区。
您可以通过使用相同矩阵执行逆行映射来确定芯片上的行数。以下脚本从点映射计算同位矩阵,使用它到逆变换以将源帧行映射到鸟瞰视图行。
%来源和鸟眼框架参数AVL:活动视频线,APPL:活动像素每线sAVL = 480;sAPPL = 640;%一个框架bAVL = 700;bAPPL = 640;
%确定同住矩阵%点映射[nw;ne;SW;SE]sourcePoints = [218196;421196;-629405;1276年,405年);birdsEyePoints = [001001;640001;001900;640900);%估计变换tf = estimateGeometricTransform2D (sourcePoints birdsEyePoints,“射影”);%同住矩阵h = tf.T;
%可视化源框架上的鸟眼投资回报率vidObj = 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日);为ii = 1:1:bAVL [~,Y(ii)] = transformPointsInverse(tf,x,ii);结束numrequiredrows = ceil(y(0.98 * bavl) - y(1));
%可视化逆行映射次要情节(2,1,2);情节(Y,“HandleVisibility”那“关闭”);%逆行映射参照线(0.98 * bAVL,“r”那“98%”那'labehorizontalalignment'那“左”那...“HandleVisibility”那“关闭”);%行缓冲深度yline (Y (1),“r——”那“HandleVisibility”那“关闭”) yline (Y (0.98 * bAVL),“r”)标题(“鸟瞰视图逆行映射”);Xlabel('输出行');ylabel(“输入行”);传奇([“行缓冲器深度:”num2str (numRequiredRows),“行”],...“位置”那“西北”);轴平等的;网格在;
该图显示了输入行到输出行的映射,表明为了生成从上到下的鸟眼输出图像的前700行,大约需要50行输入图像。这是使用片内存储器存储的可接受的行数。
通过获取鸟瞰图,可以进行实际的车道检测。有许多技术可以考虑到这一目的。为了实现一个健壮的、在流图像数据上工作得很好并且可以在FPGA/ASIC硬件上以合理的资源成本实现的实现,本示例使用[1]中描述的方法。该算法使用一个垂直方向的一阶高斯导数滤波核进行全图像卷积,然后进行子区域处理。
在输入图像的鸟瞰映射之后,输出通过旨在定位在深色背景上的高强度像素的条带的过滤器卷积。内核的宽度是8像素,这与鸟瞰图像中出现的线的宽度有关。高度设置为16,其涉及出现在图像中的虚线通道标记的尺寸。由于鸟瞰图像与相机的高度,俯仰等物理相关,因此在该图像中出现的泳道的宽度与道路上的物理测量有关。在不同国家的车道检测系统操作时可能需要更新内核的宽度和高度。
过滤器内核的输出如下所示,使用喷射器颜色映射来突出强度上的差异。因为滤波器核是一个一般的、垂直方向的高斯导数,所以会有来自许多不同区域的响应。然而,对于存在车道标记的位置,在强烈的负响应旁边有一个强烈的正响应,这是跨列一致的。下一阶段的检测算法将使用滤波器输出的这一特性来定位有效的通道候选。
与高斯导数核卷积后,对输出进行子区域处理,求出有车道标记的坐标。每个区域由18行组成,有一个乒乓存储器方案,以确保数据可以连续地流过子系统。
首先,HistogramColumnCount统计18行区域内每列中阈值像素的数量。高列计数表明该区域可能存在一条车道。这个计数对正阈值和负阈值图像都执行。正直方图计数被偏移以解释核的宽度。Lane候选人出现在正数和负数都很高的地方。这利用了前面提到的卷积输出的性质,即正迹出现在负迹的旁边。
在内部,列计数直方图生成选择18行区域的控制信号,计算列直方图,并在准备就绪时输出结果。一个乒乓缓冲方案是适当的,它允许一个直方图正在读取,而下一个直方图正在写入。
如上所述,当鸟瞰图像中出现一条车道时,卷积结果将产生高强度正输出的条带,紧邻高强度负输出的条带。正列计数直方图和负列计数直方图定位这些区域。为了放大这些位置,正计数输出被延迟8个时钟周期(与核宽相关的内在参数),并且正计数和负计数相乘。这将放大阳性和阴性计数一致的列,并将阳性和阴性计数不一致的区域最小化。该设计是流水线,以确保高吞吐量操作。
在重叠和倍增子系统的输出中,有车道标记的地方会出现峰值。峰值检测算法确定车道标记存在的列。由于数据的信噪比比较高,本例使用了简单的FIR滤波操作,然后进行过零检测。零穿越滤波器是使用DSP System Toolbox™中的离散FIR滤波器块实现的。它是流水线为高吞吐量的操作。
然后将过零滤波器输出传递到存储主通道子系统。这个子系统的最大内存为7个条目,每次达到18行新批时都会重置。因此,每个子区域生成7个潜在的车道候选。在这个子系统中,过零滤波器输出流通过,并检查潜在的过零。如果确实发生了零交叉,那么在零交叉之前的地址和零交叉之后的地址之间的差值就被取下来,以获得对峰值大小的测量。子系统存储具有最高震级的过零位置。
车道检测子系统输出7个最可行的车道标记。在许多应用中,我们最感兴趣的是包含车辆行驶的车道的车道标记。通过在设计的硬件方面计算所谓的“Ego-Lanes”,我们可以通过向处理器发送2个而不是7个lanes,减少硬件和软件之间的内存带宽。Ego-Lane计算被分成两个子系统。FirstPassEgoLane子系统假设当车辆在车道边界内正确运行时,图像的中心列对应于车道的中间。因此,最接近中心的候选车道被认为是自我车道。离群点移除子系统保持从车道标记到中心坐标的距离的平均宽度。不符合当前宽度公差的车道标记将被拒绝。在设计后期进行曲线拟合时,尽早拒绝车道标志会得到更好的结果。
最后,计算的EGO通道被发送到Ctrlinterface MATLAB函数子系统。该状态机使用四个控制信号输入 - 启用,HWSTART,HWDONE和SWSTART来确定何时开始缓冲,接受新的车道坐标进入40x1缓冲区,最后向软件指示所有40车道坐标已被缓冲且所以可以执行车道配件和覆盖物。DataReady信号可确保软件不会尝试车道拟合,直到所有40个坐标都被缓冲,而SWSTART信号确保将保持电流40个坐标,直到Lane拟合完成。
然后将检测到的自车道传递给SW Lane Fit和Overlay子系统,在该子系统中执行鲁棒曲线拟合和覆盖。回想一下,鸟眼输出是每两帧左右产生一次,而不是每连续一帧。因此,曲线拟合和叠加被放置在一个启用的子系统中,只有在产生新的自我通道时才启用。
驱动程序MATLAB函数子系统控制硬件和软件之间的同步。最初,它处于投票状态,其中每帧以规则的间隔对数据进行采样,以确定硬件是否已经缓冲了一个完整的[40x1]矢量车道坐标。一旦发生这种情况,它将转换为SWSTART和过程输出高的软件处理状态。驾驶员仍然在软件处理状态,直到SWDONE输入高。随着过程输出循环回到SWDONE输入的速率转换块之间,有效地为FitlanEnAndoverlay子系统指定了恒定的时间预算,以执行拟合和覆盖。当SWDONE很高时,驱动程序将转换为同步状态,其中SWSTART保持较低,以指示处理完成的硬件。软件和硬件之间的同步使得硬件将保持[40x1]矢量车道坐标向量,直到SWStart信号过渡到低电平。发生这种情况时,硬件的DataReady输出将转换为低电平。
Fit Lanes和Overlay子系统由驱动程序启用。它执行必要的算法,将多项式拟合到输入处接收到的车道坐标数据上,然后将拟合的车道和车道坐标绘制到bird - eye图像上。
Fit Lanes子系统在生成的候选车道上运行基于RANSAC的直线拟合程序。RANSAC是一种迭代算法,它基于所提出的曲线与输入数据之间的距离度量建立嵌线表。在这个子系统的输出中,有一个[3x1]向量,它指定RANSAC例程找到的多项式系数。
覆盖车道标记子系统执行图像可视化操作。它覆盖了通过车道拟合程序找到的自我车道和曲线。
该模型包括两个视频显示器,显示在仿真结果的输出。这伯兹显示屏显示了在车道候选被覆盖后的扭曲透视的输出,多项式拟合已经被执行,结果多项式被覆盖到图像上。这OriginalOverlay显示了伯兹输出又回到了原来的角度。
由于在该模型中使用的帧尺寸较大,仿真可能需要较长的时间才能完成。如果您有HDL验证器™许可证,您可以通过使用FPGA in the Loop (TM)在硬件中直接运行HDL Lane Detector子系统来加速模拟速度。
要检查和生成本例中引用的HDL代码,您必须具有HDL Coder™许可证。
要生成HDL代码,请使用以下命令。
makehdl(“LaneDetectionHDL / HDLLaneDetector”的)
要生成测试工作台,请使用以下命令。注意,由于数据量大,测试台生成需要很长时间。您可能希望在生成测试台之前减少模拟时间。
makehdltb (“LaneDetectionHDL / HDLLaneDetector”的)
对于更快的测试台仿真,您可以使用以下命令生成SystemVerilog DPIC测试台。
makehdltb (“LaneDetectionHDL / HDLLaneDetector”那“GenerateSVDPITestBench”那“ModelSim”的)
这个例子提供了设计ADAS系统的一般挑战的见解,特别强调硬件设计的关键部分的加速。
[1] . R. K. Satzoda和Mohan M. Trivedi,“基于视觉的Lane分析:嵌入式实现的问题和方法的探索”,2013 IEEE计算机视觉与模式识别会议。
[2] Video来自Caltech Lanes DataSet - Mohamed Aly,“城市街道的车道标记实时检测”,2008年IEEE智能车辆研讨会 - 许可使用。