新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式機(jī)器視覺系統(tǒng)優(yōu)化研究

嵌入式機(jī)器視覺系統(tǒng)優(yōu)化研究

作者: 時(shí)間:2016-10-10 來源:網(wǎng)絡(luò) 收藏

3.1 選擇合適的算法
在機(jī)器視覺算法優(yōu)化過程中,速度和內(nèi)存不可兼得,要想得到較快的運(yùn)行速度必須適當(dāng)增加內(nèi)存空間的使用量。例如,在JPG圖像有Huffman編碼表,從YUV到RGB的變換也有變換表,本文計(jì)算梯度方向直方圖HOG時(shí)需要用到18個(gè)方向的三角函數(shù)。這些運(yùn)算原本較復(fù)雜,采用查表的方法之后,雖然占用了內(nèi)存,但顯著提高了運(yùn)行速度。
3.2 代碼效率的優(yōu)化
代碼效率優(yōu)化的前提是要保證程序結(jié)果的正確性,在此基礎(chǔ)上對(duì)空間復(fù)雜度和時(shí)間復(fù)雜度進(jìn)行調(diào)整,以達(dá)到性能的提升。代碼效率優(yōu)化可以采用多種方法。
1)采用較短的數(shù)據(jù)類型
本文實(shí)驗(yàn)中浮點(diǎn)數(shù)據(jù)類型用float代替double,目標(biāo)檢測(cè)結(jié)果基本不變,但是運(yùn)算量和所占用內(nèi)存空間都相應(yīng)減少。
2)switch語句優(yōu)化
對(duì)于switch語句,編譯器是按照順序進(jìn)行條件比較,發(fā)現(xiàn)匹配時(shí),就跳轉(zhuǎn)到滿足條件的語句執(zhí)行。為了提高速度,可以把發(fā)生頻率較高的條件放在前面。
3)用指針代替數(shù)組
在許多情況下,可以用指針運(yùn)算代替數(shù)組索引,編譯后常常能產(chǎn)生又快又短的代碼。與數(shù)組索引相比,指針一般能使代碼速度更快,占用空間更少,這在使用多維數(shù)組時(shí)差異更明顯。
4)用宏函數(shù)取代函數(shù)
函數(shù)和宏函數(shù)的區(qū)別就在于,宏函數(shù)占用大量的空間,而函數(shù)占用了時(shí)間。當(dāng)函數(shù)被多次調(diào)用時(shí),會(huì)反復(fù)進(jìn)行壓棧和彈棧操作,從而消耗一些額外的時(shí)間。使用宏函數(shù)不會(huì)產(chǎn)生函數(shù)調(diào)用,所以僅僅占用了空間,不會(huì)增加額外的運(yùn)行時(shí)間。
5)循環(huán)優(yōu)化:采用循環(huán)合并與循環(huán)展開
當(dāng)兩個(gè)循環(huán)的負(fù)荷都不滿時(shí),可以把它們合并在一起組成一個(gè)循環(huán)。循環(huán)展開就是把循環(huán)計(jì)數(shù)小的循環(huán)展開,成為非循環(huán)形式的串行程序,或者把循環(huán)計(jì)數(shù)大的循環(huán)部分展開,減少循環(huán)迭代次數(shù),這樣可以節(jié)省用于循環(huán)設(shè)置、初始化、增加和校對(duì)循環(huán)計(jì)數(shù)器的時(shí)間。
6)采用Inline函數(shù)
在C++中,當(dāng)函數(shù)前加關(guān)鍵字Inline的聲明,編譯器會(huì)用函數(shù)內(nèi)部的代碼替換所有對(duì)該函數(shù)的調(diào)用。這樣可以省去調(diào)用函數(shù)指令需要的執(zhí)行時(shí)間以及傳遞變?cè)蛡鬟f過程需要的時(shí)間。通常,這種優(yōu)化在Inline函數(shù)被頻繁調(diào)用并且只包含較短代碼的時(shí)候最有效。
7)使用增量和減量操作符
在用到自增和白減運(yùn)算時(shí)應(yīng)盡量使用增量和減量操作符,因?yàn)樵隽糠Z句比賦值語句更快。
3.3 充分利用處理器特性進(jìn)行加速
ARM+DSP的組合在開發(fā)中堪稱理想架構(gòu)。DSP可專門用于處理密集型信號(hào)處理需求、復(fù)雜的數(shù)學(xué)函數(shù)以及圖像處理算法,而ARM則可用于實(shí)現(xiàn)圖形用戶界面、網(wǎng)絡(luò)連接及系統(tǒng)控制等。上面的代碼優(yōu)化措施是通用的方法,如果針對(duì)處理器的特性對(duì)程序進(jìn)行優(yōu)化,可以得到更好的優(yōu)化效果。
1)利用開發(fā)工具對(duì)DSP程序進(jìn)行優(yōu)化
有很多算法在DSP平臺(tái)可以實(shí)現(xiàn),在ARM上也可以,但有些特定算法,如濾波、視頻編解碼等放在DSP上運(yùn)行的效率較高。以往的開發(fā)中對(duì)DSP程序的優(yōu)化更多是匯編程序的優(yōu)化,但用匯編語言做開發(fā)和優(yōu)化往往費(fèi)時(shí)又費(fèi)力。但是隨著開發(fā)工具的更新,現(xiàn)在的C代碼優(yōu)化效率可達(dá)到手工匯編的90%。TI提供的C6EZRUN工具可以使開發(fā)人員能在DSP上運(yùn)行ARM代碼,而無需修改,并且從ARM到DSP代碼的轉(zhuǎn)換效率非常高。TI的另一個(gè)開發(fā)工具C6EZAccel則提供了一個(gè)包括數(shù)百個(gè)DSP優(yōu)化型信號(hào)處理算法的程序庫,通過ARM API加快開發(fā)進(jìn)度。開發(fā)人員可以將更多的精力投入到算法設(shè)計(jì)中。
2)充分利用ARM處理器的NEON技術(shù)進(jìn)行加速
ARM高級(jí)單指令多數(shù)據(jù)(SIMD)擴(kuò)展亦稱NEON技術(shù),它是一種由ARM開發(fā)的64/128位混合SIMD體系結(jié)構(gòu),可以提升多媒體和信號(hào)處理應(yīng)用程序的性能。其關(guān)鍵功能包括對(duì)齊和未對(duì)齊數(shù)據(jù)訪問,支持整型定點(diǎn)和單精度浮點(diǎn)數(shù)據(jù)類型、與ARM核心的緊密耦合,以及具有多個(gè)視圖的大型寄存器文件。NEON指令在ARM和Thumb-2中都可用。要生成NEON指令,必須在命令行中指定采用NEON技術(shù)的Cortex處理器。ARMv7之前的體系結(jié)構(gòu)不提供NEON支持。如果要對(duì)進(jìn)行優(yōu)化,需要增加編譯選項(xiàng)“-mcpu=cortex-a8-mfpu=neon”。
3.4 應(yīng)用程序優(yōu)化結(jié)果
實(shí)時(shí)程序設(shè)計(jì)時(shí)可以運(yùn)用上面介紹的一種或多種方法來優(yōu)化代碼。以上方法主要是為了提高代碼的執(zhí)行效率,但會(huì)增加代碼長度,降低可讀性。在程序設(shè)計(jì)中應(yīng)合理地使用這幾種技術(shù)以達(dá)到較好的優(yōu)化效果。
運(yùn)用上述方法,對(duì)基于HOG特征的物體檢測(cè)算法進(jìn)行優(yōu)化,運(yùn)行時(shí)間如圖3所示。該算法是目前公認(rèn)的準(zhǔn)確率最高的目標(biāo)檢測(cè)算法。對(duì)汽車、大巴、自行車、行人的檢測(cè)結(jié)果如圖4所示??紤]到該算法的復(fù)雜性以及檢測(cè)精度的要求,我們采用的是浮點(diǎn)數(shù)優(yōu)化。結(jié)果表明,經(jīng)過優(yōu)化后程序運(yùn)行速度約為原來的2.5倍。

本文引用地址:http://m.butianyuan.cn/article/201610/306025.htm

e.jpg



4 結(jié)束語
隨著嵌入式系統(tǒng)的高速發(fā)展,嵌入式機(jī)器的應(yīng)用也越來越廣泛。如何把運(yùn)算量大、算法復(fù)雜的機(jī)器視覺應(yīng)用程序移植到嵌入式平臺(tái)上并進(jìn)行優(yōu)化設(shè)計(jì)是重要的課題。本文針對(duì)嵌入式機(jī)器的特點(diǎn),在操作系統(tǒng)方面對(duì)內(nèi)核和文件系統(tǒng)進(jìn)行了精簡(jiǎn),在應(yīng)用程序方面做了大量的優(yōu)化,并充分利用Cotex—A處理器的NEON加速技術(shù),顯著提高了嵌入式機(jī)器的性能,對(duì)嵌入式機(jī)器視覺系統(tǒng)的開發(fā)具有借鑒意義。


上一頁 1 2 3 下一頁

關(guān)鍵詞: 嵌入式 視覺系統(tǒng)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