龐巧遇,鄧寶松,桂健鈞,鹿 迎
(軍事科學院 國防科技創新研究院,北京 100071)
針對室外大場景的三維重建,大多采用基于幾何信息來恢復相機參數的SFM(Structure from motion)算法[1]。Yasutaka Fumkawa實現了一種精確、魯棒的稠密重建方法PMVS[2]。Newcombe提出了一種基于體素的三維稠密點云重建方法[3],但是重建精度受體素網格的分辨率限制。StereoScan提出流水線方式[4],重建結果存在許多噪點。吳常常實現的VisualSFM算法是較為完善的重建算法[5]。Schonberger等提出的方法在重建精度和完整性上做出了一些改進,其缺點是深度圖估計速度過慢[6]。Moulon等提出openMVG算法[7],缺少構建稠密點云部分,需要結合openMVS[8]。Shan等實現了對大規模圖片進行三維重建的系統,但消耗的資源很多[9]。
隨著CPU多核處理與GPU技術的出現,圖像并行處理也得到迅速發展。在CPU并行處理方面,Cadena L等應用了并行處理方式對醫學圖像進行增強[10]。Indragandhi K等引入了圖像并行處理策略,提升了程序的性能[11]。Spiliotis IM等采用并行處理機制來處理圖像塊,提升了算法效率[12]。在GPU并行圖像處理方面,Davidson RL等采用GPU并行處理技術加速了空間應用中的圖像處理[13]。Civerchia F等在機器人的圖像識別中使用了GPU并行計算[14]。
本文基于CPU與GPU兩種架構在三維重建的兩個執行階段引入并行加速處理,旨在提升整體三維重建的速度。本文方法采用OpenMP多線程處理機制,首先對圖像進行尺度優化,提取圖像中的GPS信息,獲取鄰接信息;再使用SIFTGPU算法并行提取圖像中的特征點,只對相鄰的圖片進行特征匹配,以減少匹配時間;最后,通過全局式SFM得到場景的稀疏點云。
本文工作主要分為兩個模塊:無人機圖像處理模塊和稀疏點云構建模塊。整體流程如圖1所示。

圖1 系統處理流程
在無人機圖像處理模塊中,首先采用OpenMP多線程處理機制,以并行方式對無人機航拍圖像進行尺度優化,對航拍圖像進行降采樣,方便后續步驟對其進行處理。然后,利用OpenMP多線程處理機制,并行提取無人機航拍圖像中的GPS信息,根據空間位置確定圖像之間的鄰接關系,對圖像進行排序。最后,該模塊的輸出信息是按照經緯度由小到大順序排列的無人機航拍圖像,以及航拍圖像中對應的GPS信息。
在稀疏點云構建模塊中,以排列有序的無人機航拍圖像和圖像中的GPS信息作為輸入,利用SIFTGPU算法并行提取圖像特征。將圖像中的GPS信息作為先驗信息,只對相鄰的圖像進行特征匹配。采用RANSAC(random sample consensus)算法來剔除誤匹配點[15]。根據全局式SFM,建立局部圖像和全局圖像的旋轉和平移矩陣,從而估算相機位姿和場景三維坐標,得到場景的稀疏點云。
本文的研究重點是無人機圖像加載處理部分以及SFITGPU特征提取部分,這也是三維重建最為關鍵的兩個環節,下面對這兩部分算法進行詳細介紹。
原始的無人機航拍圖像尺度都非常大,其像素大小為5184 px×3888 px,文件大小為20 MB。利用無人機航拍圖像對野外場景進行三維重建,需要對原始圖像進行預處理,主要包括兩個環節:①通過降采樣優化圖像大小;②利用無人機航拍圖像中的GPS信息,獲得圖像之間的鄰接關系。
在對無人機航拍圖像進行尺度優化與GPS信息提取的同時,通過預處理算法對航拍圖像進行空間拓撲分析。圖像預處理算法運行主要消耗CPU計算資源,這一過程是單線重復的。本研究方法采用OpenMP多線程處理機制,充分發揮多核CPU的計算性能,對航拍圖像進行并行處理以提升圖像的處理速度。
OpenMP是由計算機軟件及硬件廠商共同制定的應用程序編程接口(application programming interface,API),是一種用于共享內存系統的編程模型[16]。OpenMP的體系架構如圖2所示,主要包括3部分,分別是:編譯指令(Compiler Directive)、環境變量(Environment Variables)以及運行庫函數(Runtime Library Functions)。編譯指令包含指令(directive)和子句列表(clause list),指令控制并行執行的代碼區域和線程數量,字句列表控制變量在每個線程中的作用域。編譯器通過編譯指令將串行執行的程序轉化為并行執行的程序。環境變量中包含一些控制命令,控制程序并行執行。運行庫函數能夠獲取OpenMP中每個線程的信息,以及變量在每個線程中的屬性,進而在編譯階段,將程序進行并行化處理。

