Диагностика отказа подшипника качения Используя глубокое обучение

В этом примере показано, как выполнить диагностику отказа подшипника качения с помощью подхода глубокого обучения. Пример демонстрирует, как классифицировать отказы подшипника путем преобразования 1D сигналов вибрации подшипника в 2D изображения scalograms и применения передачи обучения с помощью предварительно обученной сети. Передача обучения значительно уменьшает время, проведенное на извлечении признаков и выборе признаков в обычных подходах диагностики подшипника, и обеспечивает хорошую точность для небольшого набора данных MFPT, используемого в этом примере.

Чтобы запустить этот пример, перейдите к https://github.com/mathworks/RollingElementBearingFaultDiagnosis-Data, загрузите целый репозиторий как zip-файл и сохраните его в той же директории как live скрипт.

Отказы подшипника качения

Локализованные отказы в подшипнике качения могут произойти во внешней гонке, внутренней гонке, клетке или прокручивающемся элементе. Высокочастотные резонансы между подшипником и преобразователем ответа взволнованы, когда прокручивающиеся элементы ударяют локальный отказ на внешней или внутренней гонке, или отказ на прокручивающемся элементе ударяет внешнюю или внутреннюю гонку [1]. Следующий рисунок показывает прокручивающийся элемент, ударяющий локальный отказ на внутренней гонке. Типичная проблема обнаруживает и идентифицирует эти отказы.

Данные о проблеме Технологии предотвращения отказа машинного оборудования (MFPT)

Данные о проблеме MFPT [2] содержат 23 набора данных, собранные из машин при различных условиях отказа. Первые 20 наборов данных собраны из тестовой буровой установки подшипника, с три под хорошими состояниями, три с внешними отказами гонки при постоянной загрузке, семь с внешними отказами гонки при различных загрузках, и семь с внутренними отказами гонки при различных загрузках. Остающиеся три набора данных от реальных машин: подшипник нефтяного насоса, промежуточный подшипник скорости и подшипник планеты. Местоположения отказа неизвестны. В этом примере вы используете только данные, собранные от тестовой буровой установки с известными условиями.

Каждый набор данных содержит ускоряющий сигнал gs, частота дискретизации sr, скорость вала rate, вес загрузки load, и четыре критических частоты, представляющие различные местоположения отказа: частота передачи мяча внешняя гонка (BPFO), частота передачи мяча внутренняя гонка (BPFI), основной принцип обучает частоту (FTF) и частота вращения мяча (BSF). Формулы для BPFO и BPFI можно следующим образом [1].

  • BPFO:

BPFO=nfr2(1-dDcosϕ)

  • BPFI:

BPFI=nfr2(1+dDcosϕ)

Как показано на рисунке, d диаметр мяча и D диаметр тангажа. Переменная fr скорость вала, n количество прокручивающихся элементов, и ϕ угол контакта подшипника [1].

Scalogram подшипника данных

Чтобы извлечь выгоду из предварительно обученного CNN глубоким сетям, используйте plotBearingSignalAndScalogram функция помощника, чтобы преобразовать 1D сигналы вибрации в наборе данных MFPT к 2D scalograms. scalogram является представлением частотного диапазона времени исходного сигнала временной области [3]. Эти две размерности в изображении scalogram представляют время и частоту. Чтобы визуализировать отношение между scalogram и его исходным сигналом вибрации, постройте сигнал вибрации с внутренним отказом гонки против его scalogram.

% Import data with inner race fault
data_inner = load(fullfile(matlabroot, 'toolbox', 'predmaint', ...
    'predmaintdemos', 'bearingFaultDiagnosis', ...
    'train_data', 'InnerRaceFault_vload_1.mat'));
% Plot bearing signal and scalogram
plotBearingSignalAndScalogram(data_inner)

В течение этих 0,1 секунд, показанных в графике, сигнал вибрации содержит 12 импульсов, потому что BPFI протестированного подшипника составляет 118,875 Гц. Соответственно, scalogram показывает 12 отличных peaks, которые выравниваются с импульсами в сигнале вибрации. Затем визуализируйте scalograms для внешнего отказа гонки.

% Import data with outer race fault
data_outer = load(fullfile(matlabroot, 'toolbox', 'predmaint', ...
    'predmaintdemos', 'bearingFaultDiagnosis', ...
    'test_data', 'OuterRaceFault_3.mat'));
% Plot original signal and its scalogram
plotBearingSignalAndScalogram(data_outer)

