본문 바로가기
프로젝트

[프로젝트] 딥러닝을 활용한 치매 예측 및 예방 프로젝트 리뷰

by 단깅수 2024. 7. 4.
728x90

2024년 1학기 딥러닝 과목을 수강하면서 진행했던 프로젝트에 대해 리뷰해보려고 한다.

해당 프로젝트는 아이디어 기획 프로젝트이고 분야는 CV, Multi-Modal 이 되겠다.

 

주제 선정 배경

사실 어떤 주제로 프로젝트를 시작해볼까에 대해 많은 고민이 있었다.

주로 재미있어 보이는 주제로 할 것인가, 사회적으로 영향이 있고 의미있는 주제로 할 것인가에 대한 고민이었다.

하지만 의료 분야를 한 번쯤은 다뤄보고 싶었고 얼마 전에 진행되었던 D & A 학회 선배 초청 강연회에서도의학 분야가 아무래도 인공지능이 들어서기에는 불확실성의 여지가 많아 발전이 더디고 있다는 말을 들어 관심이 더욱 갔다.그래서 사회적인 의미도 챙기면서 의학 분야에 대한 연구도 하면서 꿩먹고 알먹고 도랑치고 가재잡고 일석이조 계획을 세웠다.

 

https://www.100ssd.co.kr/news/articleView.html?idxno=81109 https://www.yna.co.kr/view/GYH20190507001500044

 

그래프를 가져왔지만 누구나 고령화 문제가 심각하다는 것은 알고 있을 거라 생각한다.

게다가 치매 인구도 증가하고 있고 치매는 한국뿐만 아니라 전 세계적인 사회적 문제이다.

치매 질환은 완치가 불가능한 질환으로 알려져 있지만 조기 진단해 예방함으로써 나아지도록 할 수는 있다.

그리고 치매 환자가 늘어나면 의료비 등 국가적으로 사용해야 하는 비용이 증가해 정부의 부담이 될 수 있다.

따라서 세계적으로 치매 예방에 대한 연구가 활발히 진행 중이고 필자도 탑승해보았다.

본 프로젝트의 목적은 <치매를 조기진단해 예측 및 예방> 하는 것이다.


선행 연구 조사

 

3가지 선행 연구를 조사했고 이번 포스팅에서는 필자가 조사한 뇌파 데이터 활용 연구 DEMNET에 대해서만 간략하게 소개를 하려고 한다.

DEMNET: A Deep Learning Model for Early Diagnosis of Alzheimer Diseases and Dementia From MR Images

저자 : Suriya Murugan; Chandran Venkatesan; M. G. Sumithra; Xiao-Zhi Gao; B. Elakkiya; M. Akila; S. Manoharan
https://ieeexplore.ieee.org/document/9459692
<논문 요약>
본 논문은 치매의 주요한 원인 중 알츠하이머의 정확한 진행 단계를 예측할 수 있는 모델인 DEMNET을 제안한다. 데이터셋은 Kaggle의 MRI Dataset을 활용했다고 한다. 알츠하이머 단계를 정상, 경도 인지 장애, 중중도 치매, 심각한 치매의 4단계로 분류한다.
https://ieeexplore.ieee.org/document/9459692
하지만 이 데이터셋은 불균형이 심한 문제가 있었고 이를 해결하기 위해 SMOTE 기법을 적용하였다. 각 클래스별 데이터셋 개수를 맞춰주어 실험을 진행했고 그 결과 성능이 올랐다는 결과를 내었다. 또한, 제한된 데이터셋임에도 불구하고 뛰어난 일반화 능력으로 메모리와 처리 속도 측면에서 주목할 만한 성과를 달성한 연구라고 할 수 있겠다.

DEMNET 모델 구현

## DEMNET Block 클래스 정의
class DEMNetBlock(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(DEMNetBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
        self.batchnorm = nn.BatchNorm2d(out_channels)
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)

    def forward(self, x):
        x = self.relu(self.conv1(x))
        x = self.batchnorm(self.relu(self.conv2(x)))
        x = self.maxpool(x)
        return x

## DEMNET Block을 이용한 DEMNET 구조 클래스 정의
class DEMNet(nn.Module):
    def __init__(self):
        super(DEMNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)  ## 첫 번째 Conv 레이어
        self.relu = nn.ReLU(inplace=True)
        
        self.block1 = DEMNetBlock(16, 32)
        self.block2 = DEMNetBlock(32, 64)
        self.block3 = DEMNetBlock(64, 128)
        self.block4 = DEMNetBlock(128, 256)
        
        self.dropout1 = nn.Dropout(0.5)
        self.dropout2 = nn.Dropout(0.5)
        
        self.flatten = nn.Flatten()
        self.dense1 = nn.Linear(30976, 512)  ## Flatten 후 첫 번째 Dense 레이어
        self.dense2 = nn.Linear(512, 128)
        self.dense3 = nn.Linear(128, 64)
        self.output = nn.Linear(64, 4)  ## 출력 클래스 수는 4개
        self.softmax = nn.Softmax(dim=1)
    
    def forward(self, x):
        x = self.relu(self.conv1(x))
        x = self.block1(x)
        x = self.block2(x)
        x = self.block3(x)
        x = self.block4(x)
        x = self.dropout1(x)
        x = self.flatten(x)
        x = self.relu(self.dense1(x))
        x = self.dropout2(self.relu(self.dense2(x)))
        x = self.relu(self.dense3(x))
        x = self.softmax(self.output(x))
        return x

연구에 활용할 데이터셋

1) MRI 뇌파 사진 데이터

 

