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