scalogram внешнего отказа гонки показывает 8 отличных peaks в течение первых 0,1 секунд, который сопоставим с ballpass частотами. Поскольку импульсы в сигнале временной области не являются столь же доминирующими как во внутреннем случае отказа гонки, отличный peaks в scalogram показывает меньше контраста с фоном. scalogram нормального состояния не показывает доминирующий отличный peaks.

% Import normal bearing data
data_normal = load(fullfile(matlabroot, 'toolbox', 'predmaint', ...
    'predmaintdemos', 'bearingFaultDiagnosis', ...
    'train_data', 'baseline_1.mat'));
% Plot original signal and its scalogram
plotBearingSignalAndScalogram(data_normal)

Количество отличного peaks является хорошей функцией, чтобы дифференцироваться между внутренними отказами гонки, внешними отказами гонки и нормальными условиями. Поэтому scalogram может быть хорошим кандидатом на классификацию отказов подшипника. В этом примере все измерения сигнала подшипника прибывают из тестов с помощью той же скорости вала. Чтобы применить этот пример к подшипнику сигналов под различными скоростями вала, данные должны быть нормированы на скорость вала. В противном случае количество "столбов" в scalogram будет неправильным.

Подготовьте обучающие данные

Разархивируйте загруженный файл.

if exist('RollingElementBearingFaultDiagnosis-Data-master.zip', 'file')
    unzip('RollingElementBearingFaultDiagnosis-Data-master.zip')
end

Загруженный набор данных содержит обучающий набор данных с 14 MAT-файлами (2 нормальных, 4 внутренних отказа гонки, 7 внешних отказов гонки) и набор данных тестирования с 6 MAT-файлами (1 нормальное, 2 внутренних отказа гонки, 3 внешних отказа гонки).

Путем присвоения указателей на функцию ReadFcn, datastore ансамбля файла может перейти в файлы, чтобы получить данные в нужном формате. Например, данные MFPT имеют структуру bearing это хранит сигнал вибрации gs, частота дискретизации sr, и так далее. Вместо того, чтобы возвратить саму структуру подшипника, readMFPTBearing функция записана так, чтобы datastore ансамбля файла возвратил сигнал вибрации gs в bearing структура данных.

fileLocation = fullfile('.', 'RollingElementBearingFaultDiagnosis-Data-master', 'train_data');
fileExtension = '.mat';
ensembleTrain = fileEnsembleDatastore(fileLocation, fileExtension);
ensembleTrain.ReadFcn = @readMFPTBearing;
ensembleTrain.DataVariables = ["gs", "sr", "rate", "load", "BPFO", "BPFI", "FTF", "BSF"];
ensembleTrain.ConditionVariables = ["Label", "FileName"];
ensembleTrain.SelectedVariables = ["gs", "sr", "rate", "load", "BPFO", "BPFI", "FTF", "BSF", "Label", "FileName"]
ensembleTrain = 
  fileEnsembleDatastore with properties:

                 ReadFcn: @readMFPTBearing
        WriteToMemberFcn: []
           DataVariables: [8×1 string]
    IndependentVariables: [0×0 string]
      ConditionVariables: [2×1 string]
       SelectedVariables: [10×1 string]
                ReadSize: 1
              NumMembers: 14
          LastMemberRead: [0×0 string]
                   Files: [14×1 string]

Теперь преобразуйте 1D сигналы вибрации в scalograms и сохраните образы для обучения. Размер каждого scalogram 227 227 3, который является тем же входным размером, требуемым SqueezeNet. Чтобы улучшить точность, помощник функционирует convertSignalToScalogram окутывает необработанный сигнал и делит его на несколько сегментов. После выполнения следующих команд папка, названная "train_image", появляется в текущей папке. Все scalogram изображения сигналов подшипника в папке "RollingElementBearingFaultDiagnosis-Data-master/train_data" сохранены в "train_image" папке.

reset(ensembleTrain)
while hasdata(ensembleTrain)
  folderName = 'train_image';
  convertSignalToScalogram(ensembleTrain,folderName);
end

Создайте datastore изображений и разделите обучающие данные в наборы данных обучения и валидации, с помощью 80% изображений от "train_image" папки для обучения и 20% для валидации.

% Create image datastore to store all training images
path = fullfile('.', folderName);
imds = imageDatastore(path, ...
  'IncludeSubfolders',true,'LabelSource','foldernames');
% Use 20% training data as validation set
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.8,'randomize');

Обучите сеть с передачей обучения

