아이펠에서 아이펠톤이라는 이름으로 프로젝트를 진행했습니다.
여기서 저는 DR그알이라는 팀을 만들고, 팀장 역할을 맡아 프로젝트를 진행했습니다.
사용했던 코드와 최종 발표자료는 https://github.com/mkk4726/DR-GeuAl 여기서 확인할 수 있습니다.
제 기술블로그에 어떤 프로젝트를 했는지 간단히 정리해보려고 합니다.
자세한 내용은 발표자료와 발표영상을 확인해주세요.
1. 팀이름 : DR 그알
DR (Diabetic Retinopathy, 당뇨병성 망막병증) 그알 (그것이 알고 싶다) 을 뜻합니다.
나름 라임을 맞춰서 센스있게 지어봤습니다.
팀이름처럼 DR과 관련된 프로젝트를 진행했습니다.
뒤에서 설명하겠지만 비증식성 DR을 segmentation 했습니다.
2. DR이란?
당뇨병 환자들은 만성적인 높은 혈당을 가지는데 이는 혈관을 손상시킵니다.
처음에는 혈관이 터지는 비증식성 DR에서 증식성 DR로 발전하게 됩니다.
비증식성 DR에서는 별다른 증상이 없다가 증식성 DR로 발전하게 되면 갑작스런 시력 저하, 실명 발생하게 됩니다.
따라서 비증식성 DR을 발견하고 조기에 치료하는게 굉장히 중요합니다.
3. 데이터셋
사용한 데이터셋은 FGADR 데이터셋으로 그림 2의 논문에서 제공하는 데이터셋입니다.
비증식성 DR에는 대표적인 4개의 병변이 있는데, 이에 대한 마스크를 제공하며 총 1842개가 있습니다.
4. 사용한 전처리 기법 : CLAHE
그림3처럼 인풋이미지가 흐린 경우 모델이 잘 못맞추게 됩니다.
따라서 이미지의 특징을 잘 뽑아내야 했고, CLAHE라는 기법을 적용했습니다.
적용결과 특징이 훨씬 잘 나타나게 됐고, 모델의 결과도 향상되었습니다.
CLAHE에 대한 자세한 설명은 발표자료에 있습니다.
5. 사용한 모델 : Unet
Unet은 인코더-디코더 구조에 skip connection을 추가한 구조입니다.
초기 Seq2Seq 모델은 인코더의 마지막 hidden state 값만 디코더에 전달해줬는데요, 나중에는 전부 연결해주고 거기에 어텐션을 추가하는 방향으로 발전하게 됩니다.
이는 마지막 값만 전달하는 것에 비해 더 다양한 정보를 디코더가 활용할 수 있다는 장점이 있습니다.
이와 비슷하게 Unet에서도 인코더의 다양한 스텝의 값들을 디코더에 전달해주는 것입니다.
Unet의 발전된 모델 중에는 이 부분에 어텐션을 추가하기도 합니다.
6. 결과 : One mask or Three mask
결과는 2가지 형태인데요, 실험환경이 2개라서 각 환경에 맞춰 모델을 다르게 설계했기 때문입니다.
4개의 병변을 구분하지 않고 하나의 비증식성 DR로 구분하는 형태의 결과입니다.
잘 맞추고 있습니다.
다만 자세히 보면 놓치고 있는 부분들이 있고 SE가 여기에 해당하는데, 데이터가 애초에 많지 않아 충분히 학습되지 않은 것 같습니다.
한가지 긍정적인 것은 사람이 잡지 못하는 작은 부분까지 모델이 잘 잡고 있다는 것입니다.
이는 정성평가가 필요한 이유이기도 한데, 비증식성 DR의 병변들이 워낙 크기가 작고 흩어져 있어 사람이 놓치는 부분이 발생하게 됩니다.
여기서 하위 32개는 마스크에 문제가 있는 것들을 뜻합니다.
최종발표 때도 피드백 받았던 부분인데, 마스크에 문제가 있는 것들을 빼고 결과를 내다보니 다른 논문과 결과를 비교할 수 없어 아쉬운 것 같습니다.
다른 데이터셋의 결과로 비교해봐야하는데, 이 부분이 빠진게 아쉽습니다.
다음으로는 Three mask 결과입니다.
4개의 병변이 존재하는데 3개의 종류로 예측한 이유는 MA와 HE는 구분하는게 의미가 없기 때문입니다.
(발표자료, 영상 참고)
이번에는 개별적인 3개의 마스크 종류로 예측하고 있습니다.
하나의 마스크에 비해 결과가 많이 떨어졌는데, 최적화할 수 있는 시간이 부족했던게 많이 아쉽습니다.
7. 느낀 점, 회고
정말 많이 배운 프로젝트였습니다.
팀장이라 팀원분의 의견을 듣고 매번 선택을 했어야 했는데, 이게 꽤 피곤하더라구요.
그래도 어떤 문제가 생겼을 때 이렇게 해결하면 되겠구나, 하는 감을 많이 익힐 수 있어 좋았습니다.
하나부터 열까지 완성해야하다보니, 예상치 못한 부분에서 삽질하는 경우가 굉장히 많았습니다.
특히 제가 한 삽질이 너무 컸는데, 인자 하나를 빼먹어서 생긴 문제였습니다.
나중에 정리하겠지만, 특정 조건에서만 학습이 되고, 나머지는 5 epoch 이후부터는 학습이 아에 안되는 문제가 있었습니다.
처음에는 모델이 못맞춘다고 생각하다가, 너무 이상해서 하나씩 다 파봤고, 기울기부터 하나하나 문제를 파악해나가느라 시간이 꽤 걸렸습니다. 일주일정도.
결과적으로는 인자 하나 빼먹은데 문제였습니다.
이걸 발견한게 3주정도 지난 후라, 사실상 3주를 날린건데... 너무 아쉽습니다, 지금 생각해도.
프로젝트를 진행하면서 제가 가장 신경썼던 건, 우리가 만드는게 필요한건가, 필요하다면 어떤 영향을 미칠 수 있을지에 대한 것이었습니다.
이걸 처음부터 잘 정의해놓으려 신경썼고, 결과적으로 발표의 설득력을 만드는데 도움이 많이 됐습니다.
인격적으로 실력적으로 한계를 많이 느꼈습니다.
중간중간 모르는 부분이 생겨 실력적인 한계를 느꼈습니다.
중후반에는 서로 예민해졌던 것 같은데, 제가 팀원분을 더 잘 케어할 수 있었을텐데 그러지 못해 아쉽습니다.
아마 제가 인격적으로 더 훌륭했다면 가능했을 것이라 생각합니다.
잘했다고 생각이 드는 부분은 절대 포기하지 않았다는 것입니다.
삽질을 했지만 이걸 해결하는데 몇일이 걸리더라도 무조건 해결해냈습니다.
모르는게 생격도 무조건 알아냈습니다.
그 과정에서 시간이 조금 부족했지만, 그래도 잘 마무리한 것 같아 진짜 뿌듯합니다.
프로젝트를 마치고 나니 왜 프로젝트 경험이 중요한지 알 것 같습니다.
정말 많이 스트레스 받았지만, 정말 뿌듯합니다.
그리고 팀원분과 좋은 추억을 만든 것 같아 참 기쁩니다.
'DataScience > Project' 카테고리의 다른 글
졸업과제 - 크라우드 펀딩 제품 성공 예측 및 유사도 기반 비교 서비스 제공 (0) | 2022.05.31 |
---|
댓글