2) 일상생활 라이프로그 데이터

  • https://aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&aihubDataSe=realm&dataSetSn=226
  • 헬스케어 웨어러블 기반 치매 고위험군 병리진단으로 정의된 치매 진행 단계별 라이프로그 학습용 데이터셋
  • 센서 데이터, 텍스트 데이터로 구성
  • 구체적인 구축 내용 및 제공 데이터 양
    • 수면정보 로그 데이터 - 15,000건 수집
    • 걸음정보 및 생활 로그 데이터 - 15,000건 수집
    • 인지기능 데이터 (MMSE) - 9,000건 수집
  • MMSE : 인지기능 진단 텍스트 데이터

3) 인지기능 진단 필기 데이터

  • https://www.kaggle.com/datasets/taeefnajib/handwriting-data-to-detect-alzheimers-disease
  • 알츠하이머 환자들과 정상 대조군의 손글씨 분석을 통해 기존 기계학습 방법론을 개선할 수 있도록 만들어진 데이터셋
  • 필기 동작을 기반으로 한 수치 데이터
  • 포함 내용
    • 시간적 특성 : 필기 도구가 공중에 있던 체공 시간 등
    • 공간적 특성 : 필기 도구의 x축 및 y축 확장 등
    • 속도 관련 특성 : 종이 위에서 평균 속도 등
    • 압력 관련 특성 : 필기 중 측정된 압력의 평균과 분산 등
    • 동작 관련 특성 : 필기 도구가 종이에 닿는 횟수 등

문제 정의 및 방법론 제안

다양한 형태의 데이터셋을 활용함으로써 기존 연구의 한계점을 보완하려고 하였으나 문제에 직면하였다.

바로 데이터셋 별로 클래스 분류 기준도 다르고 클래스 개수도 다르다는 점이었다.

이에 대한 해결책으로 3가지 방법을 제안하였다.

아래는 그 3가지 방법론에 대한 내용이다.

 

위 3가지 방법 중 필자는 가중 평균 방식이 가장 정확도를 높일 수 있는 방법이라고 생각해 2번을 채택했다.

아무래도 의학 분야이기 때문에 치매 환자임에도 불구하고 치매 환자가 아니라고 분류하는 그런 경우를 최대한 배제해야 하기에 정확도를 가장 우선순위로 삼았다.

만약 비용과 시간을 우선순위로 본다면 3번을 채택할 수도 있을 것이다.

그렇다면 각 클래스 분류를 어떻게 합치고 어떤 논리적인 근거에 기반해 기준을 세울 것인가에 대한 문제가 남았다.

아래는 이에 대한 제안 방법론 및 워크 플로우이다.

아무래도 클래스끼리 비교를 할 수가 없어 각 클래스를 수치화해 가중합하는 방식을 고안해냈다.

가중합 후에는 반올림을 통해 계산하는 방식이다.

이 부분에 대해 이해가 잘 되지 않는다면 아래 예시를 참고할 것.

  • 예시 1
    • MRI에서 정상, 인지기능에서 정상, 필기에서 알츠하이머로 분류
    • 0 x 0.5 + 0 x 0.3 + 1 x 0.2 = 0.2 (반올림해서 정상으로 진단)
  • 예시 2
    • MRI에서 정상, 인지기능에서 경도 치매, 필기에서 알츠하이머로 분류
    • 0 x 0.5 + 1 x 0.3 + 1 x 0.2 = 0.5 (반올림해서 경도 치매로 진단)
  • 예시 3
    • MRI에서 심각한 치매, 인지기능에서 심각한 치매, 필기에서 알츠하이머로 분류
    • 1 x 0.5 + 1 x 0.3 + 1 x 0.2 = 2.6 (반올림해서 심각한 치매로 진단)

 

오늘은 이번 학기 딥러닝 과목에서 수행했던 프로젝트 리뷰에 대해 포스팅을 적었다.의학 분야의 연구가 활발히 진행되고 있음에도 불구하고 실제 적용 사례에 대한 소식이 아직은 소수인 듯하다.연구 윤리를 철저히 지키고 정확도를 향상한다면 앞으로 의학 분야에도 AI가 무궁무진하게 쓰일 수 있다고 생각한다.

 

728x90