Затем подстройте предварительно обученную сверточную нейронную сеть SqueezeNet, чтобы выполнить классификацию на scalograms. SqueezeNet был обучен на более чем миллионе изображений и изучил богатые представления функции. Передача обучения обычно используется в применении глубокого обучения. Можно взять предварительно обученную сеть и использовать ее в качестве начальной точки для новой задачи. Подстройка сети с передачей обучения обычно намного быстрее и легче, чем обучение сети со случайным образом инициализированными весами с нуля. Можно быстро передать изученные функции с помощью меньшего числа учебных изображений. Загрузите и просмотрите сеть SqueezeNet:

net = squeezenet
net = 
  DAGNetwork with properties:

         Layers: [68×1 nnet.cnn.layer.Layer]
    Connections: [75×2 table]
     InputNames: {'data'}
    OutputNames: {'ClassificationLayer_predictions'}

analyzeNetwork(net)

SqueezeNet использует сверточный слой 'conv10'чтобы извлечь функции изображений и слой классификации 'ClassificationLayer_predictions'чтобы классифицировать входное изображение. Эти два слоя содержат информацию, чтобы сочетать функции, которые сеть извлекает в вероятности класса, значение потерь и предсказанные метки. Переобучать SqueezeNet для классификации новых изображений, сверточные слои 'conv10'и слой классификации 'ClassificationLayer_predictions'должен быть заменен новыми слоями, адаптированными к изображениям подшипника.

Извлеките график слоев из обучившего сеть.

lgraph = layerGraph(net);

В большинстве сетей последний слой с learnable весами является полносвязным слоем. В некоторых сетях, таких как SqueezeNet, последний learnable слой является сверточным слоем 1 на 1 вместо этого. В этом случае замените сверточный слой на новый сверточный слой со многими фильтрами, равными количеству классов.

numClasses = numel(categories(imdsTrain.Labels));

newConvLayer = convolution2dLayer([1, 1],numClasses,'WeightLearnRateFactor',10,'BiasLearnRateFactor',10,"Name",'new_conv');
lgraph = replaceLayer(lgraph,'conv10',newConvLayer);

Слой классификации задает выходные классы сети. Замените слой классификации на новый без меток класса. trainNetwork автоматически устанавливает выходные классы слоя в учебное время.

newClassificationLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassificationLayer);

Задайте опции обучения. Чтобы замедлить изучение в переданных слоях, установите начальную скорость обучения на маленькое значение. Когда вы создаете сверточный слой, вы включаете большие факторы скорости обучения, чтобы ускорить изучение в новых последних слоях. Эта комбинация настроек скорости обучения приводит к быстрому изучению только в новых слоях и более медленном изучении в других слоях. При использовании обучение с переносом вы не должны обучаться для как много эпох. Эпоха является полным учебным циклом на целом обучающем наборе данных. Программное обеспечение проверяет сеть каждый ValidationFrequency итерации во время обучения.

options = trainingOptions('sgdm', ...
  'InitialLearnRate',0.0001, ...
  'MaxEpochs',4, ...
  'Shuffle','every-epoch', ...
  'ValidationData',imdsValidation, ...
  'ValidationFrequency',30, ...
  'Verbose',false, ...
  'MiniBatchSize',20, ...
  'Plots','training-progress');

Обучите сеть, которая состоит из переданных и новых слоев. По умолчанию, trainNetwork использует графический процессор, если у вас есть Parallel Computing Toolbox™ и поддерживаемое устройство графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox). В противном случае, trainNetwork использует центральный процессор. Можно также задать среду выполнения при помощи 'ExecutionEnvironment' аргумент значения имени trainingOptions.

net = trainNetwork(imdsTrain,lgraph,options);

Подтвердите Используя наборы тестовых данных

Используйте сигналы подшипника в папке "RollingElementBearingFaultDiagnosis-Data-master/test_data", чтобы подтвердить точность обучившего сеть. Тестовые данные должны быть обработаны таким же образом как обучающие данные.

Создайте datastore ансамбля файла, чтобы сохранить сигналы вибрации подшипника в тестовой папке.

fileLocation = fullfile('.', 'RollingElementBearingFaultDiagnosis-Data-master', 'test_data');
fileExtension = '.mat';
ensembleTest = fileEnsembleDatastore(fileLocation, fileExtension);
ensembleTest.ReadFcn = @readMFPTBearing;
ensembleTest.DataVariables = ["gs", "sr", "rate", "load", "BPFO", "BPFI", "FTF", "BSF"];
ensembleTest.ConditionVariables = ["Label", "FileName"];
ensembleTest.SelectedVariables = ["gs", "sr", "rate", "load", "BPFO", "BPFI", "FTF", "BSF", "Label", "FileName"];

