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