圖2 OpenMP體系架構
OpenMP的執行過程如圖3所示,采用Fork-Join執行模式。從一個串行執行的單線程程序開始,將其作為主線程,在執行并行處理程序時,主線程進行Fork操作,創建多個新的線程來執行并行區域中的程序。并行區域中的每個線程獨立執行,不會相互影響。當每個線程執行完成后,各個線程進行Join操作,又重新回到串行執行的主線程。

圖3 Fork-Join 執行模式
本文研究的無人機航拍圖像處理流程如圖4所示,采用OpenMP多線程處理機制,并行處理航拍圖像,這里設置的線程數量為8。首先,以并行方式對圖像尺度進行優化,通過降采樣,將原始像素為5184 px×3888 px的航拍圖像大幅縮小,即將圖像像素大小調整為1250 px×1000 px。然后,再通過OpenMP多線程處理機制,并行提取圖像的GPS信息。最后根據圖像中的GPS信息,確定圖像之間的鄰接關系,按照經緯度由小到大的順序對所有圖像進行空間排序,為三維重建后續步驟做好鋪墊。

圖4 無人機航拍圖像處理流程
基于CPU的無人機影像并行處理算法的偽代碼如算法1所示。首先,通過pragma omp parallel將圖像處理程序設定為并行處理,threadcount表示線程數量,其值為8。Num表示圖像數量,newW為原始圖像的寬除以寬的縮小比例,newH為原始圖像的長除以長的縮小比例,inter設置為CV_INTER_AREA,表示輸出圖像的寬和高都不大于輸入圖像的寬和高。通過exifReader->GPSLatitude函數讀取圖像EXIF中的緯度,exifReader->GPSLongitude函數讀取圖像EXIF中的經度。最后,根據圖像中的經緯度,采用sort函數,按照經度由小到大,如果經度相同按照緯度由小到大的順序對圖像進行排序。
算法1:基于CPU的無人機影像并行處理
輸入:原始的無人機航拍圖像
輸出:按經緯度由小到大順序排列的航拍圖像
#pragma omp parallel for num_threads(threadcount)
newW ← img.cols / width_scale
newH ← img.rows / height_scale
inter ← CV_INTER_AREA
resize(img, Size(newW, newH),inter)
img.lat ← exifReader->GPSLatitude(img)
img.lon ← exifReader->GPSLongitude(img)
end for
bool cmp(Image a, Image b)
if a.lat != b.lat
return a. lat < b. lat
else
return a.lon < b.lon
sort(img, img + Num, cmp)
采用OpenMP多線程處理機制來處理無人機航拍圖像,能夠使系統架構更清晰明了;通過編譯指令對串行程序進行并行化,也能夠加快程序的運行速度。此外,OpenMP多線程機制具有很強的靈活性,可以十分容易適配不同計算單元中的并行系統配置。該機制能夠很好平衡線程粒度與系統負載之間的關系,使得線程個數與計算單元的處理器核數相匹配,從而充分發揮多核處理器的并行能力,提升無人機航拍圖像的處理速度,進而提高三維重建的執行效率。
無人機飛行高度較低,拍攝的場景圖像尺度較大,并且內容豐富,在特征提取階段,單張圖像的特征提取往往耗時較長。本文基于改進的SIFTGPU算法,在GPU上以并行方式對無人機航拍圖像進行特征提取。在處理圖像過程中,首先將初始圖像上傳至GPU全局內存中,再綁定紋理內存,對其進行專門的紋理緩存讀、寫操作。本文采用的紋理緩存機制,對二維空間的局部性訪問進行了優化,所以通過紋理緩存訪問的二維矩陣會獲得加速效果。此外,紋理緩存不需要滿足全局內存的合并訪問條件,從而在隨機存取的環境下保持了較高的運算性能。
本文采用的SIFTGPU特征提取流程如圖5所示,首先利用高斯核函數對圖像進行卷積,創建不同尺度的圖像,建立圖像的尺度空間;再對不同尺度的圖像進行特征點檢測,提取圖像中的特征點;通過計算關鍵點鄰域中點的梯度直方圖,選擇梯度最大的點的方向,作為該特征點的主方向;將特征點鄰域中所有像素點的梯度作為特征向量,形成特征描述子。

