基于HLS的Sobel边缘检测实现与优化

2022-04-22 06:57
山西电子技术 2022年2期
关键词:流水线边缘卷积

刘 佶

(山西职业技术学院,山西 太原 030006)

0 引言

边缘检测是图像处理当中常用的处理过程,在人工智能领域的自动驾驶、目标识别中,在机械视觉领域中,在医疗领域中,都有着十分广泛的应用。例如,在医学领域使用边缘检测可以从医学影像中识别肿瘤[1-3]。但随着图像采集设备传感器分辨率和帧率的不断增加,图像处理算法需要的运算量越来越大,使得传统的使用CPU来实现处理算法的方式逐渐不能满足实时性的要求。FPGA很好解决了这一问题,这得益于其内部大量的乘法单元[4,5]。然而FPGA的开发过程长,调试手段不够丰富使得这种实现方式在面对规模庞大的工程时给开发人员带来了许多不便[6,7]。随着HLS(High-level Synthesis)语言的问世,开发人员可以使用C/C++语言去实现算法功能,而用工具去实现优化和综合的过程,大大缩短了开发周期。

1 Sobel边缘检测算法

边缘检测的实质即寻找图像像素值变化比较明显的点,可以使用梯度来进行判断。梯度的定义如下:

(1)

其中用到的偏导数定义如下:

(2)

(3)

梯度的模使用如下定义:

(4)

梯度的方向向量使用如下定义:

(5)

1959年,Julez首先研究了边缘检测。1963年,L.G.Roberts在此基础上提出了Roberts算子,此算法是最早使用对角优势来处理边缘信息的算法之一[8]。这种算法由于没有对图像进行整体平滑的预处理,所以对噪声较为敏感。对于信噪比低的区域,检测出的边缘会出现不清晰甚至模糊,但在高信噪比的区域,会有很好的清晰度[9]。

-1-2-100012101-1-202-101

在图像处理时,将算子作为移动窗口,依次与图像灰度数据卷积,其等价的差分公式如下:

gx=[f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1)]-[f(x-1,y-1)+2f(x,y-1)+f(x+1,y-1)] .

(6)

gy=[f(x-1,y-1)+2f(x,y-1)+f(x-1,y+1)]-[f(x+1,y-1)+2f(x+1,y)+f(x+1,y+1)] .

(7)

2 HLS语言

传统的FPGA开发过程,开发者首先使用高级语言如Matlab、C语言等对电路进行行为级仿真,正确后再使用Verilog或VHDL语言描述电路行为级功能,之后使用工具综合成为RTL级语言。硬件描述语言在开发时需要考虑所有信号的变化。另外,在系统行为级功能还存在迭代可能性的情况下,大量的系统级建模仿真和硬件描述语言代码编写工作会使开发周期变得很长。

HLS(High-level Synthesis)是指将传统的高级语言例如C、C++等,自动转换成RTL级语言的过程。它可以让开发者更加专注于电路的功能,不需要因为某些信号的变化细节耽误工作量,这些细节会由工具进行处理。另外,如果电路还存在迭代的需求,开发者也只需要修改使用高级语言做出的行为级描述。比起传统的开发方法,省去了修改硬件描述语言的工作,大大缩短了开发周期。

3 硬件平台介绍

本文选用了Xilinx公司的Zynq-7000 FPGA,该系列配备双核ARM Cortex-A9处理器来实现Sobel边缘识别算法。它具有最高达到12.5 Gb/s的收发电路接口和6.25M的可编程单元,选用具体型号为XC7Z020。该芯片的资源如图2。

图2 ZYNQ7020资源列表

选用此平台的原因是它内部集成了ARM Cortex-A9处理器,可以在FPGA程序设计完毕并调试通过后,打包成一个独立的功能模块供ARMCPU来调用。在最顶层使用C语言设计ARM的嵌入式程序,为后续的处理速度评估提供了极大方便。

