郭家旭,董 雷
(1.武漢郵電科學研究院,湖北武漢 430000;2.武漢理工光科股份有限公司,湖北武漢 430000)
光纖周界安防系統中的定位型振動光纖入侵探測系統是基于相位敏感的光時域反射技術[1],它能夠探測傳導至光纖上的振動信號,經過信號處理和模式識別,可定位具體的入侵信息,且具有探測距離長[2-5]的優點,多應用于周界入侵探測。定位型振動光纖入侵探測主機輸出巨大的傳感器陣列信號,數據量很大,但需要進行模式識別的只是運算后的幾個特征量[6]。特征量由數據的預處理完成,在進行信號數據的預處理過程中,需要對矩陣進行卷積和平方及四次方這種邏輯簡單但計算量大的運算,運算過程在通用CPU(Central Processing Unit)端計算時間長而且特別消耗計算資源[7],在實時檢測的過程中,占有率通常大于90%。為了進一步提升性能,文中利用華為公司生產的NPU(Neural Network Processing Units)設 備Atlas200DK實現對定位型光纖振動入侵探測主機產生的原始解調數據進行預處理,以此分擔CPU 端的運算壓力。
TensorFlow 是一個使用數據流以計算圖的方式進行數值計算的開放源代碼軟件庫,支持C/C++、Python 等編程語言[8]。計算圖指定了各個變量之間的計算關系,圖中的每個節點代表數學運算操作,節點與節點之間的連接叫作邊,邊代表在這些節點之間傳遞的數據。TensorFlow 不僅僅為實現機器學習或深度學習提供算法接口,同時它也是執行機器學習算法或深度學習算法進行計算的框架。計算圖一般被組織成構建階段和執行階段[9]。在構建階段,用張量來描述各節點的操作并把它們連接起來,此時的計算圖只是一個空殼,沒有任何輸出。在執行階段,使用會話執行圖中的各個節點,將需要計算的具體數據傳入計算圖中進行計算并輸出計算結果。
不同于傳統的支持通用計算的CPU 和圖形處理器(Graphics Processing Unit,GPU),華為公司專門研發了一款基于達芬奇架構[10]的NPU芯片,這種架構是為了適應某個特定領域中的常見應用和算法。一般來說,GPU 要通過矩陣計算來實現卷積,這一步驟需要通過軟件來實現[11]。該NPU芯片采用了一個專用的存儲轉換單元來完成這一過程,將這一步完全固化在硬件電路中,可以在很短的時間之內完成整個轉置過程。由于類似轉置的計算在深度神經網絡中出現得極為頻繁,這樣定制化電路模塊的設計可以提升執行效率,從而能夠實現不間斷的卷積計算。文中實驗所使用的NPU 設備是一款專門為深度學習的運算和部署設計的移動小型設備。
系統采集到的數據是對一根傳感光纖不斷進行掃描得來的。由于光纖的長度是一定的,因此光纖上分布的傳感器數量也是固定的,得到的數據是一個列數一定、行數不斷增加的動態二維矩陣。在實際處理中,每次選取其中某一時間片段進行處理。系統的采樣頻率為400 Hz,在截取片段時只截取1 s的數據,即每秒調用一次預處理程序來處理400 個周期的數據。
入侵振動信號通常是一個突變量,主要信息常常集中在20~120 Hz 部分,但是由于激光器、光路、硬件電路以及環境等因素引入的低頻和其他分量會造成低頻漂移或其他現象,對特征信號后續的識別帶來了一定的影響。所以系統采集的原始數據在后續求包絡時不能直接使用,一般使用高通濾波器去除20 Hz 以下的分量[12-13],文中實驗使用帶通濾波器提取出20~100 Hz的振動信號,使系統能夠提取出有效的振動信息。
一般來說,在判別是否有異常入侵事件以及類型時,判決器需要根據預處理后得到的峰度和包絡兩個特征量來進行異常模式的識別和定位。預處理流程如圖1 所示。