圖5 SIFTGPU特征提取流程
SIFTGPU特征提取算法的偽代碼如算法2所示。首先對圖像進行顏色空間的轉換,將RGB圖像轉換為灰度圖像。再構建圖像金字塔,first_octave表示圖像金字塔的第一層,num_octaves為圖像金字塔的層數,num_scales為金字塔每一層的圖像縮放尺度。Num為圖像的數量,w為圖像的寬,h為圖像的高。通過sift_new函數進行關鍵點檢測,并獲取關鍵點keys,以及關鍵點數量nkeys。計算每一個關鍵點的方向angles,對于關鍵點每個方向上的特征feature,計算出相應的描述子descriptor。feature中存儲的是關鍵點的位置、尺度和方向,descriptor存儲的是歸一化后的128維特征向量。最后,將特征點feature與對應的描述子descriptor導出到sFeat,sDesc文件中。
算法2:SIFTGPU特征提取
輸入:無人機航拍圖像
輸出:圖像特征點與描述子文件
first_octave ← 0, octaves ← num_octaves
scales ← num_scales
cvtColor(image, img,CV_RGB2GRAY)
w ← img.cols, h ← img.rows
filt ← sift_new(w,h,octaves,scales,first_octave)
keys ← get_keypoints(filt)
nkeys ← get_nkeypoints(filt)
angles[n] ← {0}
for(k=1: nkeys)
nangles←keypoint_orientation(filt,angles,keys+k)
descriptor ←keypoint_descriptor(filt,keys+k, angles[q])
feature ←fp(keys[k].x, keys[k].y,keys[k].sigma, angles[q])
end for
end for
end for
sFeat ← feature
sDesc ← descriptor
本文所采用的SIFTGPU算法構建圖像尺度空間的計算過程如下:
將原始圖像I(x,y) 與一個可變尺度的二維高斯核函數G(xi,yi,σ) 進行卷積運算,得到圖像的尺度空間L(x,y,σ)。
高斯核函數為
(1)
式中:參數σ為高斯平滑因子。
圖像的尺度空間為
L(x,y,σ)=G(xi,yi,σ)*I(x,y)
(2)
采用高斯核函數主要有兩個原因:①高斯核函數是唯一的尺度不變核函數;②高斯核函數計算過程簡單,執行效率高,并且提取的特征具有很好的魯棒性。
SIFTGPU[17]算法中不僅使用不同尺度的高斯核函數進行濾波,還引入高斯金字塔,對圖像向下采樣,逐步降低圖像的分辨率,形成一系列以金字塔形狀排列的圖像,這使得圖像具有更高的尺度分辨率。并且,每組圖像中包含多層圖像,使得相鄰尺度的變化比較平滑。在同一組內,不同層圖像的尺寸是一樣的,后一層圖像的高斯平滑因子σ是前一層圖像平滑因子的k倍。
如果不使用圖像高斯金字塔[18],只在原始分辨率的圖像上采用不同的高斯核函數進行多尺度檢測,那么在提取粗尺度特征時,會產生很大計算量,造成資源浪費。因為在保持圖像原始分辨率不變的情況下,提取粗尺度特征需要高斯核函數的方差較大,相應的濾波窗口也較大,計算量會激增,而圖像在大尺度上比較模糊,就沒有必要保持圖像的原始分辨率,通過構建圖像的高斯金字塔,可以高效提取不同尺度的特征。
基于SIFTGPU算法對圖像進行特征提取的過程中,并不是所有步驟都在GPU中運行,而是為每個步驟選取最合適的運行方式,充分發揮CPU+GPU架構優越性能。在SIFTGPU算法中,構建圖像的尺度空間、生成圖像高斯金字塔、建立特征點方向直方圖、計算主方向等步驟利用GPU進行加速;而圖像的顏色空間轉換、描述子特征向量的歸一化等步驟則使用CPU多核并行效率更高。
通過本文SIFTGPU算法對圖像進行特征提取,不僅能夠快速得到圖像的特征,而且得到的SIFT特征具有很好的區分性。SIFT特征對旋轉、尺度縮放、亮度變化具有不變性,并且對視角變化、仿射變換、噪聲也保持一定程度的穩定性。此外,SIFTGPU算法具有很好的適配性,能夠同時兼容Intel集顯、ATI和NVIDIA獨顯。這樣在具有不同顯卡配置的計算單元上都能夠運行SIFTGPU算法,通過GPU加速,并行提取圖像中的特征,進而提升三維重建速度。
為了評價本文提出的無人機影像并行圖像處理與特征提取算法,利用無人機在室外按照規劃的路徑進行拍攝,對航拍圖像進行測試。實驗環境見表1,中央處理器為AMD Ryzen Threadripper 2990 WX 32-Core @ 3.00 GHz,內存16 G,圖形處理器為NVIDIA GeForce RTX 2070(8 G),操作系統為Windows10,編程語言為C++。

