B2I-GAN: Anomaly detection from imaged ECG using GAN
ECG(electrocardiogram) 데이터는 심장 및 혈관 장애 분석에 많이 쓰이는 데이터다.
이를 이용한 기존의 연구들은 일차원 상태인 원본 데이터를 사용해왔다.
우리는 STFT(Short-time Fourier transform)를 이용해 데이터를 이차원으로 확장시키고, 시간에 따른 주파수 영역의 분포를 분석하여 특징을 추출하여 분류하고, GAN을 이용해 비정상 데이터-생성된 정상 데이터의 차이를 보여줌으로서 어느 부분이 비정상인지 사용자에게 보여주고자 한다.
구성원
Professor
- 박경문 ### Student
- 2018110654 이해님
- 2016104106 김민석
연구 배경
고혈압 등 성인병 발생 비율이 증가함에 따라 심장 질환에 시달리는 사람들도 많아지고 있다. 심장 질환에 대해 진단하기 위해서는 ECG 데이터를 수집 후 심부전 관련 진단을 내린다. 현재 이와 관련된 딥러닝 연구들이 있지만, 정확도가 0.95를 넘지 못하고 있다. 이는 시계열 데이터에서 추출할 수 있는 특징에 한계가 있어 나타나는 현상이라 본다.
연구 목표
본 연구에서는 ECG데이터의 새로운 특징을 추출하기 위해 시계열 데이터(1차원)를 STFT 변환을 통해 2차원 데이터를 얻어 분석하는 모델을 만들어 심부전 탐지를 하고자 한다. 정상 데이터를 이용해 학습을 진행하고 비정상 데이터를 input시 생성된 정상데이터의 output을 받아 어느부분이 잘못되었는지 보여줄 수 있을것으로 기대된다.
전체 흐름
1. 데이터 전처리 데이터를 STFT 변환을 하여 저장한다.
2. Normal Data 학습{: width="50" height="50"} AE 기반의 Generator와 Discriminator를 통해 모델을 학습시킨다. 결과적으로 데이터 입력 시 정상데이터에 근접한 이미지를 출력해 준다.
3. 비정상 데이터 입력 시{: width="50" height="50"} 비정상 데이터 입력 시 생성된 이미지와 비교하여 정상인지, 비정상이면 어떤 종료인지 판별해 준다.
Dataset
해당 연구에 사용한 데이터는 MIT-BIH Arrhythmia Database이다. 이 데이터베이스는 다양한 종류의 심부전증을 나타내는 데이터를 포함하고 있으며 ECG 딥러닝 분야의 많은 연구에서 사용되어 왔다. 내부 데이터는 초당 360Hz로 sampling된 신호로, 우리는 이 전체 샘플 중 가장 특징을 잘 나타내는 II-lead에 대해 정상 신호(N) SVE (S), VEBs (V)를 앓고 있는 환자의 ECG 신호를 추출해 GAN의 입력 데이터로 사용하였다. 다운로드 링크는 아래와 같다.
다운받은 데이터는 /experiments/ecg/dataset/preprocessed/ano0 에 넣어준다.
Require
- Python 3
Packages
- PyTorch (1.0.0)
- scikit-learn (0.20.0)
- biosppy (0.6.1) # For data preprocess
- tqdm (4.28.1)
- matplotlib (3.0.2)
사용법
데이터 전처리
원본 데이터를 STFT로 변경하여 저장해야 한다. /experiments/ecg/dataset/preprocessed에 존재하는 change.py, change2.py를 하위 디렉토리 /ano0에 넣은 후 순서대로 실행하면 된다.
실행
- train/test를 정하기 위해 run_ecg.sh 파일을 수정해야 한다. {: width="50" height="50"} test 값이 0이면 train, 1이면 test이다.
- 실행의 명령어는
run_ecg.sh
파일이 존재하는 디렉토리에서 다음과 같이 입력한다.
/bin/bash run_ecg.sh
결과
Model | AUC | AP |
---|---|---|
AE | 0.8944 | 0.8415 |
AnoGAN | 0.8642 | 0.8035 |
Ganomaly | 0.9083 | 0.8701 |
BeatGAN | 0.9447 | 0.9143 |
B2I-GAN | 0.9460 | 0.9058 |