格拉姆角場(chǎng)(GAF)原理與實(shí)戰(zhàn):時(shí)序信號(hào)轉(zhuǎn)圖像用于軸承故障診斷
1. 項(xiàng)目概述從時(shí)序信號(hào)到圖像識(shí)別的故障診斷新思路格拉姆角場(chǎng)Gramian Angular Field GAF結(jié)合軸承故障診斷這個(gè)組合在工業(yè)預(yù)測(cè)性維護(hù)領(lǐng)域已經(jīng)不算新鮮但對(duì)于剛接觸的同學(xué)來(lái)說(shuō)看到東南大學(xué)相關(guān)的代碼和數(shù)據(jù)集第一反應(yīng)可能還是有點(diǎn)懵好好的振動(dòng)信號(hào)為什么要費(fèi)勁轉(zhuǎn)換成圖像直接用深度學(xué)習(xí)模型處理一維時(shí)序數(shù)據(jù)不行嗎我最初也有這個(gè)疑問(wèn)。直到在實(shí)際項(xiàng)目中面對(duì)來(lái)自不同工況、帶有強(qiáng)噪聲的軸承振動(dòng)數(shù)據(jù)傳統(tǒng)時(shí)頻分析方法比如FFT、小波變換的特征提取穩(wěn)定性遇到了瓶頸而基于GAF的方法展現(xiàn)出了獨(dú)特的優(yōu)勢(shì)。簡(jiǎn)單來(lái)說(shuō)GAF的核心思想是將一維時(shí)間序列通過(guò)坐標(biāo)變換映射到極坐標(biāo)系再通過(guò)三角運(yùn)算構(gòu)造出一種類圖像矩陣表示。這種表示方法巧妙地將時(shí)間序列的時(shí)序依賴性和數(shù)值關(guān)系“凝固”在一張圖上使得后續(xù)可以借助在圖像識(shí)別領(lǐng)域非常成熟的卷積神經(jīng)網(wǎng)絡(luò)CNN來(lái)進(jìn)行特征學(xué)習(xí)和分類。這對(duì)于軸承故障診斷而言相當(dāng)于開(kāi)辟了一條“降維打擊”的新路徑——我們不再需要手工設(shè)計(jì)復(fù)雜的時(shí)域、頻域、時(shí)頻域特征而是讓CNN從這種“翻譯”過(guò)來(lái)的圖像中自動(dòng)學(xué)習(xí)故障的視覺(jué)模式。東南大學(xué)在機(jī)械故障診斷領(lǐng)域的研究一直走在前列其公開(kāi)的代碼和數(shù)據(jù)集為初學(xué)者和研究者提供了極佳的學(xué)習(xí)范本。本次解讀聚焦于“數(shù)據(jù)集解讀”部分因?yàn)檫@是整個(gè)流程的基石。如果數(shù)據(jù)都理解錯(cuò)了后面的模型構(gòu)建、訓(xùn)練調(diào)參都是空中樓閣。我們將深入拆解代碼中數(shù)據(jù)加載、預(yù)處理、以及最關(guān)鍵的一步——如何將原始的振動(dòng)信號(hào)樣本轉(zhuǎn)換為GAF圖像的全過(guò)程并分享我在復(fù)現(xiàn)和擴(kuò)展過(guò)程中踩過(guò)的坑和總結(jié)的經(jīng)驗(yàn)。2. 核心思路與方案選型為什么是GAF在深入代碼之前我們必須先搞清楚方案選型背后的邏輯。軸承故障診斷本質(zhì)上是一個(gè)模式識(shí)別問(wèn)題我們需要從傳感器采集的振動(dòng)信號(hào)中區(qū)分出“正?!?、“內(nèi)圈故障”、“外圈故障”、“滾動(dòng)體故障”等不同狀態(tài)。傳統(tǒng)方法流程固定原始信號(hào) - 數(shù)字濾波降噪 - 特征提取如均方根、峭度、頻譜峰值 - 特征選擇/降維 - 輸入分類器如SVM、隨機(jī)森林。這個(gè)流程的瓶頸在于“特征提取”環(huán)節(jié)。手工設(shè)計(jì)的特征嚴(yán)重依賴專家經(jīng)驗(yàn)且對(duì)于變工況、變負(fù)載、強(qiáng)噪聲的場(chǎng)景泛化能力往往不足。深度學(xué)習(xí)提供了一種端到端的解決方案但直接將一維振動(dòng)信號(hào)喂給1D-CNN或RNN有時(shí)難以充分捕捉復(fù)雜的時(shí)序動(dòng)態(tài)和長(zhǎng)期依賴。這時(shí)GAF的優(yōu)勢(shì)就體現(xiàn)出來(lái)了。它的轉(zhuǎn)換過(guò)程可以概括為兩個(gè)核心步驟歸一化與極坐標(biāo)映射將一維時(shí)間序列的數(shù)值歸一化到[-1, 1]或[0, 1]區(qū)間然后將每個(gè)數(shù)據(jù)點(diǎn)視為在單位圓上的一個(gè)點(diǎn)其角度由歸一化后的值通過(guò)反余弦函數(shù)決定半徑固定為1或由時(shí)間戳決定。這一步將時(shí)序信息編碼到了極角中。生成格拉姆矩陣通過(guò)計(jì)算每?jī)蓚€(gè)點(diǎn)之間的三角和或差的余弦值生成一個(gè)格拉姆矩陣。這個(gè)矩陣是一個(gè)對(duì)稱矩陣其元素反映了原始序列中任意兩點(diǎn)之間的時(shí)序關(guān)系。這個(gè)矩陣就可以被視作一張灰度圖像。為什么選擇這個(gè)方案保留時(shí)序信息與直接將序列排列成圖像不同GAF的轉(zhuǎn)換過(guò)程本質(zhì)上是時(shí)序相關(guān)的矩陣中的每個(gè)點(diǎn)都包含了兩個(gè)原始時(shí)間點(diǎn)之間的關(guān)系。適合CNN處理生成的GAF圖像是結(jié)構(gòu)化的、局域相關(guān)的二維數(shù)據(jù)這與CNN擅長(zhǎng)的處理對(duì)象如圖像完美契合。CNN可以高效地從中提取空間層次化特征。對(duì)幅度縮放具有不變性由于先進(jìn)行了歸一化GAF對(duì)信號(hào)的整體幅度變化不敏感更關(guān)注信號(hào)的形狀和相對(duì)變化這在工業(yè)環(huán)境中非常實(shí)用因?yàn)樵O(shè)備負(fù)載變化會(huì)導(dǎo)致信號(hào)幅度整體漂移。在東南大學(xué)的代碼實(shí)現(xiàn)中通常采用GAF的兩種變體格拉姆角和場(chǎng)GASF和格拉姆角差場(chǎng)GADF。簡(jiǎn)單理解GASF使用余弦和圖像更強(qiáng)調(diào)序列的整體趨勢(shì)GADF使用正弦差對(duì)序列的局部變化和梯度更敏感。代碼中往往會(huì)同時(shí)生成這兩種圖像或者選擇其中一種作為輸入這需要根據(jù)具體數(shù)據(jù)特性進(jìn)行實(shí)驗(yàn)。3. 數(shù)據(jù)集深度解讀與預(yù)處理實(shí)戰(zhàn)拿到一個(gè)故障診斷數(shù)據(jù)集絕不能直接扔進(jìn)模型。正確的打開(kāi)方式是先像偵探一樣審視它。東南大學(xué)常用的數(shù)據(jù)集包括經(jīng)典的CWRU凱斯西儲(chǔ)大學(xué)軸承數(shù)據(jù)中心的數(shù)據(jù)也可能是其自有實(shí)驗(yàn)臺(tái)的數(shù)據(jù)。我們以CWRU數(shù)據(jù)集為例進(jìn)行深度解讀因?yàn)樗慕Y(jié)構(gòu)清晰應(yīng)用廣泛。3.1 數(shù)據(jù)集結(jié)構(gòu)與物理意義剖析CWRU數(shù)據(jù)集的目錄結(jié)構(gòu)通常按驅(qū)動(dòng)端風(fēng)扇端、故障直徑、負(fù)載工況來(lái)組織。例如CWRU/ ├── 12k Drive End Bearing Fault Data/ # 12kHz采樣驅(qū)動(dòng)端數(shù)據(jù) │ ├── Ball007/ # 滾動(dòng)體故障直徑0.007英寸 │ ├── IR007/ # 內(nèi)圈故障 │ ├── OR007/ # 外圈故障 │ └── Normal/ # 正常狀態(tài) └── 48k Drive End Bearing Fault Data/ # 48kHz采樣數(shù)據(jù)每個(gè)子文件夾里是多個(gè).mat文件每個(gè)文件對(duì)應(yīng)一次采樣記錄通常包含一個(gè)名為DE驅(qū)動(dòng)端加速度的變量也可能包含F(xiàn)E風(fēng)扇端和BA基座加速度數(shù)據(jù)。關(guān)鍵參數(shù)解讀采樣頻率Fs常見(jiàn)12kHz和48kHz。這決定了信號(hào)的最高分析頻率根據(jù)奈奎斯特定理為Fs/2。對(duì)于軸承故障特征頻率通常幾百Hz到幾千Hz12kHz通常足夠。故障直徑如0.007、0.014、0.021英寸。故障尺寸直接影響振動(dòng)信號(hào)的沖擊強(qiáng)度和調(diào)制現(xiàn)象。負(fù)載如0HP、1HP、2HP、3HP。電機(jī)負(fù)載不同軸承的受力狀態(tài)不同故障特征頻率的幅值會(huì)受負(fù)載調(diào)制這是模型泛化能力的重要考驗(yàn)。代碼中的數(shù)據(jù)加載環(huán)節(jié)通常使用scipy.io.loadmat來(lái)讀取.mat文件。這里第一個(gè)注意事項(xiàng)就來(lái)了一定要確認(rèn)加載后數(shù)據(jù)的維度和變量名。有時(shí)數(shù)據(jù)會(huì)被多層嵌套需要用.item()或索引來(lái)取出真正的振動(dòng)信號(hào)數(shù)組。import numpy as np from scipy.io import loadmat # 示例加載一個(gè).mat文件 file_path ‘path/to/your/data/Normal_0.mat‘ mat_data loadmat(file_path) # 關(guān)鍵查看mat文件中所有變量名 print(mat_data.keys()) # 通常振動(dòng)數(shù)據(jù)存儲(chǔ)在 ‘DE‘ 這個(gè)鍵下 vibration_signal mat_data[‘DE‘].flatten() # 確保是一維數(shù)組 print(f“信號(hào)長(zhǎng)度{len(vibration_signal)} 采樣頻率假設(shè)為 12kHz“)3.2 數(shù)據(jù)切片與樣本構(gòu)建策略原始數(shù)據(jù)文件往往很長(zhǎng)比如12kHz采樣下10秒就是12萬(wàn)個(gè)點(diǎn)我們需要將其切割成多個(gè)固定長(zhǎng)度的樣本用于訓(xùn)練和測(cè)試。樣本長(zhǎng)度segment_length的選擇是一個(gè)需要權(quán)衡的參數(shù)太短如1024點(diǎn)可能無(wú)法包含一個(gè)完整的故障沖擊周期信息不充分。太長(zhǎng)如8192點(diǎn)或更長(zhǎng)計(jì)算GAF圖像時(shí)矩陣尺寸過(guò)大n x n計(jì)算和存儲(chǔ)開(kāi)銷劇增且可能包含過(guò)多的冗余信息或多種狀態(tài)的混合。經(jīng)驗(yàn)值對(duì)于CWRU的12kHz數(shù)據(jù)我通常選擇2048或4096個(gè)點(diǎn)作為一個(gè)樣本。這對(duì)應(yīng)約0.17秒或0.34秒的數(shù)據(jù)足以捕捉到幾次故障沖擊同時(shí)矩陣尺寸可控2048x2048的圖像已經(jīng)需要約33MB內(nèi)存存儲(chǔ)為float64通常需要下采樣或使用更小的切片。代碼中的切片操作需要注意重疊問(wèn)題。為了增加樣本數(shù)量可以采用重疊切片。例如步長(zhǎng)stride設(shè)為segment_length//2即50%的重疊率。def create_samples(signal, segment_length2048, stride1024): “”“將長(zhǎng)序列切割成固定長(zhǎng)度的樣本。 Args: signal: 一維振動(dòng)信號(hào)數(shù)組。 segment_length: 每個(gè)樣本的長(zhǎng)度。 stride: 滑動(dòng)步長(zhǎng)。 Returns: samples: 形狀為 (n_samples, segment_length) 的二維數(shù)組。 ”“” n_samples (len(signal) - segment_length) // stride 1 samples np.zeros((n_samples, segment_length)) for i in range(n_samples): start i * stride end start segment_length samples[i] signal[start:end] return samples注意務(wù)必確保每個(gè)樣本的標(biāo)簽是正確的。如果從一個(gè)“內(nèi)圈故障”的數(shù)據(jù)文件中切出100個(gè)樣本那么這100個(gè)樣本的標(biāo)簽都應(yīng)該是“內(nèi)圈故障”。在構(gòu)建最終數(shù)據(jù)集時(shí)需要將不同故障類型、不同工況的樣本和標(biāo)簽分別堆疊起來(lái)并記得打亂順序在劃分訓(xùn)練集和測(cè)試集之后打亂而不是之前。3.3 數(shù)據(jù)標(biāo)準(zhǔn)化被忽視的關(guān)鍵一步在將樣本送入GAF轉(zhuǎn)換之前對(duì)每個(gè)樣本進(jìn)行獨(dú)立的標(biāo)準(zhǔn)化至關(guān)重要。這是因?yàn)镚AF的第一步——?dú)w一化到[-1,1]區(qū)間對(duì)輸入數(shù)據(jù)的尺度非常敏感。如果不同樣本的絕對(duì)幅值差異很大這在變工況數(shù)據(jù)中很常見(jiàn)直接使用全局的歸一化參數(shù)會(huì)導(dǎo)致部分樣本的信息被壓縮。正確的做法是對(duì)每個(gè)樣本進(jìn)行局部標(biāo)準(zhǔn)化常用方法是減去均值除以標(biāo)準(zhǔn)差Z-score標(biāo)準(zhǔn)化或者最小-最大歸一化到[-1,1]。這樣能保證每個(gè)樣本自身都被規(guī)范到相同的尺度突出了其內(nèi)部的相對(duì)變化模式這正是GAF想要捕捉的。def normalize_sample(sample, method‘zscore‘): “”“標(biāo)準(zhǔn)化單個(gè)樣本。 Args: sample: 一維數(shù)組一個(gè)振動(dòng)信號(hào)樣本。 method: ‘zscore‘ 或 ‘minmax‘。 ”“” if method ‘zscore‘: mean np.mean(sample) std np.std(sample) if std 1e-10: # 防止除零 std 1.0 return (sample - mean) / std elif method ‘minmax‘: min_val, max_val np.min(sample), np.max(sample) if max_val - min_val 1e-10: return sample * 0 return 2 * (sample - min_val) / (max_val - min_val) - 1 else: raise ValueError(“Method must be ‘zscore‘ or ‘minmax‘“)4. GAF圖像生成核心代碼逐行解讀這是整個(gè)流程的技術(shù)核心。我們將結(jié)合代碼詳細(xì)解釋每一步的數(shù)學(xué)含義和實(shí)現(xiàn)細(xì)節(jié)。4.1 極坐標(biāo)映射從數(shù)值到角度假設(shè)我們有一個(gè)已經(jīng)標(biāo)準(zhǔn)化到[-1, 1]區(qū)間的樣本X {x1, x2, ..., xn}。GAF映射的第一步是計(jì)算每個(gè)點(diǎn)對(duì)應(yīng)的角度φ。公式為φ_i arccos(x_i), 其中x_i ∈ [-1, 1] 因此φ_i ∈ [0, π]。為什么用反余弦因?yàn)樗且粋€(gè)在[-1,1]區(qū)間上單調(diào)遞減的函數(shù)能將數(shù)值唯一地映射到[0, π]的角度空間。同時(shí)由于余弦函數(shù)在[0, π]上是單調(diào)的這個(gè)映射是可逆的。import numpy as np def to_polar_coordinates(normalized_sample): “”“將歸一化后的樣本轉(zhuǎn)換為極坐標(biāo)角度。 Args: normalized_sample: 歸一化到[-1,1]的一維數(shù)組。 Returns: phi: 對(duì)應(yīng)的角度數(shù)組范圍[0, pi]。 ”“” # 防止數(shù)值誤差導(dǎo)致歸一化值略微超出[-1,1]范圍 normalized_sample np.clip(normalized_sample, -1, 1) phi np.arccos(normalized_sample) return phi4.2 生成格拉姆矩陣GASF與GADF得到角度數(shù)組φ后我們計(jì)算格拉姆矩陣。這里以**格拉姆角和場(chǎng)GASF**為例其元素定義為GASF_ij cos(φ_i φ_j)這個(gè)定義可以展開(kāi)為cos(φ_i)cos(φ_j) - sin(φ_i)sin(φ_j)。注意cos(φ_i)就是我們的原始?xì)w一化值x_i。因此GASF矩陣可以直接通過(guò)原始?xì)w一化數(shù)據(jù)計(jì)算無(wú)需顯式計(jì)算角度效率更高GASF X^T · X - sqrt(1 - X^2)^T · sqrt(1 - X^2)其中X是歸一化樣本向量sqrt(1 - X^2)即sin(φ)。格拉姆角差場(chǎng)GADF的定義為GADF_ij sin(φ_i - φ_j)其高效計(jì)算方式為GADF sqrt(1 - X^2)^T · X - X^T · sqrt(1 - X^2)def gramian_angular_field(sample, method‘sum‘, scaleNone): “”“計(jì)算樣本的格拉姆角場(chǎng)。 Args: sample: 一維數(shù)組一個(gè)振動(dòng)信號(hào)樣本建議已歸一化。 method: ‘sum‘ 對(duì)應(yīng) GASF ‘difference‘ 對(duì)應(yīng) GADF。 scale: 是否縮放圖像到[0, 255]區(qū)間用于可視化。默認(rèn)不縮放。 Returns: GAF: 二維矩陣即GAF圖像。 ”“” # 確保輸入是一維且為浮點(diǎn)型 sample sample.astype(np.float64).flatten() n len(sample) # 方法1通過(guò)角度計(jì)算直觀但稍慢 # phi np.arccos(np.clip(sample, -1, 1)) # if method ‘sum‘: # # GASF # cos_sum np.cos(np.add.outer(phi, phi)) # return cos_sum # else: # # GADF # sin_diff np.sin(np.subtract.outer(phi, phi)) # return sin_diff # 方法2通過(guò)三角恒等式高效計(jì)算推薦 sample_clipped np.clip(sample, -1, 1) # 計(jì)算 sin(phi) sin_phi np.sqrt(1 - sample_clipped ** 2) # 注意這里隱含假設(shè)phi在[0, pi]sin(phi)0 if method ‘sum‘: # GASF cos(phi_i phi_j) x_i * x_j - sqrt(1-x_i^2)*sqrt(1-x_j^2) outer_prod np.outer(sample_clipped, sample_clipped) sin_outer np.outer(sin_phi, sin_phi) gaf outer_prod - sin_outer elif method ‘difference‘: # GADF sin(phi_i - phi_j) sqrt(1-x_j^2)*x_i - x_j*sqrt(1-x_i^2) # 利用外積計(jì)算 sin_phi^T * X - X^T * sin_phi term1 np.outer(sin_phi, sample_clipped) term2 np.outer(sample_clipped, sin_phi) gaf term1 - term2 else: raise ValueError(“Method must be ‘sum‘ or ‘difference‘“) if scale is not None: # 將GAF值線性縮放到[0, scale]區(qū)間便于保存為圖像 gaf_min, gaf_max gaf.min(), gaf.max() if gaf_max - gaf_min 1e-10: gaf (gaf - gaf_min) * scale / (gaf_max - gaf_min) else: gaf np.zeros_like(gaf) return gaf4.3 圖像下采樣與存儲(chǔ)優(yōu)化直接生成2048x2048的GAF圖像對(duì)于大批量訓(xùn)練來(lái)說(shuō)是巨大的內(nèi)存和計(jì)算負(fù)擔(dān)。一個(gè)常見(jiàn)的優(yōu)化技巧是在生成GAF之前先對(duì)一維樣本進(jìn)行下采樣。例如將2048點(diǎn)的樣本通過(guò)滑動(dòng)平均或直接每隔N個(gè)點(diǎn)采樣的方式降到更短的序列長(zhǎng)度M如64 128 256。這樣生成的GAF圖像尺寸就是M x M大大減少了計(jì)算量。from scipy import signal def downsample_sample(sample, target_length256): “”“下采樣樣本到目標(biāo)長(zhǎng)度。 Args: sample: 一維樣本。 target_length: 下采樣后的目標(biāo)長(zhǎng)度。 Returns: 下采樣后的一維數(shù)組。 ”“” original_length len(sample) if original_length target_length: return sample # 方法1簡(jiǎn)單的線性插值重采樣 # return np.interp(np.linspace(0, original_length-1, target_length), # np.arange(original_length), sample) # 方法2使用scipy.signal.resample基于FFT更適用于帶限信號(hào) return signal.resample(sample, target_length)存儲(chǔ)格式生成的GAF矩陣是浮點(diǎn)型二維數(shù)組。如果直接保存為.npy文件體積較大。通常有兩種處理方式實(shí)時(shí)生成在模型訓(xùn)練的數(shù)據(jù)加載器DataLoader中實(shí)時(shí)將一批一維樣本轉(zhuǎn)換為GAF圖像。這種方式靈活不占用額外磁盤空間但會(huì)增加每個(gè)epoch的訓(xùn)練時(shí)間。預(yù)處理保存將所有訓(xùn)練集和測(cè)試集的樣本預(yù)先轉(zhuǎn)換為GAF圖像并保存為圖像文件如.png.jpg或壓縮的數(shù)組文件如.npz。這種方式訓(xùn)練速度快但需要大量的磁盤空間。對(duì)于256x256的灰度圖保存為uint8的PNG格式每張圖約65KB1萬(wàn)張圖就是650MB尚可接受。在東南大學(xué)的代碼中為了流程清晰和實(shí)驗(yàn)可復(fù)現(xiàn)通常采用第二種方式即先預(yù)處理生成一個(gè)完整的圖像數(shù)據(jù)集。5. 完整數(shù)據(jù)處理管道構(gòu)建與經(jīng)驗(yàn)分享將上述所有步驟串聯(lián)起來(lái)就構(gòu)成了從原始.mat文件到最終GAF圖像數(shù)據(jù)集的數(shù)據(jù)處理管道Pipeline。這個(gè)管道的健壯性和效率直接影響后續(xù)實(shí)驗(yàn)的順利進(jìn)行。5.1 管道構(gòu)建示例下面是一個(gè)簡(jiǎn)化的端到端管道示例它遍歷指定目錄下的所有.mat文件生成對(duì)應(yīng)標(biāo)簽的GAF圖像并保存到以故障類別命名的文件夾中。import os import numpy as np from scipy.io import loadmat import cv2 # 用于保存圖像 import argparse def build_gaf_dataset(data_root_dir, output_img_dir, segment_len2048, stride1024, downsampled_len256, gaf_method‘sum‘): “”“構(gòu)建GAF圖像數(shù)據(jù)集。 Args: data_root_dir: 原始.mat數(shù)據(jù)根目錄子文件夾為不同故障類別。 output_img_dir: 輸出圖像目錄內(nèi)部會(huì)按類別創(chuàng)建子文件夾。 segment_len: 樣本切片長(zhǎng)度。 stride: 切片步長(zhǎng)。 downsampled_len: 下采樣目標(biāo)長(zhǎng)度。 gaf_method: ‘sum‘ (GASF) 或 ‘difference‘ (GADF)。 ”“” # 獲取故障類別子文件夾名 fault_classes [d for d in os.listdir(data_root_dir) if os.path.isdir(os.path.join(data_root_dir, d))] fault_classes.sort() print(f“發(fā)現(xiàn)故障類別{fault_classes}“) for class_idx, class_name in enumerate(fault_classes): class_dir os.path.join(data_root_dir, class_name) output_class_dir os.path.join(output_img_dir, class_name) os.makedirs(output_class_dir, exist_okTrue) mat_files [f for f in os.listdir(class_dir) if f.endswith(‘.mat‘)] print(f“處理類別 ‘{class_name}‘ 共 {len(mat_files)} 個(gè)文件。“) sample_count 0 for mat_file in mat_files: file_path os.path.join(class_dir, mat_file) try: mat_data loadmat(file_path) # **關(guān)鍵確認(rèn)數(shù)據(jù)鍵名這里假設(shè)為 ‘DE‘** vibration_signal mat_data[‘DE‘].flatten() except Exception as e: print(f“加載文件 {file_path} 失敗{e}“) continue # 1. 創(chuàng)建樣本切片 samples create_samples(vibration_signal, segment_len, stride) # 2. 對(duì)每個(gè)樣本進(jìn)行處理 for i, sample in enumerate(samples): # 2.1 樣本標(biāo)準(zhǔn)化 (Z-score) norm_sample normalize_sample(sample, method‘zscore‘) # 2.2 下采樣 (可選但強(qiáng)烈推薦) if downsampled_len and len(norm_sample) downsampled_len: norm_sample downsample_sample(norm_sample, target_lengthdownsampled_len) # 2.3 生成GAF圖像 gaf_matrix gramian_angular_field(norm_sample, methodgaf_method) # 2.4 縮放到[0, 255]并轉(zhuǎn)換為uint8以便保存為圖像 gaf_img ((gaf_matrix 1) / 2 * 255).astype(np.uint8) # 假設(shè)GAF值在[-1,1] # 2.5 保存圖像文件名包含類別和索引信息 img_filename f“{class_name}_{sample_count:06d}.png“ img_path os.path.join(output_class_dir, img_filename) cv2.imwrite(img_path, gaf_img) sample_count 1 print(f“ 類別 ‘{class_name}‘ 處理完成生成 {sample_count} 張圖像。“)5.2 實(shí)操心得與避坑指南數(shù)據(jù)平衡問(wèn)題不同故障類別的原始數(shù)據(jù)文件可能數(shù)量不等切片后樣本數(shù)差異可能更大。務(wù)必在構(gòu)建最終數(shù)據(jù)集時(shí)檢查各類別的樣本數(shù)量。如果嚴(yán)重不平衡需要考慮過(guò)采樣如對(duì)少數(shù)類樣本進(jìn)行隨機(jī)滑動(dòng)窗口的多次切片、欠采樣或使用類別權(quán)重。GAF圖像的可視化檢查在管道運(yùn)行后一定要隨機(jī)抽查幾張生成的GAF圖像用matplotlib顯示出來(lái)看看。正常的、不同故障的GAF圖像應(yīng)該呈現(xiàn)出不同的紋理模式。如果所有圖像看起來(lái)都是模糊一片或噪聲很可能是在數(shù)據(jù)標(biāo)準(zhǔn)化或GAF計(jì)算環(huán)節(jié)出了問(wèn)題。下采樣參數(shù)的權(quán)衡downsampled_len是核心超參數(shù)。太小如32會(huì)丟失過(guò)多細(xì)節(jié)太大如512則計(jì)算成本高。建議從128或256開(kāi)始嘗試。下采樣方法也會(huì)影響效果scipy.signal.resample比簡(jiǎn)單的線性插值更能保留頻域信息。內(nèi)存管理處理大規(guī)模數(shù)據(jù)時(shí)避免一次性將所有數(shù)據(jù)加載到內(nèi)存。上述管道是“流式”處理處理一個(gè)文件保存一批圖像是更安全的方式。如果使用實(shí)時(shí)生成策略在DataLoader中要確保轉(zhuǎn)換函數(shù)足夠高效。標(biāo)簽編碼保存圖像時(shí)最好將類別標(biāo)簽也單獨(dú)保存為一個(gè).npy文件或csv文件與圖像路徑對(duì)應(yīng)。更常見(jiàn)的做法是使用深度學(xué)習(xí)框架如PyTorch的ImageFolder能識(shí)別的目錄結(jié)構(gòu)即每個(gè)類別的圖像放在一個(gè)子文件夾下框架會(huì)自動(dòng)推斷標(biāo)簽。GASF vs GADF沒(méi)有絕對(duì)的好壞。我的經(jīng)驗(yàn)是對(duì)于沖擊特征明顯的故障如點(diǎn)蝕GADF有時(shí)能提供更清晰的邊緣信息??梢試L試將兩者作為兩個(gè)通道構(gòu)建一個(gè)“2通道圖像”輸入CNN或者分別訓(xùn)練模型然后集成。6. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄在實(shí)際復(fù)現(xiàn)和實(shí)驗(yàn)過(guò)程中你幾乎一定會(huì)遇到下面這些問(wèn)題。這里記錄了我的排查思路和解決方法。6.1 生成的GAF圖像全是灰色沒(méi)有紋理現(xiàn)象保存的PNG圖像看起來(lái)是均勻的灰色或者紋理非常微弱??赡茉蚺c排查數(shù)據(jù)標(biāo)準(zhǔn)化錯(cuò)誤檢查normalize_sample函數(shù)。如果輸入信號(hào)本身非常平緩方差很小Z-score標(biāo)準(zhǔn)化后數(shù)值范圍可能仍然很窄比如在[-0.1, 0.1]導(dǎo)致arccos計(jì)算后角度變化不大生成的GAF矩陣元素值非常接近。解決打印幾個(gè)樣本標(biāo)準(zhǔn)化后的最大值和最小值。也可以嘗試改用最小-最大歸一化到[-1,1]看看是否改善。GAF值縮放錯(cuò)誤在保存為圖像前需要將GAF矩陣的值線性映射到[0, 255]。如果映射前的GAF矩陣動(dòng)態(tài)范圍很小映射后就會(huì)集中在中灰值附近。解決打印GAF矩陣的min()和max()。對(duì)于GASF理論范圍是[-1,1]但實(shí)際可能集中在某個(gè)小區(qū)間??梢試L試使用對(duì)比度拉伸例如用(gaf_matrix - gaf_matrix.min()) / (gaf_matrix.max() - gaf_matrix.min()) * 255。下采樣過(guò)于激進(jìn)如果downsampled_len設(shè)得太小原始信號(hào)的特征模式在下采樣過(guò)程中被嚴(yán)重平滑掉了。解決增大下采樣長(zhǎng)度或者先不做下采樣生成大圖看看是否有紋理。6.2 模型訓(xùn)練準(zhǔn)確率始終在“瞎猜”水平比如四分類準(zhǔn)確率25%左右現(xiàn)象CNN模型訓(xùn)練損失不下降驗(yàn)證準(zhǔn)確率徘徊在隨機(jī)猜測(cè)水平??赡茉蚺c排查標(biāo)簽錯(cuò)亂這是最致命也最隱蔽的錯(cuò)誤。檢查數(shù)據(jù)加載環(huán)節(jié)確保圖像路徑和標(biāo)簽的對(duì)應(yīng)關(guān)系絕對(duì)正確。一個(gè)快速驗(yàn)證的方法是取出訓(xùn)練集中每個(gè)類別的幾張圖像顯示出來(lái)并打印其標(biāo)簽人工判斷是否匹配。數(shù)據(jù)泄露確保在切片生成樣本時(shí)沒(méi)有使用跨越不同.mat文件的連續(xù)索引。例如文件A的末尾和文件B的開(kāi)頭被切到了一個(gè)樣本里這個(gè)樣本的標(biāo)簽就無(wú)法定義。確保每個(gè)樣本完全來(lái)源于同一個(gè)數(shù)據(jù)文件。訓(xùn)練/測(cè)試集劃分不當(dāng)如果按文件順序劃分可能導(dǎo)致訓(xùn)練集和測(cè)試集來(lái)自完全不同的工況比如訓(xùn)練集全是0HP負(fù)載測(cè)試集全是3HP負(fù)載模型無(wú)法泛化。必須在樣本級(jí)別進(jìn)行隨機(jī)打亂和分層劃分確保每個(gè)集合中各類別、各工況的數(shù)據(jù)比例大致相同。GAF轉(zhuǎn)換函數(shù)有數(shù)值錯(cuò)誤使用一個(gè)小型人造信號(hào)測(cè)試你的gramian_angular_field函數(shù)。例如輸入一個(gè)簡(jiǎn)單的正弦波觀察生成的GAF圖像是否具有預(yù)期的周期性結(jié)構(gòu)。與公開(kāi)的GAF實(shí)現(xiàn)如pyts庫(kù)的結(jié)果進(jìn)行對(duì)比。6.3 處理速度太慢特別是實(shí)時(shí)生成GAF時(shí)現(xiàn)象數(shù)據(jù)預(yù)處理或訓(xùn)練時(shí)的數(shù)據(jù)加載成為瓶頸。優(yōu)化技巧向量化操作確保gramian_angular_field函數(shù)中使用了NumPy的向量化操作如np.outer避免Python層面的for循環(huán)。預(yù)處理與緩存如非必要不要在每個(gè)epoch實(shí)時(shí)生成GAF?;ㄙM(fèi)一些時(shí)間和磁盤空間進(jìn)行預(yù)處理是值得的。使用更高效的數(shù)據(jù)加載如果使用PyTorch將預(yù)處理好的圖像數(shù)據(jù)集放在SSD硬盤上并使用torch.utils.data.DataLoader的多個(gè)工作進(jìn)程num_workers和內(nèi)存固定pin_memoryTrue來(lái)加速數(shù)據(jù)從磁盤到GPU的傳輸。降低圖像分辨率這是最有效的提速方法。嘗試128x128甚至64x64的圖像很多情況下對(duì)分類精度影響不大但計(jì)算量和內(nèi)存占用呈平方級(jí)下降。6.4 不同故障類型的GAF圖像看起來(lái)區(qū)別不大現(xiàn)象人眼難以區(qū)分正常和故障的GAF圖像??赡茉蚺c對(duì)策故障特征微弱早期微弱故障或故障尺寸很小時(shí)振動(dòng)信號(hào)中的沖擊成分可能被強(qiáng)烈的背景噪聲淹沒(méi)。GAF轉(zhuǎn)換并不能創(chuàng)造信息它只是換了一種表示方式。對(duì)策考慮在GAF轉(zhuǎn)換前先對(duì)信號(hào)進(jìn)行降噪處理例如使用小波閾值去噪、自適應(yīng)濾波等。需要更強(qiáng)大的特征提取器人眼難以區(qū)分不代表CNN學(xué)不到特征??梢岳^續(xù)訓(xùn)練模型并利用Grad-CAM等可視化工具查看CNN到底關(guān)注圖像的哪些區(qū)域。如果CNN能學(xué)到區(qū)分性特征那就沒(méi)問(wèn)題。嘗試其他時(shí)頻圖像表示如果GAF效果確實(shí)不佳可以對(duì)比其他方法如連續(xù)小波變換CWT生成的時(shí)頻譜圖、短時(shí)傅里葉變換STFT譜圖、馬爾可夫變遷場(chǎng)MTF等。有時(shí)不同的數(shù)據(jù)適合不同的表示方法。軸承故障診斷是一個(gè)理論與實(shí)踐緊密結(jié)合的領(lǐng)域。讀懂東南大學(xué)的這份代碼不僅僅是理解幾行Python更是要理解其背后將時(shí)序問(wèn)題轉(zhuǎn)化為視覺(jué)問(wèn)題的思想以及數(shù)據(jù)預(yù)處理中每一步的工程考量。從數(shù)據(jù)集的解讀、清洗、切片到GAF圖像的生成和優(yōu)化每一步都藏著影響最終模型效果的細(xì)節(jié)。希望這份超詳細(xì)的解讀和實(shí)錄的經(jīng)驗(yàn)?zāi)軒湍惚荛_(kāi)我當(dāng)年踩過(guò)的那些坑更順暢地踏上基于GAF和深度學(xué)習(xí)的智能診斷研究之路。在實(shí)際項(xiàng)目中多可視化、多對(duì)比、從小規(guī)模實(shí)驗(yàn)開(kāi)始迭代是最高效的策略。