表1 計算機配置
通過四旋翼無人機拍攝圖像,云臺相機為索尼DSC-QX30U,相機分辨率2000萬像素,照片大小為5184 px×3888 px,圖像數量為30,對航拍圖像進行三維場景重建。在無人機圖像處理,特征提取的速度與特征點數量,以及稀疏點云的重建效果等方面,將本文提出的方法與開源算法openMVG、colmap進行了比較。
針對無人機影像的圖像處理,將本文方法與openMVG、colmap開源算法進行了性能對比。見表2,對不同數量的航拍圖像,分別從圖像的尺度優化、提取圖像中的GPS信息以及整體運行時間這3個方面進行了對比,來測試這3種方法的性能。

表2 無人機影像并行處理性能
根據實驗結果,在對無人機影像尺度優化方面,本文方法的運行時間平均比openMVG的運行時間快了2.14倍,比colmap的運行時間快了2.41倍;在提取無人機影像GPS信息方面,本文方法的運行時間平均比openMVG的運行時間快3.22倍,比colmap的運行時間快了3.87倍;在整體運行時間方面,本文方法的運行時間平均比openMVG的運行時間快2.14倍,比colmap的運行時間快了2.41倍。
根據表2中的數據繪制了時間對比圖,如圖6所示。隨著圖像數量的不斷增加,本文方法的運行速度明顯快于openMVG和colmap方法,并且時間上升趨勢緩于openMVG和colmap方法。與openMVG、colmap方法相比,本文方法有更高的圖像處理性能。

圖6 算法時間對比
從實驗結果中可以看出,針對無人機影像的圖像處理,本文采用OpenMP并行處理機制,將圖像處理任務分配到各個不同的核進行并行計算,充分利用了處理器硬件方面的性能資源,發揮了多核CPU的架構優勢。圖像預處理算法主要消耗CPU計算資源,并且圖像處理過程是單一重復的,基于CPU的并行處理策略,能夠大幅提升圖像處理速度。本文研究在圖像的尺度優化與提取GPS信息兩個階段,利用了OpenMP多線程處理機制,提升了圖像的處理速度,為三維重建的后續環節節省了時間。
在無人機影像的特征提取方面,將本文方法與openMVG、colmap開源算法進行了性能對比。如表3所示,對不同數量的航拍圖像,在確保特征質量的前提下,分別從圖像的特征點數量與提取時間這兩個維度,比較3種算法的性能指標。

表3 無人機影像特征提取性能比較
結果表明,在特征點提取數量方面,本文方法大約是openMVG的4倍,是colmap的3倍,并且其特征描述子均符合閾值要求;在特征提取消耗時間方面,本文方法大約比openMVG快11倍,比colmap快13倍。
表3給出了特征點數量與處理時間的對比,其結果如圖7所示。從中可以看出,隨著圖像數量的增加,本文方法提取的特征點數量明顯優于openMVG和colmap方法,但所用時間更少。

