孫 鵬,肖 經(jīng),趙海盟,劉 帆,晏 磊,3,趙紅穎
(1. 桂林電子科技大學(xué)機(jī)電工程學(xué)院,廣西桂林541004;2. 空間信息集成與3S工程應(yīng)用北京市重點(diǎn)實(shí)驗(yàn)室(北京大學(xué)),北京100871;3. 廣西高校無(wú)人機(jī)遙測(cè)重點(diǎn)實(shí)驗(yàn)室(桂林航天工業(yè)學(xué)院),廣西桂林541004)
(?通信作者電子郵箱zhaohaimeng@guat.edu.cn)
尺度不變特征變換(Scale-Invariant Feature Transform,SIFT)算法[1]在無(wú)人機(jī)(Unmanned Aerial Vehicle,UAV)遙感影像特征點(diǎn)提取和匹配領(lǐng)域內(nèi)扮演著重要角色,隨著時(shí)間推移得到不斷的發(fā)展和完善。
數(shù)字信號(hào)處理器(Digital Signal Processor,DSP)是一種適用于密集型數(shù)據(jù)運(yùn)算與實(shí)時(shí)信號(hào)處理的微處理器[2]?,F(xiàn)階段,在高性能DSP 平臺(tái)上實(shí)現(xiàn)部分復(fù)雜圖像處理算法成為了DSP 應(yīng)用研究的一個(gè)熱點(diǎn)。在高性能DSP 平臺(tái)上實(shí)現(xiàn)完整的SIFT 算法,可以減輕對(duì)主計(jì)算機(jī)中央處理器(Central Processing Unit,CPU)、圖形處理器(Graphics Processing Unit,GPU)和高速緩存等資源的占用,特別是對(duì)圖像算法處理過(guò)程中的定點(diǎn)、浮點(diǎn)迭代運(yùn)算相比計(jì)算機(jī)平臺(tái)處理速度更快。同時(shí),DSP 平臺(tái)具有體積小、功耗低和便于集成等優(yōu)點(diǎn)[3],采用DSP 實(shí)現(xiàn)無(wú)人機(jī)遙感影像臨場(chǎng)數(shù)據(jù)快速處理具有很大的優(yōu)勢(shì)。
前期,已經(jīng)有一些人在DSP 上進(jìn)行了SIFT 算法的部分研究。許飛等[4]在EVM6670L 平臺(tái)上運(yùn)行SIFT 算法時(shí),基于進(jìn)程間通信(Inter-Process Communication,IPC)模塊實(shí)現(xiàn)4 核處理器協(xié)同處理;劉顏開(kāi)等[5]在TMS320C6678 平臺(tái)上實(shí)現(xiàn)8 核協(xié)同處理SIFT 算法。以上研究,既沒(méi)有使用本文采用的DSP內(nèi)核的硬件計(jì)算單元直接處理單精度浮點(diǎn)型像素?cái)?shù)據(jù)的乘法計(jì)算,也沒(méi)有充分發(fā)揮DSP的軟件流水特長(zhǎng),對(duì)計(jì)算過(guò)程并未進(jìn)行高質(zhì)量的重新編排;此外,研究中處理的圖像尺寸太小,遠(yuǎn)遠(yuǎn)小于本文實(shí)驗(yàn)采用的大尺寸無(wú)人機(jī)遙感圖像,因此無(wú)法適應(yīng)于無(wú)人機(jī)組網(wǎng)遙感影像的臨場(chǎng)快速處理。
SIFT算法是第一個(gè)通過(guò)穩(wěn)健的描述子將一定程度的不變量與尺度、旋轉(zhuǎn)、放射變換和光照聯(lián)系起來(lái)描述局部特征的方法[6]。它被認(rèn)為是計(jì)算機(jī)視覺(jué)研究的一個(gè)熱點(diǎn)[7-8],也具有計(jì)算密集的特征[9-10]。
本文的參考對(duì)象為Rob-hess 基于OpenCV(Open source Computer Vision library)和C語(yǔ)言編譯環(huán)境編寫(xiě)的通用SIFT算法程序。Rob-hess SIFT 算法實(shí)現(xiàn)特征點(diǎn)提取的主要過(guò)程如圖1所示。
圖1 Rob-hess SIFT算法的特征點(diǎn)提取流程Fig. 1 Feature point extraction flowchart by Rob-hess SIFT algorithm
德州儀器C66x系列DSP內(nèi)核硬件的組成如圖2所示。
圖2 C66x DSP內(nèi)核Fig. 2 C66x DSP kernel
主要數(shù)據(jù)計(jì)算模塊包括支持單精度浮點(diǎn)型數(shù)據(jù)運(yùn)算的硬件乘法器(Hardware Multiplier,MPY)、累加器和雙數(shù)據(jù)通道[11]。
為了充分發(fā)揮DSP 內(nèi)核計(jì)算性能,本文重新設(shè)計(jì)了SIFT算法的圖像數(shù)據(jù)結(jié)構(gòu)、軟件流水和動(dòng)態(tài)數(shù)據(jù)存儲(chǔ)。首先,重構(gòu)圖像數(shù)據(jù)結(jié)構(gòu)和圖像函數(shù)使得硬件乘法器可以直接參與單精度浮點(diǎn)型像素?cái)?shù)據(jù)的乘法計(jì)算;其次,采用軟件流水技術(shù)重新編排算法的循環(huán)計(jì)算,以增強(qiáng)算法計(jì)算的并行能力;最后,遷移算法產(chǎn)生的動(dòng)態(tài)數(shù)據(jù)至片外第三代雙倍速率同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器(Double Data Rate 3 synchronous dynamic random access memory,DDR3),以提升動(dòng)態(tài)數(shù)據(jù)的存儲(chǔ)空間。具體實(shí)現(xiàn)流程如圖3所示。
圖3 DSP平臺(tái)上SIFT算法的總體設(shè)計(jì)Fig. 3 Overall design of SIFT algorithm on DSP platform
硬件計(jì)算單元直接參與數(shù)學(xué)計(jì)算可以提升計(jì)算的速度。但是,原始SIFT 算法使用char 型地址空間存儲(chǔ)圖像像素?cái)?shù)據(jù),使得DSP 內(nèi)核的單精度浮點(diǎn)型硬件乘法器不能夠直接計(jì)算算法單精度浮點(diǎn)型像素?cái)?shù)據(jù)的乘法。
為了使DSP內(nèi)核的硬件乘法器能夠直接參與單精度浮點(diǎn)型像素?cái)?shù)據(jù)的乘法計(jì)算,需要根據(jù)硬件乘法器的輸入、輸出特性對(duì)圖像數(shù)據(jù)結(jié)構(gòu)和圖像函數(shù)進(jìn)行重構(gòu),具體實(shí)現(xiàn)流程如圖4所示。
1)IplImage圖像數(shù)據(jù)結(jié)構(gòu)的重構(gòu)。
在SIFT 算法原始IplImage 圖像數(shù)據(jù)結(jié)構(gòu)中,char 型、float型像素?cái)?shù)據(jù)都存儲(chǔ)于char*型指針imageData 指定的地址空間。一個(gè)char 型圖像像素?cái)?shù)據(jù)存儲(chǔ)于一個(gè)char 型存儲(chǔ)空間內(nèi),一個(gè)float 型像素?cái)?shù)據(jù)需要存儲(chǔ)于4 個(gè)char 型存儲(chǔ)空間內(nèi)。由于,DSP 內(nèi)核單精度浮點(diǎn)型硬件乘法器不能夠參與char 型存儲(chǔ)空間內(nèi)數(shù)據(jù)的計(jì)算,無(wú)法發(fā)揮DSP 優(yōu)良的單精度浮點(diǎn)型數(shù)據(jù)計(jì)算能力。
為了使單精度浮點(diǎn)型硬件乘法器可以直接計(jì)算SIFT 算法float 型像素?cái)?shù)據(jù)的乘法,本文對(duì)算法的IplImage 圖像數(shù)據(jù)結(jié)構(gòu)進(jìn)行重構(gòu)。
首先,在IplImage結(jié)構(gòu)中新增float*型指針imageData1,并使用該指針為float型像素?cái)?shù)據(jù)分配存儲(chǔ)空間;其次,在算法浮點(diǎn)運(yùn)算段啟用imageData1指針直接存儲(chǔ)像素點(diǎn)的float型像素?cái)?shù)據(jù),實(shí)現(xiàn)float 型像素?cái)?shù)據(jù)的存儲(chǔ)空間類(lèi)型由char 型轉(zhuǎn)變?yōu)閒loat 型;最后,對(duì)圖像浮點(diǎn)型像素?cái)?shù)據(jù)的計(jì)算過(guò)程進(jìn)行調(diào)整,并在編譯軟件中啟用硬件乘法器處理該型像素?cái)?shù)據(jù)的乘法計(jì)算。新IplImage 結(jié)構(gòu)中圖像單精度浮點(diǎn)型像素?cái)?shù)據(jù)訪問(wèn)形式如下。
新IplImage 結(jié)構(gòu)中圖像gray32 第row 行、第col 列像素點(diǎn)的浮點(diǎn)型像素?cái)?shù)據(jù)訪問(wèn)形式如式(1)所示:
float_val=*(gray32->imageData1+
gray32->widthstep?row+col) (1)
新IplImage 結(jié)構(gòu)中圖像gray32 第n 個(gè)浮點(diǎn)型像素?cái)?shù)據(jù)的訪問(wèn)形式如式(2)所示:
float_val=*(gray32->imageData1+n) (2)其中:gray32 為一個(gè)IplImage 型結(jié)構(gòu)體圖像的起始地址;row、col 和n 為被定義的int 型變量;gray32->widthstep 為gray32 圖像中每一行像素?cái)?shù)據(jù)存儲(chǔ)時(shí)占用的存儲(chǔ)空間;gray32->imageData1為新數(shù)據(jù)結(jié)構(gòu)中圖像單精度浮點(diǎn)型像素?cái)?shù)據(jù)的起始地址。
2)圖像函數(shù)的重構(gòu)。
原始SIFT 算法程序調(diào)用cvCreateImage 函數(shù)創(chuàng)建圖像結(jié)構(gòu)的首地址并根據(jù)圖像頭信息為結(jié)構(gòu)體的像素?cái)?shù)據(jù)分配適當(dāng)存儲(chǔ)空間。在圖像創(chuàng)建過(guò)程中,調(diào)用的子函數(shù)主要包括創(chuàng)建圖像頭信息的函數(shù)cvCreateImageHeader 和為像素?cái)?shù)據(jù)分配存儲(chǔ)空間的函數(shù)cvCreateData。
原始圖像像素?cái)?shù)據(jù)存儲(chǔ)空間的首地址由像素?cái)?shù)據(jù)空間分配函數(shù)cvCreateData 提供。為了使新增加的imageData1 指針能夠指向合法的存儲(chǔ)空間,需要對(duì)函數(shù)cvCreateData 進(jìn)行重構(gòu)。當(dāng)輸入的圖像像素?cái)?shù)據(jù)類(lèi)型為32 位float 型時(shí),函數(shù)cvCreateData 的子函數(shù)ialloc 開(kāi)始分配存儲(chǔ)空間并將返回的地址強(qiáng)制轉(zhuǎn)換為float*型;然后,將得到的float*型地址傳遞到指針imageData1。具體實(shí)現(xiàn)方式如式(3)所示:
img->imageData1=(float*)ialloc
((size_t)img->imageSize) (3)
其中:img->imageSize 為圖像像素?cái)?shù)據(jù)需要占據(jù)空間的大小(單位:字節(jié)),由圖像的行、列和像素點(diǎn)數(shù)據(jù)類(lèi)型決定;img->imageData1 為圖像img 的單精度浮點(diǎn)型像素?cái)?shù)據(jù)在新IplImage 結(jié)構(gòu)中存儲(chǔ)后返回的起始地址;iallco 為空間分配函數(shù),在完成空間分配后會(huì)返回void*型起始地址(該地址可以被強(qiáng)制轉(zhuǎn)換為其他類(lèi)型)。
2.3.1 編排設(shè)計(jì)
德州儀器C66x DSP 內(nèi)核具有8 路超長(zhǎng)指令字(Very Long Instruction Word,VLIW)、浮點(diǎn)數(shù)據(jù)路徑[12]和8 組單精度浮點(diǎn)型硬件乘法器,內(nèi)核主頻高達(dá)1.25 GHz(Giga Hertz),浮點(diǎn)性能高達(dá)20 GFLOP(Giga Floating-point Operations per Second)。由于,其指令集架構(gòu)(Instruction Set Architecture,ISA)是基于VLIW 架構(gòu),每個(gè)指令加載包的長(zhǎng)度為256 位[13]。因此,在C66x 內(nèi)核DSP 平臺(tái)上使用的單指令多數(shù)據(jù)流(Single Instruction Multiple Data,SIMD)指令可以同時(shí)執(zhí)行最多8 條32位指令。
使用軟件流水技術(shù)對(duì)算法程序重新進(jìn)行編排,使得編譯器可以更加均衡地使用芯片內(nèi)核的硬件資源;同時(shí),部分無(wú)關(guān)聯(lián)性指令的不同執(zhí)行階段可以被同時(shí)執(zhí)行,縮短各指令執(zhí)行時(shí)的等待間隔,可以更充分地發(fā)揮系統(tǒng)的并行計(jì)算能力。
軟件流水編排的實(shí)質(zhì)是:降低函數(shù)指針之間的關(guān)聯(lián)性以增強(qiáng)計(jì)算的并行性能;將算法的子函數(shù)內(nèi)嵌入主程序;對(duì)多層循環(huán)體進(jìn)行簡(jiǎn)化與展開(kāi);使用軟件流水技術(shù)將數(shù)據(jù)計(jì)算段編排到預(yù)設(shè)的pipeline 中;同時(shí),結(jié)合CCS(Code Composer Studio)5.5 集成開(kāi)發(fā)環(huán)境的DSP 軟件流水優(yōu)化功能,優(yōu)化流水編排的層級(jí),最大化使用硬件資源。采用四級(jí)流水編排前后的指令執(zhí)行情況如圖5所示。
圖5 指令執(zhí)行對(duì)比Fig. 5 Comparison of instruction execution
在圖5 中,指令甲、乙與指令1、2、3、4、5 為處理器的相同執(zhí)行指令。沒(méi)有進(jìn)行軟件流水編排時(shí),指令乙只能在指令甲完成寫(xiě)回操作后才可以得到執(zhí)行。對(duì)算法程序運(yùn)行重新編排后,程序中指令1 的寫(xiě)回、指令2 的執(zhí)行、指令3 的譯碼和指令4 的預(yù)取操作可以被同時(shí)執(zhí)行,縮短了指令的執(zhí)行間隔。該處為流水編排后循環(huán)核的開(kāi)始;指令2的寫(xiě)回、指令3的執(zhí)行、指令4 的譯碼、指令5 的預(yù)取也會(huì)同時(shí)執(zhí)行,為循環(huán)核的一部分;循環(huán)核左側(cè)部分為流水循環(huán)填充(pipeline loop prolog);循環(huán)核右側(cè)部分為流水循環(huán)排空(pipeline loop epilog)。圖5中,同樣的時(shí)鐘周期內(nèi),原始程序僅可以執(zhí)行甲、乙兩條完整指令,而流水編排后的程序可以執(zhí)行5 條完整指令,算法程序的計(jì)算速度得以提升。
流水編排的具體實(shí)現(xiàn)流程如圖6所示。
圖6 軟件流水編排流程Fig. 6 Flowchart of software pipeline arrangement
2.3.2 具體實(shí)現(xiàn)
為了減少計(jì)算過(guò)程中輸入、輸出數(shù)據(jù)指針的關(guān)聯(lián)性,在函數(shù)中使用restrict 和const 關(guān)鍵字以聲明函數(shù)非關(guān)聯(lián)性指針指向不同內(nèi)存塊。當(dāng)函數(shù)輸入、輸出指針存在關(guān)聯(lián)性且在計(jì)算獨(dú)立時(shí),需要對(duì)程序的輸出指針進(jìn)行調(diào)整;建立過(guò)渡內(nèi)存塊,并將輸出指針指向過(guò)渡區(qū)塊;完成計(jì)算后,再將過(guò)渡區(qū)塊的內(nèi)容拷貝到原始程序指定的內(nèi)存塊中。鄰近插值函數(shù)變化如下。
原始源代碼:
void resizeImg(IplImage*gray,IplImage*Big)
插入關(guān)鍵字后源代碼:
void resizeImg(const IplImage*gray,IplImage*Big)
以上源代碼中,gray 為輸入指針,Big 為輸出指針。在源代碼中使用const關(guān)鍵字以聲明輸入、輸出指針為非關(guān)聯(lián)性指針且指向不同的內(nèi)存塊。
由于含有子函數(shù)的循環(huán)體無(wú)法通過(guò)優(yōu)化器編排為一個(gè)pipeline。因此,需要將迭代計(jì)算調(diào)用的子函數(shù)內(nèi)嵌入主程序循環(huán)體內(nèi)。
此外,DSP 集成開(kāi)發(fā)環(huán)境的編譯器優(yōu)化循環(huán)計(jì)算時(shí),只在循環(huán)計(jì)算的內(nèi)層中形成一個(gè)pipeline。因此,需要對(duì)多重循環(huán)計(jì)算進(jìn)行簡(jiǎn)化和展開(kāi),使得計(jì)算可以更加充分地被編排入預(yù)設(shè)的pipeline。圖像歸一化的計(jì)算變化如下。
原始源代碼:
以上源代碼中,row3 和col3 是被定義的int 型變量;height1 和width1 為圖像的每列、行像素點(diǎn)數(shù)目;alpha 為一浮點(diǎn)數(shù);gray8->imageData 為歸一化前圖像像素?cái)?shù)據(jù)起始地址;gray->imageData1 為歸一化后圖像像素?cái)?shù)據(jù)起始地址。原始的算法計(jì)算程序只能將圖像每一行像素?cái)?shù)據(jù)的計(jì)算納入pipeline,而簡(jiǎn)化后的計(jì)算程序可以將圖像所有像素?cái)?shù)據(jù)的計(jì)算都納入pipeline,從而縮短了指令間等待時(shí)間。
軟件編譯器優(yōu)化設(shè)置可以改善軟件流水性能[14]。編譯器優(yōu)化選項(xiàng)使用如下:
1)啟用Assume no irregular alias or loop be-havior,以聲明程序中沒(méi)有使用alasing技術(shù)。
2)設(shè)置Optimization level 為3,即選擇-o3以進(jìn)行文件級(jí)別的優(yōu)化。
3)啟用Program mode compilation,即使能-pm 以配合-o3使算法實(shí)現(xiàn)程序級(jí)別優(yōu)化。
4)設(shè)置Specify call assumptions when opti-mizing 為3,選擇-op3以控制程序的優(yōu)化級(jí)。
5)設(shè)置Optimize for code size 為2,選擇-ms2 以縮小代碼的部分尺寸。
6)設(shè)置Generate optimizer information file at level 為2,選擇-on2以生成優(yōu)化信息文件。
SIFT 算法具有占用存儲(chǔ)空間大的特征,處理1 000×750彩色正射影像時(shí),主要內(nèi)存占用情況如圖7所示。分析圖7可知:SIFT 算法處理1000 × 750 彩色影像時(shí),構(gòu)建高斯差分金字塔過(guò)程中需要的存儲(chǔ)空間最大,約為168 MB;考慮到SIFT算法計(jì)算過(guò)程中的其他變量和特征點(diǎn)情況,處理1000 × 750彩色影像所需要的實(shí)際存儲(chǔ)空間應(yīng)大于168 MB。芯片內(nèi)部的SHRAM(shared memory)存儲(chǔ)空間為64 MB,不能夠滿足算法運(yùn)行過(guò)程中的存儲(chǔ)需求。
圖7 主要內(nèi)存分布Fig. 7 Main memory distribution
為了使DSP 平臺(tái)SIFT 算法可以處理1 000×750 彩色正射影像,需要將算法的動(dòng)態(tài)數(shù)據(jù)從芯片內(nèi)部的SHRAM 轉(zhuǎn)移至片外DDR3存儲(chǔ)器。由于原始DDR3存儲(chǔ)器內(nèi)各子存儲(chǔ)空間,也無(wú)法支持SIFT 算法的數(shù)據(jù)存儲(chǔ),因此需要將DDR3 存儲(chǔ)器中不連續(xù)的原始子存儲(chǔ)空間進(jìn)行合并,以拓展存儲(chǔ)器中的連續(xù)存儲(chǔ)空間。
為了完成上述的存儲(chǔ)遷移,需要調(diào)整存放鏈接器的配置信息CMD(算法工程中后綴為.cmd)文件。具體調(diào)整細(xì)節(jié)為:根據(jù)平臺(tái)板載存儲(chǔ)空間重新編寫(xiě)CMD 文件中的SECTIONS(目標(biāo)存儲(chǔ)器模型段)和MEMORY(硬件資源描述段)。
1)CMD文件的SECTIONS編寫(xiě)。
德州儀器C66x DSP 內(nèi)核的片內(nèi)內(nèi)存與CPU 保持相同的時(shí)鐘頻率。但是,片內(nèi)存儲(chǔ)空間過(guò)小,不適應(yīng)大量數(shù)據(jù)的存放。在本文研究的過(guò)程中,使用DSP 平臺(tái)搭載的DDR3 存儲(chǔ)器存儲(chǔ)SIFT 算法計(jì)算產(chǎn)生的動(dòng)態(tài)數(shù)據(jù),改變動(dòng)態(tài)數(shù)據(jù)存儲(chǔ)空間的具體方式如下。
在新創(chuàng)建圖像結(jié)構(gòu)體分配內(nèi)存時(shí),直接采用了ialloc 函數(shù),同時(shí),需要調(diào)整CMD 文件中SECTIONS(目標(biāo)存儲(chǔ)器模型段)的描述代碼,詳細(xì)源代碼變化如下。
原始CMD文件中動(dòng)態(tài)內(nèi)存的存儲(chǔ)器模型描述源代碼:
.sysmem >SHRAM
重新編寫(xiě)CMD 文件中動(dòng)態(tài)內(nèi)存的存儲(chǔ)器模型描述源代碼:
.sysmem >DDR3
2)CMD文件的MEMORY編寫(xiě)。
CMD 文件的MEMORY 代碼段用于描述系統(tǒng)實(shí)際硬件資源配置。為了充分使用DDR3 存儲(chǔ)器的存儲(chǔ)空間,需要將存儲(chǔ)器內(nèi)不連續(xù)的硬件描述區(qū)域合并為一個(gè)以DDR3 為名稱(chēng)的連續(xù)存儲(chǔ)空間,具體的硬件描述源代碼變換如下。
原始DDR3存儲(chǔ)器地址空間的硬件描述源代碼:
DDR3:origin=0x80000000 length=0x10000000
DDR3A:origin=0x90000000 length=0x10000000
DDR3B:origin=0xA0000000 length=0x10000000
合并后DDR3存儲(chǔ)器地址空間的硬件描述源代碼:
DDR3:origin=0x80000000 length=0x7FFFFFFF
在以上代碼中,DDR3、DDR3A、DDR3B 分別為DDR3 存儲(chǔ)器內(nèi)子存儲(chǔ)空間的名稱(chēng);origin 表示該子存儲(chǔ)空間的起始地址;length 表示該子存儲(chǔ)空間的有效長(zhǎng)度;DSP 平臺(tái)實(shí)際搭載的DDR3 存儲(chǔ)器起始地址為0x80000000,有效長(zhǎng)度為0x7FFFFFFF(容量為2 GB),該容量遠(yuǎn)大于SHRAM 內(nèi)64 MB存儲(chǔ)空間。
通過(guò)重新編寫(xiě)CMD 文件SECTIONS 和MEMORY,將DSP硬件平臺(tái)DDR3 存儲(chǔ)器內(nèi)不連續(xù)的存儲(chǔ)空間轉(zhuǎn)變?yōu)檫B續(xù)的存儲(chǔ)空間,并將SIFT 算法的動(dòng)態(tài)數(shù)據(jù)遷移至該段連續(xù)的存儲(chǔ)空間內(nèi),為算法處理較大尺寸的圖像打下了基礎(chǔ)。
根據(jù)上述方案,選擇德州儀器66AKH12 處理器作為DSP硬件平臺(tái)主處理器,平臺(tái)如圖8 所示。66AKH12 是基于KeyStone Ⅱ架構(gòu)的高性能處理器,主處理器內(nèi)部集成了8 核的C66x 內(nèi)核組和4 核的ARM(Advanced RISC Machine)A15內(nèi)核組[15]。XDS(Extended Debugging Simulator)200mini 模塊為仿真器;MiniUSB(Universal Serial Bus)接口固定在仿真器上,用于與外部連接。
圖8 DSP測(cè)試平臺(tái)Fig. 8 DSP test platform
在實(shí)驗(yàn)中,設(shè)置C66x 內(nèi)核組的0 核作為處理器核,配置DSP 的時(shí)鐘頻率為1.2 GHz。測(cè)試平臺(tái)通過(guò)硬件Board to Board 連接器連接至XDS200mini 模塊,并使用MiniUSB 電纜將XDS200mini 連接至PC。PC 平臺(tái)的CCS 5.5 軟件集成開(kāi)發(fā)環(huán)境用于程序的調(diào)試、加載和中斷等。運(yùn)行設(shè)計(jì)如圖9 所示。測(cè)試圖像為一無(wú)人機(jī)遙感任務(wù)采集的正射彩色影像,原始影像尺寸為1 000 × 750,如圖10所示。
圖9 硬件運(yùn)行設(shè)計(jì)Fig. 9 Hardware running design
圖10 測(cè)試圖像Fig. 10 Test image
1)算法精度分析。
DSP為32位處理器,原始SIFT算法程序的處理平臺(tái)為64位處理器。由于,32位處理器與64位處理器數(shù)據(jù)總線位數(shù)的不同,在數(shù)據(jù)長(zhǎng)度為64 位double 型數(shù)據(jù)的計(jì)算過(guò)程中會(huì)產(chǎn)生相應(yīng)的計(jì)算誤差;而且,在不修改計(jì)算數(shù)據(jù)的數(shù)據(jù)類(lèi)型時(shí),該部分的計(jì)算誤差會(huì)一直存在。由于在構(gòu)建高斯尺度空間的計(jì)算過(guò)程中進(jìn)行了大量的double 型數(shù)據(jù)的乘法、加法和減法迭代計(jì)算,因此DSP 平臺(tái)SIFT 算法程序與原始SIFT 程序所提取特征點(diǎn)坐標(biāo)、尺度、方向的小數(shù)部分和128 維特征描述子也會(huì)存在相應(yīng)的差異。不同平臺(tái)SIFT 算法的實(shí)際處理情況如圖11所示。
圖11 不同平臺(tái)的特征點(diǎn)處理結(jié)果Fig. 11 Processing results of feature points on different platforms
圖11 中A、B 列分別為DSP 平臺(tái)SIFT 算法程序和原始SIFT 算法程序提取的特征點(diǎn)信息,C 列為DSP 平臺(tái)SIFT 算法程序提取的特征點(diǎn)數(shù)據(jù)與原始算法提取數(shù)據(jù)之差。在A、B列中feat1 為1 000×750 測(cè)試圖像(如圖10 所示)的名字。x、y 為提取特征點(diǎn)的坐標(biāo)信息,scl 為特征點(diǎn)的尺度,ori 為特征點(diǎn)的方向角,ii 為特征點(diǎn)的編號(hào);從第8 行到第135 行數(shù)據(jù)為特征點(diǎn)0 的128 維特征描述子;分析C 列可以發(fā)現(xiàn),算法在不同平臺(tái)上提取特征點(diǎn)0 的描述子信息誤差為0,特征點(diǎn)0 坐標(biāo)、尺度的小數(shù)部分存在細(xì)小的誤差(此誤差由處理器之間硬件差異造成)。由于EXCLE 表格中第2 行到第7 行的特征信息數(shù)據(jù)不是單一數(shù)值,因此,在進(jìn)行不同平臺(tái)特征點(diǎn)信息逐差計(jì)算的過(guò)程中,此處系統(tǒng)自動(dòng)使用“#VALUE!”以表示“引用單元格錯(cuò)誤”。由于圖11 無(wú)法展示全體特征點(diǎn)的特征信息,因此使用表1對(duì)該信息進(jìn)行統(tǒng)計(jì)。
表1 特征點(diǎn)信息(1000 × 750)Tab. 1 Information of feature points(1000 × 750)
分析表1 可以發(fā)現(xiàn),處理測(cè)試的1000 × 750 圖像時(shí),本研究的DSP 平臺(tái)SIFT 算法程序與原始算法程序的處理結(jié)果保持高度一致:兩個(gè)平臺(tái)提取的特征點(diǎn)數(shù)量和特征點(diǎn)坐標(biāo)信息保持一致,在3 324 個(gè)相同坐標(biāo)特征點(diǎn)所對(duì)應(yīng)的特征描述子中,相同描述子比例的高達(dá)99.97%;可見(jiàn)DSP 平臺(tái)SIFT 算法程序?qū)D像特征點(diǎn)的識(shí)別、描述能力與原始算法程序基本保持一致。由于使用特征點(diǎn)信息進(jìn)行圖像匹配時(shí),處理過(guò)程對(duì)圖像特征點(diǎn)的坐標(biāo)、尺度、方向角和128 維特征描述子的誤差要求遠(yuǎn)大于本研究算法程序的提取誤差,因此,該算法程序完全滿足臨場(chǎng)實(shí)時(shí)快速處理無(wú)人機(jī)組網(wǎng)遙感影像的精度需求。
2)耗時(shí)分析。
DSP 平臺(tái)SIFT 算法的運(yùn)行時(shí)間由CCS 5.5 軟件自帶Count Event模塊統(tǒng)計(jì)。詳細(xì)實(shí)驗(yàn)結(jié)果如圖12所示。
圖12 DSP平臺(tái)運(yùn)行的SIFT算法Fig. 12 SIFT algorithm running on DSP platform
實(shí)驗(yàn)中,處理器為C66x 內(nèi)核組的0 核,主頻為1.2 GHz。當(dāng)程序運(yùn)行至圖12 第42 行時(shí),受到間斷點(diǎn)的限制,板載仿真在此處暫停;此時(shí),Count Event模塊統(tǒng)計(jì)的時(shí)鐘顯示圖像預(yù)處理耗時(shí),此處耗時(shí)不計(jì)入SIFT 算法的總耗時(shí)。點(diǎn)擊繼續(xù)運(yùn)行后,Count Event 模塊自動(dòng)清零并開(kāi)始重新統(tǒng)計(jì)CPU 運(yùn)行時(shí)鐘數(shù)據(jù),SIFT 算法程序開(kāi)始被執(zhí)行;當(dāng)程序運(yùn)行至第46行時(shí),板載仿真進(jìn)入暫停,此時(shí)Count Event 模塊統(tǒng)計(jì)的時(shí)鐘顯示SIFT算法處理1000 × 750 影像所消耗的CPU 時(shí)鐘數(shù)據(jù)。由圖12分析可得,在特征點(diǎn)提取過(guò)程中,DSP平臺(tái)SIFT算法程序共消耗2 525 842 766 個(gè)CPU 時(shí)鐘周期,約為2.53 GHz。結(jié)合DSP主頻配置和表1 分析可得:在確保提取到高質(zhì)量特征點(diǎn)坐標(biāo)、尺度、方向和特征描述子前提下,DSP 平臺(tái)的0 核運(yùn)行本文的SIFT 算法程序處理測(cè)試的1000 × 750圖像需要運(yùn)行2.108 s,滿足在單核處理器平臺(tái)上臨場(chǎng)實(shí)時(shí)快速處理無(wú)人機(jī)組網(wǎng)遙感影像的時(shí)間要求。
本文基于DSP平臺(tái)的軟硬件資源實(shí)現(xiàn)了具有完整功能的Rob-hess SIFT算法。通過(guò)對(duì)圖像數(shù)據(jù)結(jié)構(gòu)、圖像函數(shù)的重構(gòu)、軟件流水的重新編排和動(dòng)態(tài)數(shù)據(jù)存儲(chǔ)空間的遷移,實(shí)現(xiàn)了對(duì)大尺寸無(wú)人機(jī)遙感圖像的高精度快速處理。實(shí)驗(yàn)結(jié)果表明,本文算法的精度、運(yùn)行耗時(shí)和處理圖像的尺寸滿足臨場(chǎng)處理需求。
下一步,可以對(duì)數(shù)據(jù)的輸入輸出接口進(jìn)行深入設(shè)計(jì),實(shí)現(xiàn)無(wú)人機(jī)遙感影像數(shù)據(jù)在PC 和DSP 間的快速交互。同時(shí),在DSP 開(kāi)發(fā)的過(guò)程中,進(jìn)行多任務(wù)調(diào)度實(shí)現(xiàn)可以進(jìn)一步提升處理速度。