相關(guān)新聞

MNIST數(shù)據(jù)集下載與預(yù)處理全攻略:從入門到工程實(shí)踐

MNIST數(shù)據(jù)集下載與預(yù)處理全攻略:從入門到工程實(shí)踐

1. 從“Hello World”到“Hello MNIST”:為什么它依然是機(jī)器學(xué)習(xí)的入門基石 如果你剛開(kāi)始接觸機(jī)器學(xué)習(xí),或者正準(zhǔn)備從理論轉(zhuǎn)向?qū)嵺`,那么“MNIST”這個(gè)名字你大概率已經(jīng)聽(tīng)過(guò)無(wú)數(shù)遍了。它就像一個(gè)技術(shù)圈的“Hello World”,幾乎出現(xiàn)在…

2026/8/2 14:46:16 閱讀更多
Raspberry Pi 400一體機(jī):從硬件解析到家庭服務(wù)器與物聯(lián)網(wǎng)項(xiàng)目實(shí)戰(zhàn)

Raspberry Pi 400一體機(jī):從硬件解析到家庭服務(wù)器與物聯(lián)網(wǎng)項(xiàng)目實(shí)戰(zhàn)

1. 項(xiàng)目概述:為什么說(shuō)Raspberry Pi 400是“一體式”創(chuàng)客電腦的里程碑?如果你對(duì)樹(shù)莓派(Raspberry Pi)的印象還停留在那塊裸露著GPIO針腳、需要自己配外殼和鍵盤的綠色電路板,那么Raspberry Pi 400的出現(xiàn),絕對(duì)…

2026/8/2 14:46:16 閱讀更多
UGV懸掛系統(tǒng)設(shè)計(jì)實(shí)戰(zhàn):雙橫臂結(jié)構(gòu)選型與調(diào)校指南

UGV懸掛系統(tǒng)設(shè)計(jì)實(shí)戰(zhàn):雙橫臂結(jié)構(gòu)選型與調(diào)校指南

1. 項(xiàng)目緣起:從“硬碰硬”到“軟著陸”的探索在無(wú)人地面車輛(UGV)的研發(fā)與改裝領(lǐng)域,懸掛系統(tǒng)(Suspension)常常是決定其性能上限與可靠性的關(guān)鍵,卻也是最容易被忽視的環(huán)節(jié)。很多初入此道的朋友&a…

2026/8/2 15:56:24 閱讀更多
GTA5線上小助手:3個(gè)核心功能幫你快速掌控洛圣都

GTA5線上小助手:3個(gè)核心功能幫你快速掌控洛圣都

GTA5線上小助手:3個(gè)核心功能幫你快速掌控洛圣都 【免費(fèi)下載鏈接】GTA5OnlineTools GTA5線上小助手 項(xiàng)目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools GTA5線上小助手是一款專為《俠盜獵車手5》線上模式玩家設(shè)計(jì)的輔助工具,通過(guò)簡(jiǎn)單易…

2026/8/2 15:56:24 閱讀更多
徹底解決PCSX2模擬器啟動(dòng)崩潰:Visual C++運(yùn)行時(shí)庫(kù)完整修復(fù)指南

徹底解決PCSX2模擬器啟動(dòng)崩潰:Visual C++運(yùn)行時(shí)庫(kù)完整修復(fù)指南

徹底解決PCSX2模擬器啟動(dòng)崩潰:Visual C運(yùn)行時(shí)庫(kù)完整修復(fù)指南 【免費(fèi)下載鏈接】pcsx2 PCSX2 - The Playstation 2 Emulator 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2 當(dāng)您滿懷期待地下載了PCSX2模擬器,準(zhǔn)備重溫經(jīng)典的PlayStation …

2026/8/2 15:56:24 閱讀更多
5分鐘掌握My-TODOs:你的跨平臺(tái)桌面任務(wù)管理神器

5分鐘掌握My-TODOs:你的跨平臺(tái)桌面任務(wù)管理神器

5分鐘掌握My-TODOs:你的跨平臺(tái)桌面任務(wù)管理神器 【免費(fèi)下載鏈接】My-TODOs A cross-platform desktop To-Do list. 跨平臺(tái)桌面待辦小工具 項(xiàng)目地址: https://gitcode.com/gh_mirrors/my/My-TODOs 還在為繁雜的待辦事項(xiàng)而煩惱嗎?想要一款既簡(jiǎn)潔又強(qiáng)…

2026/8/2 15:46:23 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書(shū),視頻號(hào)上,賺錢從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書(shū),視頻號(hào)上,賺錢從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/2 2:52:49 閱讀更多