劉 佶
(山西職業(yè)技術(shù)學(xué)院,山西 太原 030006)
邊緣檢測是圖像處理當(dāng)中常用的處理過程,在人工智能領(lǐng)域的自動駕駛、目標(biāo)識別中,在機械視覺領(lǐng)域中,在醫(yī)療領(lǐng)域中,都有著十分廣泛的應(yīng)用。例如,在醫(yī)學(xué)領(lǐng)域使用邊緣檢測可以從醫(yī)學(xué)影像中識別腫瘤[1-3]。但隨著圖像采集設(shè)備傳感器分辨率和幀率的不斷增加,圖像處理算法需要的運算量越來越大,使得傳統(tǒng)的使用CPU來實現(xiàn)處理算法的方式逐漸不能滿足實時性的要求。FPGA很好解決了這一問題,這得益于其內(nèi)部大量的乘法單元[4,5]。然而FPGA的開發(fā)過程長,調(diào)試手段不夠豐富使得這種實現(xiàn)方式在面對規(guī)模龐大的工程時給開發(fā)人員帶來了許多不便[6,7]。隨著HLS(High-level Synthesis)語言的問世,開發(fā)人員可以使用C/C++語言去實現(xiàn)算法功能,而用工具去實現(xiàn)優(yōu)化和綜合的過程,大大縮短了開發(fā)周期。
邊緣檢測的實質(zhì)即尋找圖像像素值變化比較明顯的點,可以使用梯度來進行判斷。梯度的定義如下:
(1)
其中用到的偏導(dǎo)數(shù)定義如下:
(2)
(3)
梯度的模使用如下定義:
(4)
梯度的方向向量使用如下定義:
(5)
1959年,Julez首先研究了邊緣檢測。1963年,L.G.Roberts在此基礎(chǔ)上提出了Roberts算子,此算法是最早使用對角優(yōu)勢來處理邊緣信息的算法之一[8]。這種算法由于沒有對圖像進行整體平滑的預(yù)處理,所以對噪聲較為敏感。對于信噪比低的區(qū)域,檢測出的邊緣會出現(xiàn)不清晰甚至模糊,但在高信噪比的區(qū)域,會有很好的清晰度[9]。
-1-2-100012101-1-202-101
在圖像處理時,將算子作為移動窗口,依次與圖像灰度數(shù)據(jù)卷積,其等價的差分公式如下:
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)
傳統(tǒng)的FPGA開發(fā)過程,開發(fā)者首先使用高級語言如Matlab、C語言等對電路進行行為級仿真,正確后再使用Verilog或VHDL語言描述電路行為級功能,之后使用工具綜合成為RTL級語言。硬件描述語言在開發(fā)時需要考慮所有信號的變化。另外,在系統(tǒng)行為級功能還存在迭代可能性的情況下,大量的系統(tǒng)級建模仿真和硬件描述語言代碼編寫工作會使開發(fā)周期變得很長。
HLS(High-level Synthesis)是指將傳統(tǒng)的高級語言例如C、C++等,自動轉(zhuǎn)換成RTL級語言的過程。它可以讓開發(fā)者更加專注于電路的功能,不需要因為某些信號的變化細節(jié)耽誤工作量,這些細節(jié)會由工具進行處理。另外,如果電路還存在迭代的需求,開發(fā)者也只需要修改使用高級語言做出的行為級描述。比起傳統(tǒng)的開發(fā)方法,省去了修改硬件描述語言的工作,大大縮短了開發(fā)周期。
本文選用了Xilinx公司的Zynq-7000 FPGA,該系列配備雙核ARM Cortex-A9處理器來實現(xiàn)Sobel邊緣識別算法。它具有最高達到12.5 Gb/s的收發(fā)電路接口和6.25M的可編程單元,選用具體型號為XC7Z020。該芯片的資源如圖2。
圖2 ZYNQ7020資源列表
選用此平臺的原因是它內(nèi)部集成了ARM Cortex-A9處理器,可以在FPGA程序設(shè)計完畢并調(diào)試通過后,打包成一個獨立的功能模塊供ARMCPU來調(diào)用。在最頂層使用C語言設(shè)計ARM的嵌入式程序,為后續(xù)的處理速度評估提供了極大方便。
評價單元是評價對象各種屬性和數(shù)據(jù)的載體。本研究以土地資源為評價對象,以2016年度福州市各縣域土地利用變更調(diào)查成果圖為評價底圖,以土地利用變更調(diào)查成果地類圖斑作為評價的最小單元。
Sobel算法邊緣檢測的實質(zhì)是圖像數(shù)據(jù)與算子之間的卷積。卷積的計算可以展開為如下4個for循環(huán):
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) 其中前兩個循環(huán)是卷積核在圖像x和y方向的滑動,后兩個循環(huán)是卷積核內(nèi)部數(shù)值與圖像對應(yīng)位置數(shù)據(jù)的乘累加運算。在Xilinx的VivadoHLS開發(fā)環(huán)境下,有專門針對循環(huán)的優(yōu)化工具。這些工具,以編譯選項的方式加入代碼當(dāng)中,不需要程序編寫人員人工去完成,為開發(fā)提供了極大方便。 Vivado開發(fā)環(huán)境中,可以通過給循環(huán)添加directives(指令)的方式對循環(huán)進行自動展開,如圖3所示。 圖3 循環(huán)展開directives 對于一個for循環(huán),可以展開為N個for循環(huán),每個循環(huán)執(zhí)行原來的N分之一運算量,VivadoHLS開發(fā)環(huán)境會將這N個循環(huán)并行執(zhí)行。這樣以更多的資源消耗換來了更短的運算時間。其過程如圖4所示。 圖4 循環(huán)展開 上圖將原本的一個循環(huán)拆成了兩個循環(huán)來執(zhí)行,兩個循環(huán)分別從循環(huán)變量為0和1開始執(zhí)行并逐次加2。當(dāng)兩個循環(huán)并行執(zhí)行時,就可以實現(xiàn)原來循環(huán)一半的時間消耗。 在前述Sobel邊緣檢測的4個循環(huán)中,外部兩個循環(huán)的循環(huán)體相互之間沒有影響,是可以使用循環(huán)展開的。后兩個循環(huán),由于涉及到累加每次的運算結(jié)果,無法使用循環(huán)展開。 Vivado開發(fā)環(huán)境中,可以通過添加directives,使得循環(huán)自動流水化。前述邊緣檢測算法的4個循環(huán)中內(nèi)部的兩個循環(huán),可以使用流水線的方式優(yōu)化,如圖5所示。 可以看出,循環(huán)體執(zhí)行N次的情況下,不使用流水的方式,整個過程花費3N個時鐘周期。使用流水之后,只需花費N+2個時鐘周期。在N很大的情況下,這將使得效率大大提高。在Vivado開發(fā)環(huán)境中,同樣可以通過添加directives的方式對指定的循環(huán)進行流水化,如圖6所示。 圖5 流水線 圖6 流水線directives 將直接計算、加入流水、加入循環(huán)展開幾種情況下電路綜合得到的報告數(shù)據(jù)做對比如表1。 表1 結(jié)果對比 可以看出,使用流水會在不多消耗資源的情況下,更加高效地完成了任務(wù)。在使用循環(huán)展開后,增加了資源的消耗,乘法器的使用數(shù)量會成倍增加,但效率也會成倍的增加。另外,電路的Latency會比TripCount多2,這是因為進入和退出循環(huán)各需要多加一個時鐘周期。 FPGA以其靈活性和高性能在信號處理領(lǐng)域越來越受到廣大工程師和科研人員的青睞,但其開發(fā)速度一直是制約其廣泛應(yīng)用和快速發(fā)展的瓶頸。HLS語言的出現(xiàn),使得開發(fā)人員從FPGA復(fù)雜的時序操作、流水線排布中抽身出來,將這些工作交由軟件工具來完成,自己可以更多的關(guān)注電路功能的實現(xiàn)。 由于軟件工具遠遠沒有人的大腦靈活,HLS語言及其開發(fā)平臺不能夠?qū)?yōu)化工作做到如人腦一般精細,很多優(yōu)化功能也還未實現(xiàn)。但在未來,隨著人工智能技術(shù)的發(fā)展,代碼的編寫工作將會越來越多的交給機器來完成。HLS語言在FPGA開發(fā)過程中參與的程度,將會不斷提高。由于其使用了高級語言來表述電路,也會極大促進FPGA應(yīng)用的推廣。4.1 Vivado開發(fā)環(huán)境中的循環(huán)展開
4.2 Vivado開發(fā)環(huán)境中的流水線
5 結(jié)果分析與對比
5.1 運算量分析
6 結(jié)束語