В этом примере показано, как выполнить диагностику отказа подшипника качения с помощью подхода глубокого обучения. Пример демонстрирует, как классифицировать отказы подшипника путем преобразования 1D сигналов вибрации подшипника в 2D изображения scalograms и применения передачи обучения с помощью предварительно обученной сети. Передача обучения значительно уменьшает время, проведенное на извлечении признаков и выборе признаков в обычных подходах диагностики подшипника, и обеспечивает хорошую точность для небольшого набора данных MFPT, используемого в этом примере.
Чтобы запустить этот пример, перейдите к https://github.com/mathworks/RollingElementBearingFaultDiagnosis-Data, загрузите целый репозиторий как zip-файл и сохраните его в той же директории как live скрипт.
Отказы подшипника качения
Локализованные отказы в подшипнике качения могут произойти во внешней гонке, внутренней гонке, клетке или прокручивающемся элементе. Высокочастотные резонансы между подшипником и преобразователем ответа взволнованы, когда прокручивающиеся элементы ударяют локальный отказ на внешней или внутренней гонке, или отказ на прокручивающемся элементе ударяет внешнюю или внутреннюю гонку [1]. Следующий рисунок показывает прокручивающийся элемент, ударяющий локальный отказ на внутренней гонке. Типичная проблема обнаруживает и идентифицирует эти отказы.
Данные о проблеме MFPT [2] содержат 23 набора данных, собранные из машин при различных условиях отказа. Первые 20 наборов данных собраны из тестовой буровой установки подшипника, с три под хорошими состояниями, три с внешними отказами гонки при постоянной загрузке, семь с внешними отказами гонки при различных загрузках, и семь с внутренними отказами гонки при различных загрузках. Остающиеся три набора данных от реальных машин: подшипник нефтяного насоса, промежуточный подшипник скорости и подшипник планеты. Местоположения отказа неизвестны. В этом примере вы используете только данные, собранные от тестовой буровой установки с известными условиями.
Каждый набор данных содержит ускоряющий сигнал gs
, частота дискретизации sr
, скорость вала rate
, вес загрузки load
, и четыре критических частоты, представляющие различные местоположения отказа: частота передачи мяча внешняя гонка (BPFO), частота передачи мяча внутренняя гонка (BPFI), основной принцип обучает частоту (FTF) и частота вращения мяча (BSF). Формулы для BPFO и BPFI можно следующим образом [1].
BPFO:
BPFI:
Как показано на рисунке, диаметр мяча и диаметр тангажа. Переменная скорость вала, количество прокручивающихся элементов, и угол контакта подшипника [1].
Чтобы извлечь выгоду из предварительно обученного 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
trainingOptions
(Deep Learning Toolbox) | trainNetwork
(Deep Learning Toolbox) | squeezenet
(Deep Learning Toolbox) | analyzeNetwork
(Deep Learning Toolbox) | layerGraph
(Deep Learning Toolbox) | convolution2dLayer
(Deep Learning Toolbox) | classificationLayer
(Deep Learning Toolbox) | replaceLayer
(Deep Learning Toolbox) | classify
(Deep Learning Toolbox) | confusionchart
(Deep Learning Toolbox)