神经网络检测机械轴承异常

运行源代码戳这里👇:
轴承异常检测

简介

轴承是在机械设备中具有广泛应用的关键部件之一。由于过载,疲劳,磨损,腐蚀等原因,轴承在机器操作过程中容易损坏。事实上,超过50%的旋转机器故障与轴承故障有关。实际上,滚动轴承故障可能导致设备剧烈摇晃,设备停机,停止生产,甚至造成人员伤亡。一般来说,早期的轴承弱故障是复杂的,难以检测。因此,轴承状态的监测和分析非常重要,它可以发现轴承的早期弱故障,防止故障造成损失。 最近,轴承的故障检测和诊断一直备受关注。在所有类型的轴承故障诊断方法中,振动信号分析是最主要和有用的工具之一。

对数据进行检视

训练集数据

1到6000是按时间序列连续采样的振动信号数值,每行数据为一个样本,共792条样本数据,第一列id字段为样本编号,最后一列label字段为标签数据,即轴承的工作状态,用数字0到9表示,其中

batch_size = 8

DATA = '/home/featurize/data/train.csv'
TEST = '/home/featurize/data/test_data.csv'

train_df = pd.read_csv(DATA)
test_df = pd.read_csv(TEST)
标签轴承状态
0正常状态
1外圈故障、直径1类
2内圈故障、直径1类
3滚珠故障、直径1类
4外圈故障、直径2类
5内圈故障、直径2类
6滚珠故障、直径2类
7外圈故障、直径3类
8内圈故障、直径3类
9滚珠故障、直径3类

数据类别总体分布

sns.set()
sns.histplot(data=train_df.label, discrete=True);

在这里插入图片描述

轴承振动信号检视-时域

通过检视数据可以看到数据集中收集的是一个维度的振动信号,不同的标签对应的信号振幅应该有所不同。

image.png

f, ax = plt.subplots(5,2,figsize=(32,32))
state_list = [
    'Normal State',
    'Outer ring failure for 1st type diameter',
    'Inner ring failure for 1st type diameter',
    'Ball failure for 1st type diameter',
    'Outer ring failure for 2nd type diameter',
    'Inner ring failure for 2nd type diameter',
    'Ball failure for 2nd type diameter',
    'Outer ring failure for 3rd type diameter',
    'Inner ring failure for 3rd type diameter',
    'Ball failure for 3rd type diameter'
] 
for i in range(2):
    for j in range(5):
        ax[j][i].title.set_text(state_list[2*j+i])
        sns.lineplot(data=list(train_df[train_df.label==2*j+i].iloc[0][1:6001]), ax=ax[j][i]);

在这里插入图片描述

频域功率谱的分布

通过快速傅立叶变换对频域的功率谱做一个快速的可视化。

f, ax = plt.subplots(5,2,figsize=(32,32))
state_list = [
    'Normal State',
    'Outer ring failure for 1st type diameter',
    'Inner ring failure for 1st type diameter',
    'Ball failure for 1st type diameter',
    'Outer ring failure for 2nd type diameter',
    'Inner ring failure for 2nd type diameter',
    'Ball failure for 2nd type diameter',
    'Outer ring failure for 3rd type diameter',
    'Inner ring failure for 3rd type diameter',
    'Ball failure for 3rd type diameter'
] 
for i in range(2):
    for j in range(5):
        ax[j][i].title.set_text(state_list[2*j+i])
        fft = np.fft.fft(train_df[train_df.label==2*j+i].iloc[0][1:6001])
        sns.lineplot(data=(fft.real ** 2 - fft.imag ** 2), ax=ax[j][i]);

在这里插入图片描述

对数据进行分层抽样(Stratified Split)

对数据进行分层抽样,按照1:9的比例分出对应的测试数据集和训练数据集。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    train_df.id, 
    train_df.label, 
    test_size=0.1, 
    random_state=42,
    stratify=train_df.label
)

整理数据格式(Data Cleaning)

对原始数据进行清洗并且准备好神经网络接受的数据格式。

df_train = train_df.merge(X_train,on='id')
df_val = train_df.merge(X_test,on='id')

class BearingDataset(torch.utils.data.Dataset):
    def __init__(self, df):
        self.df = df

    def __getitem__(self, index: int):
        row = self.df.iloc[index]
        inputs = torch.tensor(row[1:6001]).unsqueeze(0)
        targets = torch.zeros(10)
        targets[int(row[-1])] = 1.
        
        return inputs.float(), targets
    def __len__(self):
        return len(self.df)

train_dataset = BearingDataset(
    df_train,
)

val_dataset = BearingDataset(
    df_val,
)

train_dataloader = torch.utils.data.DataLoader(
    train_dataset, num_workers=8, pin_memory=True, batch_size=batch_size)
val_dataloader = torch.utils.data.DataLoader(
    val_dataset, num_workers=8, pin_memory=True, batch_size=batch_size)

基于时域信号建立一维卷积神经网络

