王逸濠 趙雪磊 魏子哲 張曉斌 徐永安
(揚(yáng)州大學(xué),江蘇揚(yáng)州,225009)
隨著地鐵在國(guó)民經(jīng)濟(jì)中所起的作用越來(lái)越大,許多發(fā)展中國(guó)家都在大力發(fā)展地鐵交通。在地鐵施工、運(yùn)營(yíng)過(guò)程中,地鐵隧道的混凝土預(yù)制件結(jié)構(gòu)面的存在對(duì)隧道安全有著重要影響,在地鐵的建設(shè)和運(yùn)營(yíng)過(guò)程中,為了評(píng)估隧道混凝土預(yù)制件穩(wěn)定性和地質(zhì)災(zāi)害防治,需要檢測(cè)并獲取混凝土預(yù)制件結(jié)構(gòu)面數(shù)量、幾何形狀等參數(shù)。目前,獲取地鐵隧道混凝土預(yù)制件結(jié)構(gòu)面信息以人工現(xiàn)場(chǎng)測(cè)量為主導(dǎo),這種測(cè)量方式勞動(dòng)強(qiáng)度大、檢測(cè)效率低,難以滿足快速測(cè)量要求。
在工業(yè)產(chǎn)品設(shè)計(jì)、制造過(guò)程中,非接觸式表面測(cè)量技術(shù)應(yīng)用很多,在數(shù)控加工、質(zhì)量控制與檢測(cè)等領(lǐng)域起到了至關(guān)重要的作用[1-2]。近年,隨著非接觸測(cè)量技術(shù)發(fā)展取得進(jìn)展,國(guó)內(nèi)外研究人員在高陡邊坡的巖體結(jié)構(gòu)面調(diào)查方面,開始嘗試攝影測(cè)量和激光測(cè)量等技術(shù),并取得了一定成果[3-5]。其中,劉昌軍等人將該技術(shù)拓展應(yīng)用于隧洞的巖體結(jié)構(gòu)面檢測(cè)上,取得了一定成果[4]。攝影測(cè)量方法需要一定的可見光強(qiáng)度,但是隧道內(nèi)部往往存在可見光不足的問題。相較于攝影測(cè)量而言,激光測(cè)量方法不受到可見光的影響,因此在隧洞檢測(cè)中得到廣泛應(yīng)用。
然而,激光和攝影等非接觸測(cè)量技術(shù)應(yīng)用在地鐵隧道檢測(cè)中,還存在一定的限制。首先,檢測(cè)過(guò)程存在時(shí)間限制,地鐵全年的白天一直都在運(yùn)營(yíng),留給檢修的時(shí)間往往只有3-4小時(shí),檢測(cè)人員需要在有限的時(shí)間內(nèi),完成幾公里甚至十幾公里的隧道檢測(cè);其次,需要檢測(cè)的隧道截面大,目前國(guó)內(nèi)地鐵普遍采用的是6m的隧道,盾構(gòu)機(jī)直徑為6.3m左右,有些地鐵隧道的直徑甚至達(dá)到8m,單架相機(jī)難以覆蓋整個(gè)隧道截面,為了覆蓋整個(gè)截面,需要采用十幾架甚至幾十架相機(jī);最后,檢測(cè)精度要求高,地鐵隧道是外壓結(jié)構(gòu),在外部長(zhǎng)時(shí)間的巨大壓力之下,地鐵隧道可能會(huì)發(fā)生蠕變,往往只有毫米甚至更小的尺度變形,這要求測(cè)量精度在該尺度上。
采用嵌入式設(shè)備對(duì)采集的圖像進(jìn)行預(yù)處理,能夠滿足地鐵隧道的檢測(cè)限制。采用高速相機(jī)快速采集圖像數(shù)據(jù)是滿足地鐵隧道檢測(cè)限制的一種途徑,它既能滿足檢測(cè)精度的要求,也能在要求的測(cè)量時(shí)間內(nèi)完成對(duì)地鐵隧道的檢測(cè)。在測(cè)量過(guò)程中,檢測(cè)車每移動(dòng)一定的距離,高速相機(jī)需要采集一張圖像,該距離由測(cè)量精度決定,在本次研究中,該距離小于2mm。然而,多架高速相機(jī)同時(shí)采集圖像,要求的數(shù)據(jù)傳輸速率遠(yuǎn)遠(yuǎn)超過(guò)了目前計(jì)算機(jī)總線能夠達(dá)到的最高速度。
本次筆者采用嵌入式設(shè)備完成圖像預(yù)處理,將需要傳輸?shù)臄?shù)據(jù)量降低2個(gè)數(shù)量級(jí),若采用數(shù)據(jù)壓縮技術(shù),甚至可以將需傳輸?shù)臄?shù)據(jù)量降低3-4個(gè)數(shù)量級(jí),從而使得采集的圖像數(shù)據(jù)可以通過(guò)網(wǎng)絡(luò)進(jìn)行實(shí)時(shí)傳輸。針對(duì)地鐵隧道檢測(cè)過(guò)程中,圖像數(shù)據(jù)傳輸?shù)碾y點(diǎn),筆者提出采用嵌入式設(shè)備對(duì)采集的圖像數(shù)據(jù)進(jìn)行預(yù)處理,大幅降低需要傳輸?shù)臄?shù)據(jù)量。
預(yù)處理的具體流程和方法如下:
1)首先利用高速相機(jī)獲取隧道表面的圖像數(shù)據(jù);
2)采用Canny算法對(duì)可能存在激光線的區(qū)域進(jìn)行邊緣增強(qiáng),得到激光線所在位置;
3)在原始圖像數(shù)據(jù)上,根據(jù)上一步確定的激光線位置,向兩側(cè)分別延拓2-3個(gè)像素點(diǎn),計(jì)算激光線的真實(shí)位置;
4)將整幅圖像中激光線所在位置打包,并上傳到上位機(jī)。
本文主要研究在激光和攝影測(cè)量過(guò)程中圖像的預(yù)處理方法,目的是減少傳輸?shù)臄?shù)據(jù)量,滿足現(xiàn)有環(huán)境下數(shù)據(jù)實(shí)時(shí)傳輸?shù)囊蟆?/p>
地鐵隧道一般建在城市的人流量密集的區(qū)域,該區(qū)域往往建有大量高層建筑,這使得地鐵隧道長(zhǎng)時(shí)間承受巨大的壓力,同時(shí)由于地鐵運(yùn)行,導(dǎo)致地鐵隧道蠕變變形,破壞原有的結(jié)構(gòu)面,產(chǎn)生新的結(jié)構(gòu)面。因此,為達(dá)到正確評(píng)估地鐵隧道的穩(wěn)定性及防止地質(zhì)災(zāi)害的目的,在地鐵運(yùn)營(yíng)過(guò)程中,每隔一段時(shí)間,檢測(cè)人員需要對(duì)隧道進(jìn)行常規(guī)檢測(cè),獲取地鐵隧道結(jié)構(gòu)面的相關(guān)信息,為結(jié)構(gòu)面評(píng)估提供必要的基礎(chǔ)數(shù)據(jù)。
在本研究中,筆者采用激光和攝影等非接觸技術(shù)檢測(cè)隧道的結(jié)構(gòu)面,首先使用高速相機(jī)采集包含激光線的圖像,接著從圖像中提取激光中心線,最后將中心線上各點(diǎn)坐標(biāo)由圖像坐標(biāo)變換為世界坐標(biāo)下的坐標(biāo),該技術(shù)的原理如下。
激光和攝影測(cè)量原理如圖1所示,圖中激光測(cè)量頭由高速工業(yè)相機(jī)和環(huán)形激光器組成?;谛】壮上裨恚咚俟I(yè)相機(jī)與環(huán)形激光器之間的垂直安裝距離滿足式(1),
圖1 激光測(cè)量原理示意圖
當(dāng)進(jìn)行隧道表面測(cè)量時(shí),環(huán)形線激光器投射在地鐵隧道表面形成一條激光曲線,其包含了隧道表面幾何信息。用多架高速工業(yè)相機(jī)實(shí)時(shí)拍攝并采集隧道表面激光線圖像,該圖像將用于計(jì)算地鐵隧道表面輪廓線上各點(diǎn)在世界坐標(biāo)系中坐標(biāo)。
單架相機(jī)視覺測(cè)量隧道輪廓的模型簡(jiǎn)要說(shuō)明如下[2],其中,OWXWYWZW為世界坐標(biāo)系,OCXCYCZC為相機(jī)坐標(biāo)系,OUxUyU為圖像坐標(biāo)系,PW(XYZ)為世界坐標(biāo)系中地鐵隧道與光平面相交的輪廓線(后文簡(jiǎn)稱為地鐵隧道截面)上一點(diǎn),p(u,v)為圖像上的點(diǎn),中心投影的投影方程式為:
為建立相機(jī)圖像坐標(biāo)系OUxUyU與世界坐標(biāo)系OWXWYWZW之間的聯(lián)系,需對(duì)相機(jī)進(jìn)行標(biāo)定,求解其內(nèi)部矩陣A、外部參數(shù)R和t。筆者采用整體標(biāo)定測(cè)量技術(shù),調(diào)整標(biāo)定板位置,使標(biāo)定板平面位于世界坐標(biāo)系ZW=0的平面上,同時(shí)在工業(yè)相機(jī)拍攝范圍內(nèi);以標(biāo)定板平面中心為世界坐標(biāo)系原點(diǎn),標(biāo)定板水平方向?yàn)閤軸,垂直方向?yàn)?y軸,從而計(jì)算出標(biāo)定板各個(gè)角點(diǎn)在世界坐標(biāo)系中坐標(biāo)
拍攝當(dāng)前標(biāo)定板圖像,采用亞像素提取算法獲取角點(diǎn)在不同相位上的圖像坐標(biāo)。建立標(biāo)定平面與圖像平面之間的投影方程[2,6]:
由激光檢測(cè)原理可以知道,單次采集只能獲取一個(gè)隧道截面上各點(diǎn)在世界坐標(biāo)系下的坐標(biāo),整個(gè)隧道的檢測(cè)需要采集大量圖像。在檢測(cè)正在運(yùn)營(yíng)的地鐵隧道時(shí),受檢測(cè)時(shí)長(zhǎng)的限制,需要在有限的時(shí)間內(nèi)完成相關(guān)檢測(cè)。一種可行的辦法是在較短的時(shí)間內(nèi)拍攝盡可能多的圖像,如采用300-500 Fps的高速CCD工業(yè)相機(jī),在較短時(shí)間內(nèi)采集盡可能多的圖像,以滿足檢測(cè)精度要求。然而,這也帶來(lái)新的問題,即在極短的時(shí)間內(nèi)需要將十幾架,甚至幾十架相機(jī)采集的圖像及時(shí)上傳到上位機(jī)。這將遠(yuǎn)遠(yuǎn)超出現(xiàn)代計(jì)算機(jī)的總線傳輸速率。
為了解決這個(gè)問題,筆者提出在圖像采集端使用嵌入式板卡,采集到包含激光線的圖像后,立即提取激光線的中心信息,只保留與后續(xù)計(jì)算有關(guān)的數(shù)據(jù)。實(shí)驗(yàn)結(jié)果顯示,采用該策略后,傳輸?shù)臄?shù)據(jù)量降低兩個(gè)數(shù)量級(jí),能夠滿足數(shù)據(jù)傳輸?shù)囊蟆?/p>
地鐵隧道經(jīng)過(guò)長(zhǎng)時(shí)間運(yùn)營(yíng),在隧道下側(cè)積累了大量灰塵,激光線照射在灰塵上面時(shí),會(huì)發(fā)生漫反射現(xiàn)象,在采集端圖像上,激光線的亮度明顯下降,甚至變得不明顯。因此,在提取激光線中心之前,需對(duì)圖像進(jìn)行邊緣增強(qiáng)。筆者采用 Canny 算法對(duì)激光線邊緣進(jìn)行增強(qiáng)。
Canny算法邊緣檢測(cè)算法主要有以下幾個(gè)步驟:
1)圖像灰度化(降維處理);
2)高斯濾波(平滑和降噪);
3)計(jì)算圖像梯度值和方向;
4)應(yīng)用非極大值抑制NMS;
5)雙閾值檢測(cè)確定邊界。
灰度化是一種降維的操作,將三個(gè)通道的像素值轉(zhuǎn)換為單通道數(shù)據(jù),即將彩色圖像轉(zhuǎn)變?yōu)榛叶葓D像,達(dá)到減少計(jì)算量的目的。
1.2.1 高斯濾波
高斯濾波主要使圖像變得平滑,減少噪聲,但同時(shí)也有可能增大邊緣的寬度。高斯濾波是取濾波器窗口內(nèi)的像素的均值作為輸出,其系數(shù)按照高斯函數(shù)離散化??紤]高斯核的大小為(2k+1,2k+1),則點(diǎn)(i,j)處的高斯濾波器的值可由式(5)得到,
1.2.2 計(jì)算梯度
所謂圖像邊緣,指的是灰度值變化較大的像素點(diǎn)的集合,灰度值變化程度和方向可以用梯度表示。將圖像看成連續(xù)函數(shù)均勻采樣后的結(jié)果,則可以通過(guò)前差分計(jì)算梯度。
其中,W表示為圖像寬度,T為圖像高度。相應(yīng)的,在y方向的梯度可以表示為:
此時(shí),圖像坐標(biāo)(i,j)處像素點(diǎn)的梯度幅值Gij及方向可由下式得到:
1.2.3 非極大值抑制
該步驟過(guò)濾掉被誤報(bào)為邊緣的點(diǎn),最終的邊緣寬度盡量為1像素:遍歷梯度矩陣,查找邊緣方向上具有極大值的點(diǎn),保留該點(diǎn),過(guò)濾掉其余點(diǎn)(灰度值重置為0)。
由于邊緣梯度是局部極大值而非全局極大值,同時(shí)在邊緣檢測(cè)中可能存在雜散響應(yīng)。因此,為消除上述影響,實(shí)踐中常采用NMS算法。
1.2.4 閾值處理
由于圖像采集過(guò)程中可能存在某些干擾因素,某些平滑連續(xù)的圖像可能會(huì)出現(xiàn)微小起伏,為消除這方面影響,在實(shí)踐中常定義兩個(gè)閾值,一個(gè)表示高閾值,一個(gè)表示低閾值。若像素點(diǎn)的梯度強(qiáng)度小于低閾值,則不是邊緣點(diǎn);大于高閾值的像素點(diǎn)為強(qiáng)邊緣,是邊緣點(diǎn);介于兩者之間的像素點(diǎn)則需做進(jìn)一步檢測(cè)(弱邊緣)。
1.2.5 孤立弱邊緣抑制
定義只要鄰域像素有一個(gè)為強(qiáng)邊緣像素點(diǎn),則該弱邊緣就可以保留為強(qiáng)邊緣,即真實(shí)邊緣點(diǎn)。
由于激光的強(qiáng)度往往大于普通光的強(qiáng)度,經(jīng)過(guò)Canny邊緣算法計(jì)算后,可以較為準(zhǔn)確地確定當(dāng)前圖像中激光線的位置。
1.2.6 激光中心線的提取
邊緣檢測(cè)算法給出了激光線可能存在的位置。
在CCD 采集圖像上,考慮到激光線的強(qiáng)度在垂直于激光線的方向上滿足高斯分布,
根據(jù) Canny 算法檢測(cè)到的邊緣,即激光線可能出現(xiàn)的位置,在原始圖像中從該位置上分別向兩側(cè)拓展2-3個(gè)像素,然后采用式(14)對(duì)其進(jìn)行擬合,計(jì)算得到激光中心線真正的位置。
在提取中心線的過(guò)程中,耗時(shí)最長(zhǎng)的是邊緣檢測(cè)的過(guò)程,因此,加速邊緣檢測(cè)可以有效提升中心線提取速度。在嵌入式多核處理器上,考慮到在實(shí)際檢測(cè)中使用CCD相機(jī)快速采集圖像,筆者采用多線程策略,由每個(gè)線程處理一幅圖像,為加速線程處理圖像的速度,使用嵌入式芯片中的 SIMD 指令。
如上邊緣檢測(cè)的算法可知,高斯濾波需要對(duì)整幅圖像執(zhí)行卷積運(yùn)算,是整個(gè)算法中耗時(shí)最長(zhǎng)的計(jì)算,故需要采用 SIMD 指令加速卷積計(jì)算。
式(15)表示的是卷積運(yùn)算應(yīng)用于二維圖像數(shù)據(jù)時(shí)的離散形式定義,其中A為輸入,W為卷積核。
式(15)中,F(xiàn)x,F(xiàn)y分別為卷積核在x,y維度上的核寬度,sx和sy是沿著x和y的步幅,在本次研究中,設(shè)定其在x和y方向的步幅均為1。
對(duì)于式(15)中的計(jì)算,可以表示為:
卷積輸出0的第i行行向量為0i=(0i,0,0i,1,…,0i,px-1)。其中,Px,Py分別為輸出在x,y維度上的寬度。
其中,
經(jīng)過(guò)式(16)的變換過(guò)程,第i行的輸出向量0i被轉(zhuǎn)為 Fy個(gè)向量和。
將式(16)中第d個(gè)向量qd展開,易得:
第d個(gè)分量qd轉(zhuǎn)變?yōu)槭剑?7)中的矩陣向量乘運(yùn)算,該運(yùn)算可以通過(guò)標(biāo)準(zhǔn)的矩陣向量乘并行[7]。
但是傳統(tǒng)的矩陣向量乘并行并沒有考慮式(17)計(jì)算的特殊性。因此,在現(xiàn)有矩陣向量乘并行算法的基礎(chǔ)上,還可以進(jìn)一步地優(yōu)化。
由式(17)可知,qd中第j個(gè)元素是wd經(jīng)過(guò)0拓展后,與輸入向量aisy+d點(diǎn)積。
式(17)中矩陣填充了大量的0,特別當(dāng)Nx>>Fx時(shí),會(huì)導(dǎo)致太多的無(wú)效計(jì)算,故盡可能減少這類無(wú)效計(jì)算,快速提升計(jì)算性能。
2.4.1 SIMD指令的特點(diǎn)
SIMD指令具有“全局串行,局部并行”的特點(diǎn),且存在如下數(shù)據(jù)依賴關(guān)系:局部數(shù)據(jù)空間內(nèi)無(wú)數(shù)據(jù)依賴;全局?jǐn)?shù)據(jù)空間內(nèi)數(shù)據(jù)依賴關(guān)系滿足前向依賴。一旦待處理數(shù)據(jù)滿足上述兩個(gè)特征中的一個(gè),即可使用SIMD指令。
2.4.2 基于SIMD的運(yùn)算加速
在計(jì)算式(16)中向量qd時(shí),可重復(fù)分割行向量,提升運(yùn)算效率。具體步驟如下。
1)計(jì)算向量。
向量wj在x維度的寬度為sx,將劃分wj為子向量,子向量長(zhǎng)度為sx,不足部分用0元素填充。將子向量重復(fù)px次(px為輸出向量長(zhǎng)度),然后用0填充其首尾,生成的新向量長(zhǎng)度與輸入數(shù)據(jù)在x維度的長(zhǎng)度一致。具體劃分過(guò)程如下例所示。
若存在卷積核w,w在x維上的長(zhǎng)度Fx=5,w在第j個(gè)行向量,sx=2,按上述方式分割wj,將生成3個(gè)子向量其首尾分別填充0,生成的新向量的長(zhǎng)度與行向量ai的長(zhǎng)度一致,它們的長(zhǎng)度均為。根據(jù)上述生成步驟,可以得到如圖2所示的新向量。
圖2 步驟(1)卷積運(yùn)算轉(zhuǎn)變?yōu)橄蛄窟\(yùn)算
2)歸并計(jì)算結(jié)果。
將 向左移位,第j個(gè)中間結(jié)果向量向左移 個(gè)元素位置;
結(jié)果向量:
計(jì)算過(guò)程如圖 3所示。
圖3 步驟(2)卷積運(yùn)算轉(zhuǎn)變?yōu)橄蛄窟\(yùn)算
圖2的向量經(jīng)過(guò)移位計(jì)算后,生成圖3中虛線方框中的中間結(jié)果。在實(shí)際計(jì)算中,只需要計(jì)算 中的有效數(shù)據(jù)長(zhǎng)度(前 項(xiàng))。
算法1為改進(jìn)的向量乘算法。
算法 1 改進(jìn)的向量乘算法輸入:向量(寬度),第j行卷積核向量(寬度),中間結(jié)果向量 ,卷積運(yùn)算在 維度上步長(zhǎng)。輸出: 。1.function ImproveVECTOR MULTIPLY(ai,wjqk.Nx,Fx,sx)2.n Fx/sx 3.z 0 //建立一個(gè)長(zhǎng)度為Nx的臨時(shí)向量4.Px=(Nx-Fx)/sx+1 5.fort=0 to n-1 do 6.b (wj,tsx,…,wj,(t+1)sx-1,) //不足部分補(bǔ)零7.v (b,b,…,b) //b重復(fù)Px次8.v ai×v //此處×表示按對(duì)應(yīng)位置元素相乘9.v v左移t.sx個(gè)元素10.z z+v 11.end for 12.z的前PxSx個(gè)元素按長(zhǎng)度為Sx進(jìn)行分組,分別計(jì) 算各組之和13.u z的分組和 //每個(gè)分組和作為u中的一個(gè)元素14.qk qk+u 15.end function
改進(jìn)的向量乘算法存在以下優(yōu)點(diǎn):
1)計(jì)算相關(guān)數(shù)據(jù)均在寄存器或Cache中,因此計(jì)算速度快;
2)算法設(shè)計(jì)中盡可能消除了局部數(shù)據(jù)依賴關(guān)系,滿足SIMD指令的要求,因此能夠使用高效的SIMD指令計(jì)算向量 ;
3)復(fù)用向量ai,提高了數(shù)據(jù)的復(fù)用率,避免從慢速的內(nèi)存中重復(fù)加載;
4)向量ai可以是一整個(gè)向量,也可以是該向量的某個(gè)子向量,符合SIMD指令的短向量的要求。
2.4.3 基于計(jì)算機(jī)存儲(chǔ)結(jié)構(gòu)的改進(jìn)
基于對(duì)現(xiàn)代計(jì)算機(jī)采用層次內(nèi)存的存儲(chǔ)結(jié)構(gòu)的考慮,筆者主要考慮兩個(gè)方面對(duì)算法進(jìn)行改進(jìn):寄存器數(shù)據(jù)復(fù)用;優(yōu)化Cache使用。
1)寄存器數(shù)據(jù)復(fù)用。
二維輸入,大小為Nx×Ny,采用式(16)的卷積運(yùn)算后,得到大小為Px×Py的輸出特征0,其關(guān)系滿足式(18):
為減少內(nèi)存存取次數(shù),復(fù)用向量寄存器中的數(shù)據(jù)是一個(gè)簡(jiǎn)單的途徑:加載輸入向量ai;執(zhí)行所有直接使用ai的計(jì)算。由算法1可知,對(duì)于輸出特征0中第k行向量,由輸入向量計(jì)算得到。
對(duì)于輸入向量ai,與多個(gè)行向量wj進(jìn)行計(jì)算,其中,wj的下標(biāo)滿足式(19):
輸出向量0k的下標(biāo)k的取值范圍滿足式(20):
2)Cache的影響。
Cache是目前解決“內(nèi)存墻”問題的一種措施。現(xiàn)代計(jì)算機(jī)處理器頻率相較于之前明顯提升,處理器頻率的提升導(dǎo)致存儲(chǔ)系統(tǒng)存儲(chǔ)速度和處理器處理速度之間的差異增大。現(xiàn)代計(jì)算機(jī)采用了Cache、內(nèi)存、外存三級(jí)存儲(chǔ)結(jié)構(gòu)(NUMA),盡可能減少“內(nèi)存墻”對(duì)系統(tǒng)性能的影響。然而,這三級(jí)存儲(chǔ)間存取速度存在很大差異,其中Cache速度是三者之中最快的,與之相對(duì)的,其容量是三者之中最小的。
Cache容量與主存容量相差較大,將計(jì)算中所有相關(guān)數(shù)據(jù)加載到Cache中是不可行的。因此,筆者采用只加載卷積核W和計(jì)算中間結(jié)果Q的方法來(lái)提高Cache的命中率,同時(shí)提升Cache的利用率。
2.4.4 改進(jìn)算法
結(jié)合式(19)和式(20),可以分析得到關(guān)于ai的所有運(yùn)算。因此,當(dāng)輸入數(shù)據(jù)行向量ai被加載后,可以一次性完成關(guān)于該向量的所有運(yùn)算,具體步驟如算法2所示。
算法 2 計(jì)算輸入向量產(chǎn)生的所有輸出輸入: 向量ai(寬度Nx,行號(hào)i),卷積核W(在x,y維度上的寬度Fx,Fy),中間結(jié)果Q,卷積運(yùn)算在x,y維度上的步長(zhǎng)sx, sy。輸出: Q。 1.function Improve VECMATMULTIPL Y(ai,W,Q,Nx,Fy,sx,sy,i)2.lower max images/BZ_43_615_2916_637_2939.png
3.upper min//計(jì)算輸出的上下界4.fort=lower to upper do 5.q Q中第t個(gè)行向量6.u i-t×sy 7.w w中第u個(gè)行向量8.Improve VECTOR MULTIPL Y(ai,w,q,Nx,Fx,sx)9.保存q至Q中第t行10.end for 11.end function
當(dāng)循環(huán)次數(shù)較少時(shí),可以將算法2中的循環(huán)進(jìn)行展開,該算法存在以下優(yōu)點(diǎn):
1)向量ai加載之后,一次參與多個(gè)計(jì)算,可以避免從慢速內(nèi)存中多次加載數(shù)據(jù),提高向量寄存器的復(fù)用率,提升CPU的計(jì)算效率;
2)由于只需要加載一次向量ai,避免了Cache對(duì)計(jì)算數(shù)據(jù)的頻繁調(diào)度,提高了Cache的利用率;
3)對(duì)向量ai的長(zhǎng)度沒有限制。因此可以將長(zhǎng)向量劃分為多個(gè)短向量進(jìn)行運(yùn)算。筆者將向量ai分成多次加載,滿足SIMD指令的短向量的特點(diǎn)。
二維輸入數(shù)據(jù)的卷積運(yùn)算如算法 3所示。
算法 3 改進(jìn)的卷積運(yùn)算輸入: 輸入A(在 x, y 維度上的寬度 Nx, Ny),卷積核 W(在x, y 維度上的寬度 Fx, Fy),卷積結(jié)果 O,卷積運(yùn)算在x, y維度上的步長(zhǎng) sx, sy。輸出:卷積結(jié)果0。1.function Improve CONVOLUATIONMULTIPL Y(A,W,O,Nx,Ny,Fx,Fy,sx,sy)2.計(jì)算A中需要計(jì)算的行數(shù),將結(jié)果保存在d中3.for i=0 to d do 4.ai A中第i行向量 //ai直接從內(nèi)存加載到寄存器,不進(jìn)入Cache 5.ImproveVECMATMULTIPLY(ai,W,O,Nx,Fx,Fy,sx,sy,i)6.end for 7.end function
筆者直接使用快速CCD采集數(shù)據(jù),計(jì)算環(huán)境采用RK3399芯片,評(píng)估基準(zhǔn)為串行Canny算法,編程語(yǔ)言為C++和ARM匯編語(yǔ)言。
在計(jì)算提取激光中心線加速比時(shí),筆者在實(shí)驗(yàn)中驗(yàn)證了以下兩種情況:
基于SIMD指令并考慮寄存器復(fù)用;基于SIMD指令但不考慮寄存器復(fù)用。基于SIMD指令的CNN訓(xùn)練的加速比結(jié)果如圖 4所示 。
圖4 基于SIMD的激光中心線提取的加速比
圖4中,縱軸為加速比,橫軸為處理的圖像數(shù)據(jù),分別 為(100、500、1000、5000、10000、50000和100000幅圖像)。
由圖4可知,不考慮寄存器復(fù)用的算法加速比顯著低于寄存器復(fù)用的激光中心線的提取算法。這是因?yàn)樵诩拇嫫鲝?fù)用的情況下,計(jì)算相關(guān)數(shù)據(jù)被從內(nèi)存加載到寄存器,并不進(jìn)入Cache。Cache只用于保存局部中間結(jié)果和卷積核,通過(guò)提高Cache命中率提高了加速比。而不考慮寄存器復(fù)用的情況下,局部輸入數(shù)據(jù)、局部中間結(jié)果和卷積核均會(huì)被加載到Cache中,而由于Cache容量較小,這些數(shù)據(jù)量遠(yuǎn)遠(yuǎn)超出 Cache自身的存儲(chǔ)容量,導(dǎo)致Cache中的數(shù)據(jù)被頻繁調(diào)度,計(jì)算效率明顯下降。
本文采用SIMD指令,實(shí)現(xiàn)高速提取激光中心線。結(jié)果顯示,采用SIMD指令是完全可行的,并取得了很好的效果,在滿足高速相機(jī)采集圖像的同時(shí),滿足實(shí)時(shí)提取中心線的要求,有效降低了需要傳輸?shù)臄?shù)據(jù)量,故使得采用多架高速CCD采集圖像成為可能。