简介:本资源是面向工业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_weight='balanced');二是在训练过程中对少数类样本进行适度的过采样(如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, d=1/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(x=rotation_freq, color='r', linestyle='--', alpha=0.5, label=f'1X ({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_size=0.2, random_state=42, stratify=y) # 3. 标准化(仅用训练集拟合) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 测试集用训练集的参数转换 # 4. 训练随机森林模型 rf_clf = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42, class_weight='balanced') 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, annot=True, fmt='d', cmap='Blues', xticklabels=rf_clf.classes_, yticklabels=rf_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(rescale=1./255, rotation_range=5, width_shift_range=0.05, height_shift_range=0.05, brightness_range=[0.9, 1.1]) val_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory(train_dir, target_size=(128, 128), # 图像尺寸 batch_size=32, class_mode='categorical') val_generator = val_datagen.flow_from_directory(val_dir, target_size=(128, 128), batch_size=32, class_mode='categorical') # 3. 构建一个简单的CNN模型 model = models.Sequential([ layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation='relu'), layers.MaxPooling2D((2, 2)), layers.Conv2D(128, (3, 3), activation='relu'), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(128, activation='relu'), layers.Dropout(0.5), # 防止过拟合 layers.Dense(train_generator.num_classes, activation='softmax') ]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 4. 训练模型 history = model.fit(train_generator, epochs=20, validation_data=val_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的深刻理解,否则容易生成无意义的噪声。
本文还有配套的精品资源,点击获取