image.png

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv = torch.nn.Conv1d(1, 16, 8, stride=2)
        self.conv1 = torch.nn.Conv1d(16, 16, 8, stride=2)
        self.conv2 = torch.nn.Conv1d(16, 64, 4, stride=2)
        self.conv2_ = torch.nn.Conv1d(64, 64, 4, stride=2)
        self.conv3 = torch.nn.Conv1d(64, 256, 4, stride=2)
        self.conv3_ = torch.nn.Conv1d(256, 256, 4, stride=2)
        self.conv4 = torch.nn.Conv1d(256, 512, 2, stride=2)
        self.conv4_ = torch.nn.Conv1d(512, 512, 2, stride=2)
        self.maxpool =  torch.nn.MaxPool1d(2)
        self.gap = torch.nn.AvgPool1d(1)
        self.dropout = torch.nn.Dropout(0.3)
        self.fc = torch.nn.Linear(512, 10)
        self.act = torch.nn.ReLU()

    def forward(self, x):
        x = self.conv(x)
        x = self.act(x)
        
        x = self.conv1(x)
        x = self.act(x)
        x = self.maxpool(x)
        
        x = self.conv2(x)
        x = self.act(x)
        x = self.conv2_(x)
        x = self.act(x)
        x = self.maxpool(x)
        
        x = self.conv3(x)
        x = self.act(x)
        x = self.conv3_(x)
        x = self.act(x)
        x = self.maxpool(x)

        x = self.conv4(x)
        x = self.act(x)
        x = self.conv4_(x)
        x = self.act(x)
        x = self.maxpool(x)

        x = self.gap(x)
        x = self.dropout(x)
        x = x.permute(0, 2, 1)
        x = self.fc(x).squeeze()

        return x

模型训练(Training)

learning_rate = 1e-3
optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate, betas=(0.9, 0.999), eps=1e-08, weight_decay=1e-2, amsgrad=False)

model = Model()

def after_train_iteration_end(miner, *args, **kwargs):
    scheduler.step()
    miner.logger.info(f"current learning rate: {scheduler.get_last_lr()}")
    #miner.logger.info(f"current roc: {}")

def after_init(miner, *args, **kwargs):
    scheduler.step(miner.current_train_iteration)

miner = minetorch.Miner(
    code=os.getenv('CODE', f'baseline'),
    alchemistic_directory=os.getenv('ALCHEMISTIC_DIRECTORY', '/home/featurize/data/Bearing'),
    model=model.cuda(),
    optimizer=optimizer,
    train_dataloader=train_dataloader,
    val_dataloader=val_dataloader,
    max_epochs=30,
    in_notebook=True,
    loss_func=torch.nn.BCEWithLogitsLoss(),
    plugins=[ClassificationMetric()],
    #hooks={
    #    "after_train_iteration_end": after_train_iteration_end,
    #    "after_init": after_init
    #},
    trival=False,
    resume=False
)

miner.train()

F1 Score

F1 Score是一种量测方法的精确度常用的指标,经常用来判断算法的精确度。目前在辨识、侦测相关的算法中经常会分别提到精确率(precision)和召回率(recall),F-score能同时考虑这两个数值,平衡的反映这个算法的精确度。
在这里插入图片描述

测试数据集表现

通过30轮的神经网络训练,模型已经收敛,在测试数据集上表现良好。

f, ax = plt.subplots(1,2, figsize=(20,5))
ax[0].title.set_text('F1 Score')
ax[1].title.set_text('Accuracy')
sns.lineplot(data=list(ckpt['drawer_state']['f1']['f1'].values()), ax=ax[0]);
sns.lineplot(data=list(ckpt['drawer_state']['accuracy']['accuracy'].values()), ax=ax[1]);

在这里插入图片描述

F1:0.9965

准确率:0.99875

image.png

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
神经网络视频异常检测是一种利用神经网络模型来检测视频中的异常行为或事件的技术。它可以应用于视频监控、智能交通、工业生产等领域,帮助实时监测和识别异常情况,提高安全性和效率。 在神经网络视频异常检测中,通常会使用深度学习模型,如卷积神经网络(CNN)或循环神经网络(RNN),来对视频进行特征提取和建模。这些模型可以学习到视频中的空间和时间信息,并通过与正常行为相比较,检测异常行为。 具体的神经网络视频异常检测方法可以包括以下步骤: 1. 数据准备:收集并标注正常和异常视频数据集。 2. 特征提取:使用预训练的卷积神经网络模型提取视频帧的特征表示。 3. 序列建模:将提取的特征序列输入到循环神经网络或其他序列模型中,学习视频序列的时空关系。 4. 异常检测:通过比较当前视频序列与正常行为模型之间的差异,判断是否存在异常行为。 5. 阈值设置:根据实际需求和性能评估,设置适当的阈值来判定异常行为的存在与否。 神经网络视频异常检测具有以下优点: - 可以自动学习和适应不同场景下的异常行为,无需手动定义规则。 - 可以处理复杂的视频数据,包括动态和静态场景。 - 具有较高的准确性和鲁棒性,可以在复杂背景和光照条件下进行有效检测。 然而,神经网络视频异常检测也存在一些挑战: - 数据集的获取和标注需要大量的人力和时间成本。 - 模型的训练和调优需要大量的计算资源和时间。 - 对于新的异常行为,模型可能无法准确检测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dave 扫地工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值