본문 바로가기

프로젝트

예비 프로젝트(진동 데이터를 통한 이상탐지)-디지털 스마트 부산아카데미

선정한 데이터셋 (베어링 진동 데이터가 가장 많아서 선정)

전체 프로젝트는 열,진동,소리 데이터를 통한 3가지를 결합한 형태의 이상탐지이나, 내가 담당한 부분인 진동에 대해서만 서술하겠다.

https://www.kaggle.com/datasets/uysalserkan/fault-induction-motor-dataset

 

Machinery Fault Dataset

Induction Motor Faults Database

www.kaggle.com

데이터셋 설명

1행은 회전 주파수 측정을 위한 타코미터 신호 값

2~4행은 언더행 베어링 접선,축,반경 방향의 진동값

5~7행은 오버행 베어링 접선 축 반경 방향 진동값

마지막 행은 그 와중에 슈어 마이크를 통해 소음을 측정한 값

 

베어링 진동 이상탐지를 위해 이 중 베어링 언더행에 관해서만 3열을 사용하였고,

진동 데이터 설명에 1초당 51.2khz로 샘플링 됐다라고 언급,

이는 5초에 약 25만개 정도의 진동 데이터가 들어있다는 얘기였고, 

그러한 데이터가 총 49개가 들어있어 csv파일을 다 읽어들이면

약 250초에 대한 1200만개의 데이터가 있다라는 얘기가 된다.

언더행의 열만 잘라와서 불러온 모습

이상 신호를 탐지하는 것이 목적이기 때문에 시간에 따른 진폭만을 학습시켰고,

따로 주파수영역을 학습시키지 않았다.이는 시간의 흐름을 알 수 없는 정보이기 때문이다.

각 방향별 진폭값

앞서 언급했듯, 데이터가 1200만개정도 되기때문에 rtx 3080정도밖에 없는 내 시스템에서의 학습 시간에 대한 한계를 느껴 다운샘플링을 통해 학습량을 줄였다. 다운샘플링의 방식은 임의로 지정한 범위내 평균값으로 대체하는 방식으로 진행하였다.

10:1 비율로 줄이고 난 이후의 모습, 전과 큰 차이가 없다

이때 큰 차이가 없어도 결론적으로 진폭의 값이 줄어들게 되는데, 도메인 지식이 부족하여 여러 논문을 살펴본 결과 진동 데이터는 다운샘플링을 진행할 때 고주파 신호의 값이 줄어들게 되는데

이는 진동 데이터가 주로 저주파에 몰려있는 것을 감안할 때, 다운샘플링으로 인한 문제가 적을것으로 판단하였다. 왜냐하면 고주파는 대부분 노이즈일 것이기 때문이다.

또한 위의 시각화 자료에서 각 축별로 값의 범위가 다른 것을 알 수 있는데, 이는 모델 학습시에 악영향을 줄것으로 판단하여 민맥스 스케일링을 진행하였다. 

민맥스를 진행하여 값의 범위를 바꿈

또한, 데이터셋 자체가 시계열 데이터이므로 이를 감안해서 데이터셋을 순서에 맞게 자르는 형태로 테스트 및 학습, 검증 데이터를 만들었다. 이제 전처리를 다했으니 모델학습을 해야한다.

 

최종적으로 사용할 모델을 lstm-ae로 정했는데, 대부분의 진동 데이터 이상탐지를 국내 논문을 살펴본 결과 lstm-ae를 통해 진행하고 있는 것을 확인, 이를 먼저 해보고 다른 모델(iof,one class svm)등을 해봤으나 여전히 lstm-ae가 가장 좋아서 선택하였다.

내가 쌓은 lstm-ae층은 다음과 같다.

인코더 디코더 층 각각2층씩

깊게 쌓지는 않았다. 데이터자체가 250초정도로 짧은 시퀀스데이터이기도 하고, 그림을 보면 알겠지만 타입스텝이 1이다.

이렇게 된 이유는 앞서 언급했듯, 51.2khz정도로 샘플링 된 데이터였기 때문에 정상적인 판단이라면 타임스텝을 그에 맞게

500~1000을 해보거나 혹은

이미 다운샘플링 된 이후이기 때문에 200~500정도의 범위를 채용하여 1초의 시간을 다 담을 수 있게 하는게 맞는 판단이겠으나,

가장 큰 문제는 내 환경에서 그러한 범위를 설정하면 한번의 에포치에 약 6시간 정도 걸렸다.

이를 위해서 타임스텝을 1로 줄여서 설정할 시에는 140초정도로 크게 줄어든다.

이때문에 1이라는 극단적으로 짧은 타임 스텝을 설정했으나 이후의 환경이 개선되면 더 늘려보면서 성능을 체크해보는게 좋을 것이다.

 

그래도 꽤 알맞게 로스가 꾸준히 줄어들고 있다. 괜찮은 여건이었다면 더 많은 학습을 해도 될 것 같다

모델 별 성능 비교를 하기전 앞서 언급한 테스트 데이터 셋과 kaggle에서 6g를 모터위에 올려놓고 모터를 돌려서 만들어진 임의의 이상 데이터를 99:1비율로 섞어서 테스트를 진행했다는 것을 알린다.

이상을 잘 감지한다.

여기서 언급해야하는 것은 임계값 설정 부분이다.

임계값은 정상 데이터의 평균 재구성 오류에 3배의 표준 편차 추가로 정하였다.

이는 정상 데이터의 변동성을 감안, 99.7%의 정상데이터를 포함하는 범위를 뜻한다.

허나 실제 공장에서 이러한 .3%의 범위에도 꽤 많은 오류를 범할 수 있기 때문에 실제로 적용할 때는 각 데이터의 특성을 좀 더 반영하여 설정하는 것이 좋다.

이렇게 설정했을 때 임계값은

0.0027267734771949806

이라는 수치가 나오며 이를 토대로 측정된 결과와 다른 모델의 혼동 행렬끼리 비교를 하겠다.

0은 정상 1은 비정상을 뜻한다.

iof

 

one class svm

 

최종 선택모델인 lstm-ae

 

가장 비정상을 탐지를 못했으나 그래도 96% 높은 수치임을 감안 , 관리자가 초당 들어오는 정보를 본다는 가정

정상을 오탐지하는 비율이 가장 낮은 lstm-ae를 선택하였다.

 

돌아보며

이번 예비 프로젝트 진동 이상탐지 모델 개발 및 발표를 담당하면서 가장 머리속에 남는 내가 던진 질문은

임계값 설정이 어떻고 이렇고 이런 기술적 부분이 아닌

근본적으로 이렇게 개발한 모델을 어디다 쓸 수 있을까에서 멈춘 상태로 프로젝트를 진행하였는데,

아니나 다를까 실제로 교수님들이 발표때 지적해주신 부분도 대부분 이것을 어디다 쓸 수 있는지에 대한 고민이 부족한 상태라고 말씀해주셨다. 최종 프로젝트때는 좀 더 목적을 분명하게 만들어봐야겠다.