评价单元是评价对象各种属性和数据的载体。本研究以土地资源为评价对象,以2016年度福州市各县域土地利用变更调查成果图为评价底图,以土地利用变更调查成果地类图斑作为评价的最小单元。

4 VivadoHLS开发环境下算法优化

Sobel算法边缘检测的实质是图像数据与算子之间的卷积。卷积的计算可以展开为如下4个for循环:

for(y=0;y

for(x=0;x=Nox;x=+S)

for(ky=0;ky

for(kx=0;kx

pixel(x,y)+=pixel(x+kx,y+ky)×sobel(kx,ky)

其中前两个循环是卷积核在图像x和y方向的滑动,后两个循环是卷积核内部数值与图像对应位置数据的乘累加运算。在Xilinx的VivadoHLS开发环境下,有专门针对循环的优化工具。这些工具,以编译选项的方式加入代码当中,不需要程序编写人员人工去完成,为开发提供了极大方便。

4.1 Vivado开发环境中的循环展开

Vivado开发环境中,可以通过给循环添加directives(指令)的方式对循环进行自动展开,如图3所示。

图3 循环展开directives

对于一个for循环,可以展开为N个for循环,每个循环执行原来的N分之一运算量,VivadoHLS开发环境会将这N个循环并行执行。这样以更多的资源消耗换来了更短的运算时间。其过程如图4所示。

图4 循环展开

上图将原本的一个循环拆成了两个循环来执行,两个循环分别从循环变量为0和1开始执行并逐次加2。当两个循环并行执行时,就可以实现原来循环一半的时间消耗。

在前述Sobel边缘检测的4个循环中,外部两个循环的循环体相互之间没有影响,是可以使用循环展开的。后两个循环,由于涉及到累加每次的运算结果,无法使用循环展开。

4.2 Vivado开发环境中的流水线

Vivado开发环境中,可以通过添加directives,使得循环自动流水化。前述边缘检测算法的4个循环中内部的两个循环,可以使用流水线的方式优化,如图5所示。

可以看出,循环体执行N次的情况下,不使用流水的方式,整个过程花费3N个时钟周期。使用流水之后,只需花费N+2个时钟周期。在N很大的情况下,这将使得效率大大提高。在Vivado开发环境中,同样可以通过添加directives的方式对指定的循环进行流水化,如图6所示。

图5 流水线

图6 流水线directives

5 结果分析与对比

5.1 运算量分析

将直接计算、加入流水、加入循环展开几种情况下电路综合得到的报告数据做对比如表1。

表1 结果对比

可以看出,使用流水会在不多消耗资源的情况下,更加高效地完成了任务。在使用循环展开后,增加了资源的消耗,乘法器的使用数量会成倍增加,但效率也会成倍的增加。另外,电路的Latency会比TripCount多2,这是因为进入和退出循环各需要多加一个时钟周期。

6 结束语

FPGA以其灵活性和高性能在信号处理领域越来越受到广大工程师和科研人员的青睐,但其开发速度一直是制约其广泛应用和快速发展的瓶颈。HLS语言的出现,使得开发人员从FPGA复杂的时序操作、流水线排布中抽身出来,将这些工作交由软件工具来完成,自己可以更多的关注电路功能的实现。

由于软件工具远远没有人的大脑灵活,HLS语言及其开发平台不能够将优化工作做到如人脑一般精细,很多优化功能也还未实现。但在未来,随着人工智能技术的发展,代码的编写工作将会越来越多的交给机器来完成。HLS语言在FPGA开发过程中参与的程度,将会不断提高。由于其使用了高级语言来表述电路,也会极大促进FPGA应用的推广。

猜你喜欢
流水线边缘卷积
基于3D-Winograd的快速卷积算法设计及FPGA实现
流水线
卷积神经网络的分析与设计
基于PLC的饮料灌装流水线设计
从滤波器理解卷积
基于傅里叶域卷积表示的目标跟踪算法
流水线
一张图看懂边缘计算
汽车喷漆流水线的应用与研究
在边缘寻找自我