Преобразуйте 1D сигналы в 2D scalograms.

reset(ensembleTest)
while hasdata(ensembleTest)
  folderName = 'test_image';
  convertSignalToScalogram(ensembleTest,folderName);
end

Создайте datastore изображений, чтобы сохранить тестовые изображения.

path = fullfile('.','test_image');
imdsTest = imageDatastore(path, ...
  'IncludeSubfolders',true,'LabelSource','foldernames');

Классифицируйте тестовый datastore изображений с обучившим сеть.

YPred = classify(net,imdsTest,'MiniBatchSize',20);

Вычислите точность предсказания.

YTest = imdsTest.Labels;
accuracy = sum(YPred == YTest)/numel(YTest)
accuracy = 0.9957

Постройте матрицу беспорядка.

figure
confusionchart(YTest,YPred)

Когда вы обучаете сеть многократно, вы можете видеть некоторое изменение точности между обучением, но средняя точность должна составить приблизительно 98%. Даже при том, что набор обучающих данных вполне мал, этот пример преимущества от передачи обучения и достигает хорошей точности.

Заключение

Этот пример демонстрирует, что глубокое обучение может быть эффективным инструментом, чтобы идентифицировать различные типы отказов в подшипнике качения, даже когда размер данных относительно мал. Подход глубокого обучения уменьшает время, когда обычный подход требует для разработки функции. Для сравнения смотрите Диагностику отказа Подшипника качения в качестве примера.

Ссылки

[1] Рэндалл, Роберт Б. и Жером Антони. “Диагностика Подшипника качения — Пример”. Механические Системы и Обработка сигналов 25, № 2 (февраль 2011): 485–520. https://doi.org/10.1016/j.ymssp.2010.07.017.

[2] Bechhoefer, Эрик. "Основанная на условии База данных Отказа Обслуживания для Тестирования Диагностики и Предвещающих Алгоритмов". 2013. https://mfpt.org/fault-data-sets/.

[3] Verstraete, Дэвид, Андрес Феррада, Энрике Лопес Дрогетт, Вивиана Меруэн и Мохаммад Модаррес. “Глубокое обучение Enabled Диагностика отказа Используя Анализ изображения Частоты Времени Подшипников качения”. Шок и Вибрация 2017 (2017): 1–17. https://doi.org/10.1155/2017/5067651.

Функции помощника

function plotBearingSignalAndScalogram(data)
% Convert 1-D bearing signals to scalograms through wavelet transform
fs = data.bearing.sr;
t_total = 0.1; % seconds
n = round(t_total*fs);
bearing = data.bearing.gs(1:n);
[cfs,frq] = cwt(bearing,'amor', fs);

% Plot the original signal and its scalogram
figure
subplot(2,1,1)
plot(0:1/fs:(n-1)/fs,bearing)
xlim([0,0.1])
title('Vibration Signal')
xlabel('Time (s)')
ylabel('Amplitude')
subplot(2,1,2)
surface(0:1/fs:(n-1)/fs,frq,abs(cfs))
shading flat
xlim([0,0.1])
ylim([0,max(frq)])
title('Scalogram')
xlabel('Time (s)')
ylabel('Frequency (Hz)')
end

function convertSignalToScalogram(ensemble,folderName)
% Convert 1-D signals to scalograms and save scalograms as images
data = read(ensemble);
fs = data.sr;
x = data.gs{:};
label = char(data.Label);
fname = char(data.FileName);
ratio = 5000/97656;
interval = ratio*fs;
N = floor(numel(x)/interval);

% Create folder to save images
path = fullfile('.',folderName,label);
if ~exist(path,'dir')
  mkdir(path);
end

for idx = 1:N
  sig = envelope(x(interval*(idx-1)+1:interval*idx));
  cfs = cwt(sig,'amor', seconds(1/fs));
  cfs = abs(cfs);
  img = ind2rgb(im2uint8(rescale(flip(cfs))),jet(320));
  outfname = fullfile('.',path,[fname '-' num2str(idx) '.jpg']);
  imwrite(imresize(img,[227,227]),outfname);
end
end

Смотрите также

(Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox)

Похожие темы

Внешние веб-сайты