<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201610/306025.htm

          e.jpg



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


          上一頁 1 2 3 下一頁

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

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();