工业设备故障检测数据集构建与多传感器融合分析实战

发布时间:2026/8/30 0:12:28
工业设备故障检测数据集构建与多传感器融合分析实战 简介本资源是面向工业AI开发者与智能制造工程师的专用目标检测数据集聚焦设备预测性维护场景解决腐蚀、软管磨损、活塞故障及受潮等典型工业异常的视觉识别与精确定位问题。压缩包共1506个文件含752张真实工业设备实拍JPG图像、对应YOLO格式TXT标注文件含边界框坐标与四类故障标签、统一类别映射的YOLO YAML配置文件以及说明数据采集规范与使用指南的DOCX文档整体体积36.09MB结构清晰、开箱即用。已有230人学习下载适用于YOLOv5/v8/v12等主流检测框架训练可直接支撑故障预警系统开发、产线质量监控模块集成或设备健康评估平台构建。用户获取的是覆盖多角度、多状态的真实故障样本集标注精准、场景强泛化显著降低工业视觉算法从训练到落地的工程门槛。1. 项目概述一份数据集的诞生与价值最近在整理硬盘翻出来一个压箱底的宝贝——一个名为“工业设备故障检测数据集.zip”的文件包。这可不是我从哪个公开平台随手下载的而是几年前参与一个大型工业预测性维护项目时和团队一起从零到一“攒”出来的。当时为了拿到真实、有效、能用的数据我们几乎跑遍了合作方的几个主要生产基地跟产线老师傅们软磨硬泡和传感器、PLC可编程逻辑控制器斗智斗勇最后才形成了这个结构化的数据集合。今天我想把这个数据集背后的故事、它的结构设计、采集过程中的坑以及它究竟能用来做什么毫无保留地分享出来。无论你是刚入行数据科学的学生想找一个有挑战性的实战项目练手还是从事工业物联网或设备运维的工程师希望了解数据驱动的故障诊断流程这个数据集及其背后的方法论或许都能给你带来一些实实在在的启发。简单来说这个数据集的核心目标就是通过设备运行时的多维度传感器数据来识别和预测其潜在的故障状态。它模拟了工业现场最常见的一类场景一台关键旋转设备比如电机、泵或风机在持续运行我们通过部署在其关键部位的振动、温度、电流等传感器持续采集时间序列数据。数据中既包含了设备“健康”状态下的平稳运行记录也包含了多种典型故障如不平衡、不对中、轴承磨损、转子断条等从萌芽、发展到加剧的全过程数据。我们的任务就是像医生解读心电图一样从这些看似杂乱无章的波形和数字中找到故障的“指纹”。2. 数据集整体设计与采集思路拆解2.1 为什么选择多传感器融合方案在设计之初我们面临一个核心选择是只采集最经典的振动信号还是采用多传感器融合的方案我们最终选择了后者原因基于一个朴素的工业认知单一信号源的信息是有限的且容易受到干扰。振动分析确实是旋转机械故障诊断的“黄金标准”尤其是高频振动信号对轴承、齿轮的局部缺陷非常敏感。但是有些故障的早期征兆可能首先体现在温升上比如润滑不良导致的摩擦加剧或者反映在电机的电流谐波中比如转子断条引起的电流变化。此外现场环境复杂单一传感器可能意外失效或被偶然干扰例如一个意外的撞击会产生一个巨大的振动峰值但这不代表设备故障。多源数据的相互印证能极大提高诊断的鲁棒性和准确性。因此我们的数据集包含了以下四类同步采集的时序数据振动信号分为垂直和水平两个方向的加速度采样频率设为12.8 kHz。这个频率足以捕捉大多数滚动轴承故障特征其故障特征频率通常在几百Hz到几kHz。我们使用ICP型加速度传感器方便直接供电和信号传输。温度信号在电机驱动端和非驱动端轴承外壳上各布置一个PT100铂电阻温度传感器采样频率为1 Hz。温度是慢变信号但趋势异常往往是严重故障的前兆。三相电流信号通过电流钳表采集电机的U、V、W三相电流采样频率为5 kHz。电流信号蕴含了丰富的电气和机械耦合故障信息。转速信号通过键相传感器采集转速脉冲用于计算实时转速并为振动信号提供相位参考对于不平衡、不对中这类与转速同频或倍频相关的故障相位信息至关重要。注意采样频率的选择不是随意的。根据奈奎斯特采样定理要无失真地还原信号采样频率必须大于信号最高频率的2倍。我们预设关注的最高分析频率为5 kHz足以覆盖轴承故障因此振动采样率设为12.8 kHz通常是标准分析仪器的基值如2.56倍过采样。电流信号中我们主要关注低频的谐波成分5 kHz绰绰有余。2.2 故障模式的设计与模拟在真实的工厂里坐等设备自然发生故障来采集数据是昂贵且不现实的。我们采用了在实验台架上模拟故障的方法。合作方有一个精密的电机-风机对中实验台我们可以在上面人为地、可控地引入故障。我们设计了四种渐进式的故障状态连同健康状态共构成5个类别标签健康设备处于最佳对中、平衡状态轴承全新运行平稳。轻度不平衡在风机叶轮上附加一个小的质量块。这会导致振动增大且振动能量主要集中在1倍转频1X上。中度不对中轻微调整电机与风机之间的联轴器模拟角度不对中。这会产生较高的2倍转频2X振动有时伴有1X和3X成分。轴承外圈故障更换上一个预先在外圈滚道上加工了细微点蚀的轴承。这种故障会产生高频的冲击振动其特征频率Ball Pass Frequency Outer race, BPFO是固定的与转速有关。复合故障不平衡轴承故障同时引入质量块和故障轴承模拟现实中多种故障并发的情况这更贴近真实工业场景的复杂性。对于每一种故障状态我们都让设备从启动、升速到稳定运行持续采集至少30分钟的数据。同时我们还会缓慢改变负载通过调节风门开度以观察不同工况下故障特征的变化。这种“状态-工况”的二维设计使得数据集不仅能用于故障分类还能初步用于故障严重程度评估和工况迁移学习的研究。3. 数据格式解析与预处理要点3.1 文件组织结构详解解压“工业设备故障检测数据集.zip”后你会看到一个非常规整的目录树。清晰的结构是数据可用的基石。工业设备故障检测数据集/ ├── README.md # 数据字典包含所有元数据说明 ├── metadata.csv # 核心索引文件每一行对应一个数据片段 ├── raw_data/ # 原始高速采集的二进制文件按日期-设备-传感器组织 │ ├── 2023-06-01/ │ │ ├── Motor_A/ │ │ │ ├── vibration_vertical.dat │ │ │ ├── vibration_horizontal.dat │ │ │ ├── current_U.dat │ │ │ └── ... │ │ └── Motor_B/ │ │ └── ... │ └── ... └── processed/ # 预处理后的可直接用于建模的常用格式 ├── time_series_segments/ # 切割好的等长时序片段CSV格式 │ ├── health/ │ │ ├── segment_001.csv │ │ └── ... │ ├── imbalance_mild/ │ └── ... ├── features/ # 从原始信号中提取的时域、频域特征CSV格式 │ └── feature_table.csv └── images/ # 将振动信号转换成的时频图如梅尔频谱图用于CNN ├── health/ └── ...metadata.csv这是整个数据集的“导航图”。它包含了每个数据片段的完整描述信息例如file_path: 对应原始数据文件的路径。timestamp: 数据段的起始时间。machine_id: 设备编号我们有两台同型号设备用于交叉验证。fault_type: 故障标签健康、不平衡等。fault_severity: 故障严重程度等级0-健康1-轻度2-中度。rpm: 该时间段内的平均转速。load_percentage: 负载百分比。有了这个表你可以用Pandas轻松地按任意条件如“所有中度不对中的数据”、“设备A在75%负载下的数据”筛选和加载数据。raw_data/存储原始的、高采样率的二进制.dat文件。我们使用自定义的采集软件将多通道数据以float32格式交错存储Channel1_Sample1, Channel2_Sample1, Channel1_Sample2, Channel2_Sample2...。这样做存储效率高但读取时需要知道通道数和顺序。我们在README.md中提供了详细的读取代码示例。processed/这是为方便快速上手而准备的。我们预先将长达数十分钟的原始数据切割成了10秒一个的片段每个片段包含所有传感器的同步数据。对于振动信号我们还提供了两种衍生数据特征表格我们从每个10秒的振动片段中提取了21个经典的时域统计特征如均值、均方根、峰值、峭度、波形因子等和频域特征如重心频率、均方频率等形成了一个特征表格。这非常适合用来快速训练传统的机器学习模型如随机森林、XGBoost。时频图像我们将振动信号通过短时傅里叶变换STFT转换成了频谱图并保存为灰度图像。这为使用卷积神经网络CNN进行端到端的故障识别提供了直接输入。3.2 数据预处理的“脏活”与技巧原始工业数据从来都不是干净的。分享几个我们踩过坑后总结的预处理关键步骤1. 去趋势与去直流分量传感器可能有微小的零点漂移或者信号中存在缓慢变化的趋势项。这会影响后续的频域分析。一个简单的处理方法是先减去信号的均值去直流再使用一阶或二阶差分、或减去一条拟合的直线来消除趋势。在Python中可以用scipy.signal.detrend()函数方便地完成。2. 异常值处理与信号对齐尽管我们尽力控制环境但偶尔还是会有巨大的、瞬时的干扰脉冲可能是电磁干扰或碰撞。我们采用了一种基于统计的方法计算滑动窗口内的均值和标准差将超过“均值±5倍标准差”的点视为异常值并用前后点的线性插值替换。更重要的是信号对齐。由于不同传感器的数据采集卡可能略有延迟导致振动和电流信号在时间上不完全同步。我们利用转速信号的上升沿作为同步触发点对所有通道的数据进行了对齐校正确保同一时间戳下的数据是真正同一时刻的物理状态。3. 数据标准化/归一化的选择这是影响模型性能的关键一步。对于从不同物理量振动加速度g、温度℃、电流A提取的特征量纲和数值范围差异巨大。我们不建议对整个数据集使用全局的标准化如StandardScaler因为设备在不同健康状态下的数据分布可能不同混合标准化会“泄露”信息。正确的做法是在划分训练集和测试集之后仅使用训练集的数据来计算均值和标准差然后用这个参数去标准化训练集和测试集。对于时序片段或图像数据则常用最小-最大归一化到[0,1]区间。4. 样本不平衡问题我们的数据中“健康”状态的数据量远多于“轴承故障”状态的数据因为故障状态难以长时间维持。直接训练模型会使模型偏向于多数类。我们采用了两种结合的方法一是在损失函数中使用类别权重如class_weightbalanced二是在训练过程中对少数类样本进行适度的过采样如SMOTE算法但要注意避免在时序数据上造成信息泄露。4. 基于该数据集的典型分析流程实现4.1 特征工程与可视化探索拿到数据后第一步不是急着跑模型而是“看”数据。我们以“轻度不平衡”故障为例展示一个简单的分析流程。首先加载一个健康状态和一个不平衡状态的振动信号片段import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import signal # 加载数据 df_health pd.read_csv(./processed/time_series_segments/health/segment_001.csv) df_imbalance pd.read_csv(./processed/time_series_segments/imbalance_mild/segment_001.csv) vib_health df_health[vibration_vertical].values vib_imbalance df_imbalance[vibration_vertical].values time np.arange(len(vib_health)) / 12800 # 假设采样率12.8kHz生成时间轴 # 绘制时域波形对比 fig, axes plt.subplots(2, 1, figsize(12, 6)) axes[0].plot(time[:5000], vib_health[:5000]) # 只画前5000个点更清晰 axes[0].set_title(健康状态 - 垂直振动时域波形) axes[0].set_xlabel(时间 (s)) axes[0].set_ylabel(加速度 (g)) axes[0].grid(True) axes[1].plot(time[:5000], vib_imbalance[:5000]) axes[1].set_title(轻度不平衡 - 垂直振动时域波形) axes[1].set_xlabel(时间 (s)) axes[1].set_ylabel(加速度 (g)) axes[1].grid(True) plt.tight_layout() plt.show()通过时域图你可能已经能看到不平衡状态下波形的幅值增大了。但更明显的证据在频域。# 计算并绘制频谱FFT def plot_spectrum(signal, fs, title, ax): n len(signal) freqs np.fft.rfftfreq(n, d1/fs) fft_vals np.abs(np.fft.rfft(signal)) / n * 2 # 计算幅值谱 ax.plot(freqs[:2000], fft_vals[:2000]) # 只看前2000Hz ax.set_title(title) ax.set_xlabel(频率 (Hz)) ax.set_ylabel(幅值 (g)) ax.grid(True) # 标记转频 rpm 1500 # 假设转速1500 RPM rotation_freq rpm / 60 # 25 Hz ax.axvline(xrotation_freq, colorr, linestyle--, alpha0.5, labelf1X ({rotation_freq}Hz)) ax.legend() fig, axes plt.subplots(1, 2, figsize(14, 4)) plot_spectrum(vib_health, 12800, 健康状态频谱, axes[0]) plot_spectrum(vib_imbalance, 12800, 轻度不平衡频谱, axes[1]) plt.tight_layout() plt.show()在频谱图上你会清晰地看到健康状态的频谱能量分布较广且较低而不平衡状态的频谱在1倍转频25Hz处出现了一个异常突出的“尖峰”。这就是不平衡故障的“指纹”。通过这种可视化你可以直观地理解故障的物理意义并为后续的特征选择提供依据例如可以直接将1倍转频处的幅值作为一个强特征。4.2 构建一个基础的机器学习分类模型我们使用预处理好的特征表格快速搭建一个故障分类模型。import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_report, confusion_matrix import seaborn as sns # 1. 加载特征数据和标签 df_features pd.read_csv(./processed/features/feature_table.csv) X df_features.drop(columns[fault_type, segment_id]) # 特征 y df_features[fault_type] # 标签 # 2. 划分训练集和测试集注意分层抽样保持类别比例 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42, stratifyy) # 3. 标准化仅用训练集拟合 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 测试集用训练集的参数转换 # 4. 训练随机森林模型 rf_clf RandomForestClassifier(n_estimators100, max_depth10, random_state42, class_weightbalanced) rf_clf.fit(X_train_scaled, y_train) # 5. 评估 y_pred rf_clf.predict(X_test_scaled) print(classification_report(y_test, y_pred)) # 绘制混淆矩阵 cm confusion_matrix(y_test, y_pred) plt.figure(figsize(8,6)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabelsrf_clf.classes_, yticklabelsrf_clf.classes_) plt.ylabel(真实标签) plt.xlabel(预测标签) plt.title(故障分类混淆矩阵) plt.show()这个基础模型通常能达到85%以上的准确率。你可以通过特征重要性分析看看哪些特征比如振动信号的峭度、均方根或者频谱中特定频带的能量对分类贡献最大这能加深你对故障机理的理解。4.3 进阶使用CNN处理时频图像对于更复杂的故障或想追求更高的精度深度学习方法是趋势。我们准备好的时频图像正好派上用场。import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, models from tensorflow.keras.preprocessing.image import ImageDataGenerator # 1. 设置数据路径 train_dir ./processed/images/train # 假设你已经按类别分好了train/val文件夹 val_dir ./processed/images/val # 2. 使用ImageDataGenerator进行数据增强和加载 # 对于工业数据增强要谨慎水平翻转可能无意义但轻微的旋转、缩放、亮度调整可以模拟传感器微小变化。 train_datagen ImageDataGenerator(rescale1./255, rotation_range5, width_shift_range0.05, height_shift_range0.05, brightness_range[0.9, 1.1]) val_datagen ImageDataGenerator(rescale1./255) train_generator train_datagen.flow_from_directory(train_dir, target_size(128, 128), # 图像尺寸 batch_size32, class_modecategorical) val_generator val_datagen.flow_from_directory(val_dir, target_size(128, 128), batch_size32, class_modecategorical) # 3. 构建一个简单的CNN模型 model models.Sequential([ layers.Conv2D(32, (3, 3), activationrelu, input_shape(128, 128, 3)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activationrelu), layers.MaxPooling2D((2, 2)), layers.Conv2D(128, (3, 3), activationrelu), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(128, activationrelu), layers.Dropout(0.5), # 防止过拟合 layers.Dense(train_generator.num_classes, activationsoftmax) ]) model.compile(optimizeradam, losscategorical_crossentropy, metrics[accuracy]) # 4. 训练模型 history model.fit(train_generator, epochs20, validation_dataval_generator) # 5. 绘制训练曲线 # ... (绘制loss和accuracy曲线的代码)通过CNN模型可以自动学习频谱图中的局部模式和层次化特征往往能比手工特征取得更好的效果特别是对于复合故障或早期微弱故障。5. 实操中的常见问题与排查技巧实录在实际使用这个数据集进行建模分析时你几乎一定会遇到下面几个问题。这里记录了我们趟过的坑和解决办法。5.1 模型在测试集上表现“虚高”或过拟合问题现象训练集准确率高达98%测试集只有70%或者交叉验证时不同折的分数差异巨大。根本原因数据泄露或评估方式不当。工业时序数据具有强自相关性和工况连续性。如果你在划分训练/测试集之前就进行了全局标准化或者随机打乱切割后的片段那么很可能相邻的、高度相似的数据片段分别进入了训练集和测试集这相当于让模型“偷看”了答案。解决方案按时间或设备划分最严谨的方法是按时间顺序划分。例如用前80%时间的数据训练后20%的数据测试。或者用设备A的所有数据训练用设备B的数据测试这更能检验模型的泛化能力。我们的metadata.csv中的timestamp和machine_id字段就是为此设计的。确保预处理独立所有基于数据的预处理参数如标准化的均值/标准差、PCA的投影矩阵都必须仅从训练集计算然后应用于训练集和测试集。使用时序交叉验证如TimeSeriesSplit确保测试集的数据总是在训练集数据的时间点之后。5.2 模型无法区分“健康”与“早期故障”问题现象模型对严重故障分类很准但总是把早期故障误判为健康。根本原因早期故障的信号特征非常微弱容易被噪声淹没。手工提取的通用特征如均方根对早期故障不敏感。解决方案转向更敏感的特征尝试提取对冲击类故障更敏感的指标如峭度、峰值因子、脉冲因子。轴承故障早期会产生周期性的微弱冲击峭度值会显著升高。使用包络谱分析对于轴承故障直接频谱可能看不到故障频率因为冲击激起了高频共振。对信号进行希尔伯特变换提取包络线再对包络线做频谱分析即包络谱能将高频共振调制到低频让故障频率成分凸显出来。这是轴承诊断的经典方法。利用深度学习使用一维CNN或LSTM直接处理原始振动信号或者使用更精细的时频分析方法如小波变换生成图像供CNN学习深度学习模型有能力从噪声中提取这些微弱的模式。5.3 实际部署时效果下降问题现象在实验室数据集上表现良好的模型部署到真实工厂的另一台类似设备上准确率大幅下降。根本原因领域偏移。即使设备型号相同安装基础、环境噪声、传感器型号/安装位置的微小差异、负载工况的不同都会导致数据分布发生变化。解决方案在数据集中引入多样性这也是为什么我们的数据集包含了两台设备和不同负载的数据。在训练时确保训练集同时包含来自两台设备、各种工况的数据让模型学习到更本质的、与设备个体和工况无关的故障特征。进行领域自适应这是一个前沿方向。可以在模型训练中加入领域对抗训练或者使用迁移学习先在大数据集上预训练再用目标设备的少量数据进行微调。特征标准化使用对工况变化相对鲁棒的特征。例如将频谱幅值除以总能量进行归一化或者使用转速归一化阶次分析来代替绝对频率分析可以消除转速变化的影响。5.4 数据量不足怎么办我们的数据集虽然比很多公开数据集更贴近真实但对于复杂的深度学习模型来说数据量仍然有限。解决方案数据增强对于时序数据可以在时间域进行加噪、缩放、时间扭曲、片段裁剪拼接。对于时频图像可以进行旋转、平移、弹性变换。关键是要保证增强后的数据在物理意义上是合理的例如振动信号的上下翻转可能就失去了物理意义。迁移学习使用在大型通用图像数据集如ImageNet上预训练好的CNN模型如ResNet, VGG去掉最后的分类层用我们的时频图像数据去微调最后的几层网络。这能有效利用大模型已学到的通用特征提取能力在小数据集上取得好效果。生成对抗网络如果技术栈足够深入可以尝试使用GAN来生成更多符合真实分布的故障数据样本但这需要精细的调参和对GAN的深刻理解否则容易生成无意义的噪声。本文还有配套的精品资源点击获取