圖1 預處理流程
峰度是描述一組數據分布的平坦度,表征概率密度分布曲線在平均值處峰值高低的特征數,反映了峰部的尖度,一般用四階中心矩[14]來表示。在實驗中,利用峰度值來判定振動發生的位置,其公式為:

峰度計算流程如圖2 所示。

圖2 峰度計算流程
包絡是另一個判定振動的特征量,它是自定義的。濾波后的數據較難提取出相鄰兩次激勵的間隔,而利用包絡可以清晰得出結果,方便判斷振動類型,生成的瀑布圖可以更直觀地看出振動位置、振動發生的地點以及相對強度。為了減少計算量,一般對時間點的維度進行分組[15-16],求出每個傳感器所對應該段時間內的最大值和最小值的差,得到一個一維矩陣,即該段時間內的包絡數據。包絡計算流程如圖3 所示。

圖3 包絡計算流程
由于Matlab 對于矩陣運算十分友好且代碼結構簡單,因此系統在CPU 端進行預處理時調用Matlab的庫文件對數據進行運算。本地數據為一段光纖中10 000 個光纖位置采樣點和這10 000 個位置采樣點的13 200 個時間采樣點組成的13 200×10 000的double 型的二維矩陣。為了減少計算時間,方便說明算法流程,在實驗中,具體算法只計算了400 個時間采樣點,即1 s的數據,在讀取時先讀取500 個時間采樣點的數據。
在濾波操作中,數字濾波器原理簡單,且在Matlab 上使用卷積濾波來實現帶通濾波器的功能較為容易,只需使用自帶的一維線性濾波器filter,具體代碼如下:
Buf_data_filte=filter(obj.Num,1,Buf_data_o)
其中,Buf_data_filter 為卷積濾波后的數據,obj.Num 為卷積濾波器的系數,Buf_data_o 為讀取的原始數據。
為了減少濾波時突變信號對后續計算包絡所產生的影響,在實際處理中,選取濾波后500 個時間采樣點中去掉兩端后的400 個時間采樣點的數據。通常情況下,系統通過判斷峰度值的大小來判斷振動發生的位置,數值大于7 即為發生了振動。將原始數據傳入Matlab的kurtosis()函數可直接求得每個光纖的位置探測點所對應的峰度所組成的1×10 000矩陣。
現規定以40 個時間點位產生的數據為一組,如40×10 000的矩陣,即0.1 s 內10 000 個光纖位置采樣點的所有數據。通過Matlab的max()和min()函數找出該子矩陣中每一列的最大值maxi和最小值mini,并將它們依次相減得到一組數據的包絡,即規格為1×10 000的矩陣。利用循環結構多次執行相同的操作得到剩余9 組的包絡數據,然后按行重新組合成為一個10×10 000的矩陣,該矩陣就是實驗所取數據的包絡矩陣。
程序一般被分成兩個部分,即構建階段和執行階段。在實驗的構建階段,大體定義了對原始數據的讀取、濾波、求峰度和分段求包絡這幾個主要操作節點。由于TensorFlow 框架是針對深度學習推出的計算框架,對矩陣各種操作并不是很友好,因此為了利用其高效的運算效率,在整個過程中需要對矩陣的維度作各種變換以適應其運算格式。讀取原始數據和定義各種常量以及轉換數據為符合要求的格式后,首先創建一個實際將要在計算圖中運行的輸入數據變量data_input_original,并利用占位符tf.placeholder()創建該變量,在創建圖的過程中并沒有任何數值,只是使用占位符placeholder 來分配內存,最后在運行會話時再傳入data_input_original 具體的值。此時定義的輸入數據變量為500×10 000的矩陣,與上述Matlab 程序相對應。
在定義卷積濾波的操作節點中,首先定義濾波后的數據data_fli_0,然后使用tf.nn.conv2d(data_input_original,Num) 實現卷積操作,其中data_input_original 為輸入數據變量,Num 為濾波器的卷積核,是一個54×1的矩陣組成的濾波器系數。
在計算峰度時,TensorFlow 庫并沒有自帶的相關函數可以使用,因此需要根據公式實現。首先定義輸入數據data_tt,為原始數據轉置后的10 000×500 矩陣,利用自帶的tf.div()和tf.reduce_sum()函數求得原始data_tt 每一行的均值,得到的kur_mean 是一個10 000×1的矩陣。再利用tf.tile()函數實現對kur_mean的擴充,以kur_mean 為整體,復制500 列得到一個10 000×500的矩陣kur_mean_tt。然后將原始數據矩陣 data_tt 和 kur_mean_tt 作差得kur_mean_sub。使用tf.square()函數對其平方計算得到kur_mean_sub2,再次平方得到kur _mean_sub4。分別對以上兩個矩陣按行取均值,得到兩個10 000×1的矩陣,即kur_ mean_sub2_m 和kur_mean_sub4_m,對kur_mean_sub2_m 平方得到kur_mean_sub2_m2,最后使用 kur_mean_sub4_m 除以kur_mean_sub2_m2 即可得到關于10 000 個位置探測點的10 000×1 峰度矩陣kur_cal。
在使用TensorFlow 框架計算包絡時,依舊采用分段的方法,首先把原始數據利用tf.gather()函數按行進行切片,生成子矩陣,接著利用tf.transpose()函數將子矩陣進行轉置,再分別使用tf.reduce_max()和tf.reduce_max()函數找出每一行的最值組成的兩個10 000×1 矩陣,最后使用tf.subtract()將最大值矩陣和最小值矩陣相減得到一組包絡。使用相同的操作得出剩余子矩陣的包絡,最后利用tf.reshape()函數將這些子矩陣整合成10×10 000的矩陣。
在運行會話階段,分別將讀取的數據代入到已經創建的圖中的各個變量與運算當中,同時將圖中的各種操作保存到pb 模型文件當中。
華為NPU 設備作為外接移動運算設備,并不能直接使用TensorFlow 已經構建好的計算圖并完成相應的計算,需要利用該平臺所使用的MindStudio 開發工具,它運行在主機Linux 系統上。在運行模型文件前,需要將TensorFlow 生成的pb 文件通過開發工具MindStudio 按照相關參數轉化為NPU 設備獨有的離線om 模型,再將生成的離線om 模型和原始數據文件傳到NPU 設備上,在主機端發送運行命令之后才能在NPU設備上調用om 模型來對原始數據文件進行預處理。NPU 設備將計算后的數據重新傳入主機端,在主機端可以查看運算后的數據并作出相應的圖形。
由于原始數據過于龐大,預處理后得到的包絡和峰度只是兩個矩陣,無法直觀地展示測試效果,所以從數據中選取一部分來說明情況。相同的數據在不同設備上的預處理結果如表1 所示,CPU 端和NPU 端基本一致,造成該結果的原因在于程序對變量的計算和類型轉換過程中出現精度丟失。峰度圖如圖4 所示,可以看出,在第七個位置探測點處峰度值約為9,大于報警閾值7,說明該處發生了振動。該探測點的包絡數據圖如圖5 所示。

圖4 峰度圖

圖5 包絡數據圖

表1 不同設備峰度處理結果
在相同條件下選取規模相同的不同原始數據,利用計時函數分別多次計算CPU 端和NPU 端的計算時間,具體時間如表2 所示。

表2 在不同設備上進行預處理的計算時間
針對傳統的在CPU 端對光纖振動信號數據預處理中,處理速度慢、效率低的問題,文中提出并實現了基于TensorFlow 框架在NPU 設備上的光纖振動信號數據預處理的解決方案。實驗結果證明,在CPU端的計算結果與在NPU 設備上調用om 模型得到的峰度和包絡的計算結果基本一致,滿足后續對振動模式識別所需的特征量的處理要求。多次取得不同段落的相同規模的原始數據計算包絡和峰度所需時間約為280 ms,與原系統所用的900 ms 相比,效率約提升了3 倍,遠遠小于系統所需的1 s。但單純比較NPU 與CPU的計算性能不可取,也不科學,考慮到實驗所用的是本地數據,在實時檢測中應綜合考慮數據的傳輸開銷和設備初始化所需的時間,數據的處理速度會有所降低。