圖7 特征點數量與時間對比
本文方法采用了SIFTGPU算法進行特征提取,通過GPU的并行加速,在提高特征點提取速度的同時,特征點數量也得到了很大的提升,從而為三維重建后續環節奠定了堅實的基礎。
本文改進的SIFTGPU算法,在圖像特征提取過程中,采用CPU+GPU的混合架構方式。如表4所示,這里對SIFTGPU算法的重要步驟,通過不同數量的航拍圖像,在處理性能上進行實驗分析。并繪制時間對比圖,如圖8所示。

表4 SIFTGPU算法各個任務階段在GPU與CPU中的處理性能

圖8 SIFTGPU算法各任務階段運行時間對比
圖8(a)中,計算特征點方向、計算特征點描述子等計算量大的步驟在GPU中運行。圖8(b)中,圖像顏色空間轉換、描述子特征向量歸一化等計算量小的步驟在CPU中運行。結果表明,運算量大的步驟通過GPU加速,提升運算效率;而運算量小的步驟在CPU中的運行,其消耗的時間不多,并節省了GPU的計算資源。采用這種GPU與CPU相結合的方式,充分發揮了系統性能,大幅縮短了特征提取時間。
圖9對這3種方法的特征提取效果進行了比較,圖9(a) 是openMVG方法對航拍圖像進行特征提取的效果圖;圖9(b)是colmap方法對航拍圖像進行特征提取的效果圖;圖9(c)是本文方法對航拍圖像進行特征提取的效果圖。通過這些圖像的對比,可以明顯看出本文方法提取的特征更加稠密,提取效果明顯優于openMVG和colmap方法。

圖9 特征點提取效果
為了驗證本文方法提取特征點的準確性,將航拍圖像進行變換,再對變換后的圖像進行特征匹配。由于SIFT特征對旋轉、尺度縮放具有不變性,這里對航拍圖像進行了縮小、上下翻轉。如圖10所示,將尺度變換后的圖像與原始圖像進行特征匹配,相同的特征點采用直線連接。從結果中可以看出,無論是圖像縮小,還是圖像翻轉,特征匹配的連接線依然能夠準確連接圖像中的特征點,并且十分稠密,表明本文方法提取的特征點具有準確性。

圖10 特征匹配效果
本文采用全局式SFM,構建場景的三維點云。通過相鄰圖像對之間的特征匹配,計算出所有圖像對之間相機的旋轉與平移,再進行三角測量,計算場景的初始結構。最后,通過光束法平差優化相機位姿和空間物體三維坐標,并剔除異常值,最終得到整個場景的稀疏點云。在全局式SFM重建過程中,先計算所有圖像對之間的相對旋轉,再計算了全局旋轉。在整個三維重建的最后,通過光束法平差,來優化相機位姿和場景點的3D坐標。
如圖11所示,基于完整流程,分別對5張、10張以及20張航拍圖像進行三維重建,將本文方法與openMVG、colmap算法的稀疏點云重建效果進行對比。圖11(a)、圖11(d)、圖11(g)是openMVG的三維重建結果,圖11(b)、圖11(e)、圖11(h)是colmap的三維重建結果,圖11(c)、圖11(f)、圖11(i)是本文方法的三維重建結果。從圖中可以明顯看出,本文方法重建的稀疏點云更密集,結構更清楚,甚至可以清晰地看到場景輪廓。

圖11 三維場景稀疏點云
通過以上實驗的對比分析,采用SIFTGPU算法對無人機影像進行特征提取,能夠提取更多的特征點,同時利用GPU進行加速,極大地提高了算法效率。依據本文方法提取的特征點進行完整點云三維重建,構建的三維場景更加稠密,取得了良好的重建效果。
實驗結果表明,本文提出的無人機影像并行圖像處理與特征提取算法大大提高了計算速度,三維重建結果明顯優于傳統方法。通過引入OpenMP多線程處理機制與SIFTGPU特征提取算法,不僅提高了三維重建的速度,解決時效性差的問題,而且提升了三維重建的算法性能,使得室外大場景的三維重建效果得到了顯著的增強。該算法已經在實際任務中得到了應用,還可推廣應用于搶險救災、應急測繪和安全管控等領域的快速三維重建場景,提升數據獲取的效率。在未來,我們將進一步改進算法架構,降低對計算單元的要求,設計輕量化的三維重建算法,將其推廣至其它相關領域。此外,在多架無人機上進行在線協同三維重建也是未來的研究方向。