用OpenCV和Vivado HLS加速基于Zynq SoC的嵌入式視覺應用開發(fā)
2013-07-04
作者:Fernando Martinez Vallina
來源:賽靈思公司HLS設(shè)計方法工程師
作者:Fernando Martinez Vallina
賽靈思公司HLS設(shè)計方法工程師
José Roberto Alvarez
賽靈思公司視頻技術(shù)工程設(shè)計總監(jiān) [email protected]
將Vivado HLS與OpenCV庫配合使用,,既能實現(xiàn)快速原型設(shè)計,又能加快基于Zynq All Programmable SoC的Smarter Vision系統(tǒng)的開發(fā)進度。
計算機視覺技術(shù)幾年來已發(fā)展成為學術(shù)界一個相當成熟的科研領(lǐng)域,,目前許多視覺算法來自于數(shù)十年的科研成果。不過,,我們最近發(fā)現(xiàn)計算機視覺技術(shù)正快速滲透到我們生活的方方面面?,F(xiàn)在我們擁有能自動駕駛的汽車、能根據(jù)我們的每個動作做出反應的游戲機,、自動工作的吸塵器,、能根據(jù)我們的手勢做出響應的手機,,以及其它等視覺產(chǎn)品。
今天我們面臨的挑戰(zhàn)就是如何高效實現(xiàn)上述這些及未來的各種視覺系統(tǒng),,同時滿足嚴格的功耗和上市要求,。此類產(chǎn)品可以Zynq™ All Programmable SoC為基礎(chǔ),,并結(jié)合廣泛使用的計算機視覺庫OpenCV和高層次綜合(HLS)工具,,以實現(xiàn)關(guān)鍵功能的硬件加速。這種強強組合能為設(shè)計和實現(xiàn)Smarter Vision系統(tǒng)提供強大的平臺,。
嵌入式系統(tǒng)在當今的市場中無所不在,。不過,,計算功能方面的局限性,,尤其是在處理大型圖片、高幀率時計算能力低下嚴重限制了嵌入式系統(tǒng)在計算機/機器視覺實際實現(xiàn)方面的應用,。圖像傳感器技術(shù)的發(fā)展猶如為嵌入式器件裝上了慧眼,,能幫助該器件通過計算機視覺算法與環(huán)境互動。嵌入式系統(tǒng)和計算機/機器視覺的融合催生了嵌入式視覺技術(shù),,這是一個快速發(fā)展的領(lǐng)域,,正成為設(shè)計能夠觀看并了解周邊環(huán)境的設(shè)備的基礎(chǔ)所在。
嵌入式視覺系統(tǒng)的開發(fā)
嵌入式視覺技術(shù)要在計算平臺上運行智能計算機視覺算法,。對許多用戶來說,,標準的桌面計算處理平臺即可方便地滿足需求。不過,,一般性計算平臺或許無法滿足高度嵌入式產(chǎn)品的生產(chǎn)需求,,這種產(chǎn)品要做到小型化、高效性,、低功耗,,而且要處理龐大的圖像數(shù)據(jù)集,比如同時處理多個每秒60幀的實時高清視頻流,。
圖1給出了設(shè)計人員通常用來創(chuàng)建嵌入式視覺應用的流程,。算法設(shè)計是整個流程中最重要的一環(huán),因為算法將決定我們能否滿足任何特定計算機視覺任務的處理和質(zhì)量標準要求,。首先,,設(shè)計人員在MATLAB®等數(shù)字計算環(huán)境中搜索算法選項,明確高級處理選項,。一旦確定了適當?shù)乃惴?,設(shè)計人員通常用C/C++等高級語言來為算法建模,以便快速執(zhí)行,,并滿足最終比特精度實現(xiàn)方案的要求,。
圖1 嵌入式視覺系統(tǒng)開發(fā)流程
系統(tǒng)分區(qū)是開發(fā)過程中的重要步驟,。在此,設(shè)計人員通過算法性能分析,,可明確他們要對算法的哪些部分進行硬件加速,,從而滿足處理代表性輸入數(shù)據(jù)集的實時要求。同樣重要的是對目標平臺中的整個系統(tǒng)進行原型設(shè)計,,從而實際地檢測性能預期,。一旦原型設(shè)計過程說明設(shè)計滿足了所有性能和質(zhì)量目標要求,那么設(shè)計人員就能在實際的目標器件中啟動最終系統(tǒng)實現(xiàn),。最后一步就是測試運行在芯片上的設(shè)計在各種用例場景下的表現(xiàn),。一切檢查完成后,設(shè)計團隊就能發(fā)布最終產(chǎn)品,。
ZYNQ SOC:嵌入式視覺的最明智的選擇
在開發(fā)機器視覺應用過程中,,設(shè)計團隊必須選擇高度靈活的器件,這一點至關(guān)重要,。設(shè)計團隊所需的計算平臺應提供強大的通用處理功能,,以支持多種不同的軟件生態(tài)系統(tǒng),此外還要有穩(wěn)健可靠的數(shù)字信號處理功能,,以便實現(xiàn)計算強度高,、存儲高效的計算機視覺算法。芯片的高度集成對實現(xiàn)高效,、完整的系統(tǒng)至關(guān)重要,。
賽靈思All Programmable SoC是以處理器為中心的器件,在單芯片上提供了軟/硬件和I/O可編程性,。Zynq SoC在單個器件中集成了一個ARM®雙核Cortex™-A9 MPCore™處理系統(tǒng),、FPGA邏輯和一些關(guān)鍵外設(shè)。這樣,,該器件就能幫助設(shè)計人員實現(xiàn)極為高效的嵌入式視覺系統(tǒng),。
處理子系統(tǒng)、FPGA邏輯和外設(shè)在Zynq SoC中的高度集成能確保相對于采用分立式組件設(shè)計而成的系統(tǒng)而言提高數(shù)據(jù)傳輸速率,,降低功耗和材料清單成本,。我們能用Zynq SoC實現(xiàn)實時處理支持1080p60視頻序列(1,920 x 1,080 RGB圖像,每秒60幀)的系統(tǒng),,達到每秒數(shù)千億次運算的處理功能,。
為了全面利用Zynq SoC的諸多功能與特性,賽靈思推出了以IP和系統(tǒng)為中心的設(shè)計環(huán)境Vivado™設(shè)計套件,。該套件可加速集成和實現(xiàn),從而可幫助設(shè)計人員提高開發(fā)生產(chǎn)力,,進而動態(tài)開發(fā)出Smater嵌入式產(chǎn)品,。Vivado HLS作為該套件的一個組件,,能幫助設(shè)計人員將采用C/C++語言開發(fā)的算法編譯為RTL,以便在FPGA邏輯中運行,。
Vivado HLS工具非常適用于嵌入式視覺設(shè)計,。在此流程中,您用C/C++創(chuàng)建您的算法,,再用Vivado HLS將算法或算法的一部分編譯為RTL,,進而確定哪些函數(shù)更適合在FPGA邏輯中運行,哪些函數(shù)更適合在ARM處理器上運行,。這樣,您的設(shè)計團隊就能集中精力打造出最佳性能的基于Zynq SoC的視覺系統(tǒng),。
為了進一步幫助嵌入式視覺開發(fā)人員創(chuàng)建Smarter Vision系統(tǒng),,賽靈思在Vivado中增加了對OpenCV計算機視覺算法庫的支持。賽靈思還推出了最新IP Integrator工具和SmartCORE™ IP以支持此類設(shè)計(參見封面報道的第8頁),。
OPENCV推廣計算機視覺技術(shù)
OpenCV開辟了一條開發(fā)智能計算機視覺算法的途徑,,而且能預測實時性能。該庫為設(shè)計人員提供了用于算法試驗和快速原型設(shè)計的環(huán)境,。
OpenCV設(shè)計框架得到多平臺支持,。不過在許多情況下,要提高庫對嵌入式產(chǎn)品的效率,,就需要在嵌入式平臺上實現(xiàn),而且該平臺要能夠加速高強度例程,,滿足實時性能要求,。
雖然OpenCV在設(shè)計時就考慮到計算效率問題,不過它源自傳統(tǒng)計算環(huán)境,,可支持多核處理。這種計算平臺或許對高度強調(diào)效率,、成本和功耗的嵌入式應用來說并不是最佳選擇,。
OPENCV的特性
OpenCV是一款基于BSD許可證授權(quán)發(fā)行的開源計算機視覺庫,這就意味著它可免費用于學術(shù)和商業(yè)應用中,。它最初設(shè)計旨在提高通用多處理系統(tǒng)的計算效率,,側(cè)重于實時應用。此外,,OpenCV還提供C/C++和Python等多種編程接口,。
開源項目的優(yōu)勢在于,用戶能持續(xù)改進算法,,并將算法擴展用于多種不同應用領(lǐng)域。目前用OpenCV可現(xiàn)實2,500多種功能,,其中包括:
• 矩陣數(shù)學
• 公用設(shè)施和數(shù)據(jù)結(jié)構(gòu)
• 通用圖像處理功能
• 圖像轉(zhuǎn)換
• 圖像金字塔
• 幾何描述符函數(shù)
• 特性識別,、提取和跟蹤
• 圖像分割與擬合
• 攝像頭校準、立體化和3D處理
• 機器學習:檢測,、識別
有關(guān)OpenCV的更多詳情,,敬請訪問以下網(wǎng)址: opencv.org 和 opencv.willowgarage.com 。
用HLS加速OPENCV函數(shù)
一旦完成了嵌入式視覺系統(tǒng)架構(gòu)的分區(qū),,找到了計算強度最大的部分,,HLS工具就能幫助您加速這些函數(shù),同時仍能繼續(xù)使用C++編寫,。Vivado HLS用C,、C++或SystemC代碼生成高效的RTL實現(xiàn)方案。
此外,,以IP為中心的Vivado設(shè)計環(huán)境提供豐富的處理IP SmartCORE,能簡化到圖像傳感器,、網(wǎng)絡(luò)及其它必要I/O接口的連接,,簡化OpenCV庫中這些函數(shù)的實現(xiàn)。這相對于其它實現(xiàn)方案而言是一種明顯的優(yōu)勢,,因為其它方案哪怕是最基本的OpenCV I/O功能都需要加速,。
為什么需要高層次綜合?
賽靈思推出的Vivado HLS是一款軟件編譯器,,旨在將C、C++或SystemC編寫的算法轉(zhuǎn)變?yōu)獒槍τ脩舳x時鐘頻率和賽靈思產(chǎn)品系列器件優(yōu)化的RTL,。在C/C++程序解釋,、分析和優(yōu)化方面,它與x86處理器的編譯器具有相同的核心技術(shù)基礎(chǔ),。這種相似性有助于從臺式機開發(fā)環(huán)境快速移植到FPGA實現(xiàn),。您選擇目標時鐘頻率和器件后,無需用戶輸入,,Vivado HLS會默認生成RTL實現(xiàn),。此外,Vivado HLS與其它任何編譯器一樣,,也分不同的優(yōu)化級別,。由于算法最終執(zhí)行目標是定制的微型架構(gòu),因此Vivado HLS可實現(xiàn)的優(yōu)化級別比傳統(tǒng)的編譯器具有更精細的粒度,。傳統(tǒng)的針對處理器的軟件設(shè)計O1 – O3優(yōu)化理念被架構(gòu)探索要求所取代,,這些要求與用戶技術(shù)相結(jié)合,,指導Vivado HLS創(chuàng)建盡可能出色的實現(xiàn)方案,,滿足特定算法的功耗,、面積占用和性能要求。
圖2給出了HLS編譯器的用戶設(shè)計流程,。從理念上講,,用戶提供C/C++/SystemC算法描述,編譯器就能生成RTL實現(xiàn),。程序代碼轉(zhuǎn)化為RTL的過程分為四大階段:算法規(guī)范,、微型架構(gòu)探索,、RTL實現(xiàn)和IP封裝,。
加速算法C到IP集成
圖2 高層次綜合設(shè)計流程
算法規(guī)范階段是指將針對FPGA架構(gòu)的軟件應用開發(fā),。該規(guī)范可在標準桌面軟件開發(fā)環(huán)境中,全面利用賽靈思提供的OpenCV等軟件庫進行開發(fā),。除了支持以軟件為中心的開發(fā)流程外,,Vivado HLS還提升了從RTL到C/C++的提取驗證速度,。用戶能用原軟件進行全面的算法功能驗證。通過Vivado HLS生成RTL后,,生成的設(shè)計代碼類似于傳統(tǒng)軟件編譯器生成的處理器匯編代碼,。用戶可在匯編代碼級進行調(diào)試,但這一步并不是必需的,。
雖然Vivado HLS能處理幾乎所有針對其它軟件編譯器的C/C++代碼,但代碼有一個限制,。在用Vivado HLS編譯代碼到FPGA過程中,,用戶代碼不能包含任何運行時動態(tài)存儲器分配。與算法綁定于單個存儲器架構(gòu)的處理器不同,,F(xiàn)PGA實現(xiàn)采用特定算法的存儲器架構(gòu),。通過分析陣列和變量的使用模式,Vivado HLS能確定哪些物理存儲器布局和存儲器類型最適合算法的存儲和帶寬要求,。這種分析工作的唯一要求就是在C/C++代碼中明確描述算法使用的所有存儲器陣列,。
從C/C++轉(zhuǎn)為優(yōu)化的FPGA實現(xiàn)的第二步就是微型架構(gòu)探索,。在這一階段,您可運用Vivado HLS編譯器優(yōu)化來測試不同的設(shè)計,,以找到適當?shù)拿娣e和性能組合,。您可在不同性能點實現(xiàn)相同的C/C++代碼,無需修改源代碼,。Vivado HLS編譯器優(yōu)化或要求規(guī)定了算法不同部分的性能如何描述。
Vivado HLS編譯器流程的最后兩步就是RTL實現(xiàn)和IP封裝,。這是Vivado HLS編譯器中自動進行的兩步,,不需要用戶具備RTL方面的知識。針對賽靈思產(chǎn)品組合中不同器件的RTL創(chuàng)建優(yōu)化細節(jié)內(nèi)置在編譯器中,。在此階段,為滿足需求,,我們提供了經(jīng)過全面測試和驗證的按鈕式工具,,能生成基于時序和基于FPGA架構(gòu)的RTL。Vivado HLS編譯器的輸出自動封裝為IP-XACT等其它賽靈思工具能接受的格式,,因此無需進行其它操作,,就可在Vivado中使用HLS生成的IP核。
賽靈思的OpenCV庫為用Vivado HLS進行設(shè)計優(yōu)化提供了捷徑,。這些庫預先特性描述后能提供1080p分辨率的像素處理功能。引導Vivado HLS編譯器進行優(yōu)化的細節(jié)已嵌入在這些庫中,。這樣,,您就能快速自如地將桌面環(huán)境中的OpenCV理念應用迭代為Zynq SoC上運行的OpenCV應用,均可在ARM處理器和FPGA架構(gòu)上操作,。
圖3概述了用OpenCV進行運動檢測應用開發(fā)流程,。該設(shè)計的目的就是通過比較當前幀和前一幀來檢測視頻流中的移動物體,。算法的第一階段要檢測前后兩幀的邊緣。數(shù)據(jù)縮減運算(data-reduction operation)便于分析連續(xù)幀之間的相對變化,。邊緣信息提取出來后,,通過邊緣對比可以檢測出當前圖像中出現(xiàn)而前一圖像中不存在的邊緣,。檢測出來的新邊緣則構(gòu)成運動檢測掩膜圖像。最新邊緣檢測結(jié)果在當前圖像上凸顯前,,應考慮到圖像傳感器噪聲的影響。各幀的噪聲可能不同,,會導致運動檢測掩膜圖像中出現(xiàn)隨機錯誤邊緣,。因此我們必須過濾圖像,減少噪聲對算法質(zhì)量的影響,。
圖3 OpenCV算法庫開發(fā)的運動檢測應用實例
在該應用中,可通過在運動檢測掩膜圖像上采用7x7中值濾波器來降噪,。中值濾波器的主要就是取7x7相鄰像素窗口的中值,然后將中值作為窗口中心像素的最終值進行報告,。降噪后,,運動檢測掩膜圖像結(jié)合于實時輸入圖像并用紅色凸顯出運動邊緣。
您可全面實現(xiàn)應用,,運行在ARM處理子系統(tǒng)上,采用Zynq SoC源代碼映射,,如圖4所示,。實現(xiàn)過程中僅有的硬件元素就是cvget-frame和showimage函數(shù)。這兩個視頻I/O函數(shù)用FPGA架構(gòu)中的賽靈思視頻I/O子系統(tǒng)實現(xiàn)的,。在cvgetframe函數(shù)調(diào)用時,,視頻I/O子系統(tǒng)的輸入端負責處理所有細節(jié),從HDMI接口抓取并解碼視頻流,,再把像素數(shù)據(jù)存入DDR存儲器。Showimage函數(shù)調(diào)用時,,該子系統(tǒng)負責將像素數(shù)據(jù)從DDR存儲器傳輸?shù)揭曨l顯示控制器,,以驅(qū)動電視機或其它符合HDMI標準的視頻顯示設(shè)備。
Vivado HLS優(yōu)化的,、支持硬件加速的OpenCV庫能將圖4中的代碼移植到FPGA架構(gòu)中的60fps實時像素處理流水線上,。OpenCV庫為需要硬件加速的OpenCV元素提供基礎(chǔ)功能,。如果沒有硬件加速,也就是說如果僅在ARM處理器中運行所有代碼的話,,那么該算法吞吐量僅為每13秒1幀(也就是0.076fps),。圖5顯示了Vivado HLS編譯后的應用的新映射,。請注意,原系統(tǒng)的視頻I/O映射可重復使用,。此前正在ARM處理器上執(zhí)行的算法的計算內(nèi)核,現(xiàn)在可編譯到多個Vivado HLS生成的IP模塊中,。這些模塊連接至Vivado IP Integrator中的視頻I/O子系統(tǒng),,針對60fps、1080p的視頻處理進行了優(yōu)化,。
圖4 Zynq SoC上采用ARM處理器的運動檢測
圖5 采用可編程架構(gòu)的Zynq SoC上的運動檢測
Zynq SoC和Vivado設(shè)計套件提供的All Programmable環(huán)境非常適合以最新高分辨率視頻技術(shù)所要求的高數(shù)據(jù)處理速率運行的嵌入式視覺系統(tǒng)的設(shè)計、原型設(shè)計和測試,。采用OpenCV中的開源庫集是在較短開發(fā)時間內(nèi)實現(xiàn)高標準計算機視覺應用的最佳選擇,。由于OpenCV庫用C++編寫,因此我們用Vivado HLS創(chuàng)建的源代碼能高效轉(zhuǎn)換為Zynq SoC FPGA架構(gòu)中的硬件RTL,,并可用作方便易用的處理加速器,,且不影響OpenCV最初設(shè)想的設(shè)計環(huán)境的靈活性。
如需了解如何用Vivado設(shè)計套件創(chuàng)建Smarter Vision設(shè)計方案的更多信息,,敬請訪問以下網(wǎng)址: http://www.xilinx.com/cn/products/design-tools/viva- do/index.htm 。