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