최초 작성일: 2020.10.06
최종 수정일: 2020.10.11
* 주의사항: 본 프로젝트는 의학 비전공자의 글로 잘못된 의학적 내용이 포함될 수 있으며 의학적 목적으로 사용할 수 없습니다.
0. 목차
1. 시작
2. 사전지식
3. 데이터 수집 및 전처리
4. 신경망 구축
5. 개선방법 모색
6. 데이터 전처리2
7. 신경망 구축2
8. 결과
9. 아쉬운 점
10. 소스코드
1. 시작
지난번 수행했던 covid-19 프로젝트 이후 kaggle에서 폐렴에 걸린 사람과 걸리지 않은 사람의 X-ray데이터셋을 찾았다.
covid-19 프로젝트는 아래 링크에서 볼 수 있다.
github.com/mooooondh/covid19_project
covid-19와 비교는 아니지만 "CNN을 의학 목적으로도 사용이 가능할까?"란 의문이 생겼다.
이를 이용한다면 학습된 신경망이 전문의의 진단에 도움이 되는 데이터를 제공할 수도 있을 것이다.
마침 kaggle에서 폐렴 환자와 정상인의 X-ray데이터셋을 찾아 프로젝트를 진행해보기로 했다.
이번 프로젝트의 목표는 "X-ray사진으로 폐렴 유무를 판단해주는 의사(신경망)"을 생성하는 것이다.
우선 나는 의학적 지식이 하나도 없기에 간단하게나마 이에 대해 조사해 보았다.
2. 사전지식
consolidation
폐포내에 공기 대신 여출액(transudate), 고름, 혈액 등과 같인 삼출액(exudate)들이 차 있는 것을 말한다. 가장 흔한 원인으로는 폐렴을 들 수 있다.[1]
X-ray상에서의 consolidation의 특징
- 폐혈관이 모호하게 관찰되거나 관찰되지 않는다.
- 폐의 용적 변화가 없다.
- 폐 혈관이 모호하거나 관찰되지 않는다.
- air bronchogram이 관찰된다.[2]
폐포성 음영은 폐경화(consolidation)라는 용어를 가장 흔히 사용하는데 그 정의는 폐포가 공기대신 누출액(transudate), 삼출액(exudate), 출혈, 세포, 단백물질 등으로 완전히 대체되어서 흉부X-선 사진에서 폐혈관 윤곽이 소실될 정도로 증가한 음영을 말한다. 경계가 불분명한 증가 음영으로 나타나는데 진행하면 서로 융합하여 퍼지는 양상으로 마치 구름 같은 모양을 보이게 된다. 내부에 공기기관지 음영(air-bronchogram)이라는 분지하는 모양의 기관지를 볼 수도 있는데 폐포 내부는 체나 세포 등으로 대치된 반면 공기가 남아있는 기관지는 주위 폐포 내의 증가음영과 대조되어 나타나는 것을 말한다.[3]
요약해보면 보자면 폐 속에 고름, 혈액 등이 차 있으면 X-ray 투과율이 떨어지며, 이로 인해 구름 같은 모양의 음영이 관찰된다면 폐렴이라 진단할 수 있다.
위의 두 사진을 비교해 보면 폐렴 환자의 X-ray는 정상에 비해 구름같은 음영이 관측된다.
이러한 현상은 폐 전체 혹은 일부에 나타날 수 있다.
3. 데이터 수집 및 전처리
데이터는 kaggle 데이터셋을 이용했다.
www.kaggle.com/paultimothymooney/chest-xray-pneumonia
2020년 10월 6일 기준 본 데이터셋은 train, test, val폴더로 이루어져 있으며 각 폴더마다 NORMAL(정상)과 PNEUMONIA(폐렴)로 구분되어 있다.
데이터 구분 | 진단 | 데이터 갯수 |
test | NORMAL | 234 |
PNEUMONI | 390 | |
train | NORMAL | 1,341 |
PNEUMONI | 3,875 | |
val | NORMAL | 8 |
PNEUMONI | 8 |
train 데이터는 NORMAL보다 PNEUMONIA데이터가 약 3배 많으며 이로 인한 데이터의 편중을 주의해야 할 것 같다.
데이터는 모두 .jpeg이미지이며 크기가 모두 다르다.
또한 사진이 기울어진 경우도 있으며 사진의 중심과 환자의 중심이 일치하지 않은 경우도 다수 있다.
폐렴의 경우 박테리아에 의한 경우와 바이러스에 의한 경우 2가지가 있다.
하지만 이번 프로젝트는 폐렴의 유무만을 판단하는 것이기에 둘을 구분하지 않았다.
opncv를 이용하여 이미지를 gray scale로 불러오고 이미지 사이즈를 통일시켰다.
모든 픽셀은 0~255 사이의 값을 가지며 255로 나누어 0~1사이의 값을 갖도록 했다.
정상인 경우 0, 폐렴의 경우 1을 출력하게끔 정답 데이터를 준비했으며 train데이터의 25%를 검증 데이터로 분류했다.
val데이터는 신경망 test후 검증을 위해 사용하기로 계획했다.
4. 신경망 구축
신경망은 어떻게 구축해야할까? 일단 이전 프로젝트인 성별 분류 신경망을 조금 수정한 신경망에 학습을 시켜보았다.
약 1시간 40분간 학습이 진행됐으며 마지막 epoch의 결과는 아래와 같았다.
loss: 0.1122
accuracy: 0.9663
val_loss: 0.0930
val_accuracy: 0.9678
이제 학습된 신경망에 학습된 데이터를 통과시켜보았다.
$\hat{y}$: [1, 0, 1, 0, 1, 1, ... , 0, 1, 1, 0]
$y$: [1, 1, 0, 0, 1, 1, ... , 0, 1, 1, 0]
정확도: 76.9%
일반적인 경우에는 이정도 정확도라면 좋은 성능을 낸다고 말할 수도 있겠으나 의학 분야는 사람의 생명과 관련있는 분야이기에 이정도의 수치는 부족하다 생각된다. 개선 방법을 찾아보자.
5. 개선 방법 모색
1) 데이터셋은 흉부 X-ray사진이다. 본 프로젝트에서 필요한 데이터는 폐가 위치한 영역만 필요하며 다른 부분은 학습에 방해가 될 수 있다. 따라서 영역만 잘라내는 전처리가 필요하다.
2) 이미지의 크기가 제각각이다. 이를 일괄적으로 100*100px로 줄이는 것은 이미지가 가로 혹은 세로로 눌린 이미지를 만들어낼 수 있다. 또한 이미지의 크기가 줄어들면서 1)에서 언급한 불필요한 영역의 영향력이 커진다.
3) 신경망이 충분히 깊지 않다. 단순한 CNN이 아닌 ResNet50, DenseNet121과 같은 신경망의 사용을 고려해봐야 할 것 같다.
-> 데이터 전처리 과정이 더 필요하다.
6. 데이터 전처리2
데이터 셋을 살펴보면 사진의 크기가 모두 다르고 흉부의 위치도 조금씩 다르다.
데이터 하나하나 필요한 영역만 잘라내고 크기를 조절하는 것은 매우 비효율적인 작업이기에 python과 opencv를 이용하여 필요한 영역만 잘라내고 크기를 조절해주는 프로그램을 만들었다.
이미지를 잘라내고 크기를 224* 224로 조절했다. 이 과정에서 일부 이미지가 상하로 늘어난 모습이 되었다.
이미지 전처리 실행 결과
필요한 영역만을 가지며, 크기가 일정한 데이터셋이 만들어졌다.
이로써 1)과 2)는 해결이 될 것으로 예상된다.
7. 신경망 구축2
ResNet50 네트워크를 사용해 신경망을 학습시켰다.
ResNet50 네트워크는 Keras에서 제공한다.
ResNet50에 대해서는 차후 다뤄볼 예정이다.
이번에는 검증 데이터를 전부 train데이터에 포함시켜 학습을 진행했다.
그리고 val폴더에 있는 총 16개의 데이터를 이용해 검증을 진행했다.
epoch 30일 때
마지막 epoch의 loss: 0.0097, accuracy: 0.9973
test set 정확도: 약84.6%
val data 정확도: 87.5%
epoch 50일 때
마지막 epoch의 loss: 0.0019, accuracy: 0.9992
test set 정확도: 약77.7%
val data 정확도: 62.5%
epoch 80일 때
마지막 epoch의 loss: 0.0051, accuracy: 0.9979
test set 정확도: 약84.3%
val data 정확도: 87.5%
조금 신기한 결과가 나왔다. epoch가 30일 때와 80일 때 정확도가 가장 높았고 epoch가 50일 때 정확도가 가장 낮았다.
반대로 loss는 epoch가 50일 때 가장 낮았다. 하지만 모두 0.001이하이기에 이 차이에 큰 의미는 없다 생각된다.
overfitting을 의심하려면 epoch가 커질수록 정확도가 떨어져야 할텐데 왜 이런 결과가 나왔는지는 향후 연구가 필요하다 생각된다.
8. 결론
아쉽지만 본 프로젝트는 개인적인 시간상의 문제로 이쯤에서 종료해야 할 것 같다.
처음 목표였던 "X-ray사진으로 폐렴 유무를 판단해주는 의사(신경망)"는 가장 높은 정확도를 가진, epoch가 30인 모델로 결정했다.
이 신경망의 정확도는 약 84.6%로 처음 생성한 신경망의 정확도 약 76.9%보다 약 7.7% 향상되었다.
개인적인 시간관계상 ResNet50만 사용해 보았는데 예상보다 큰 성능향상을 보여주었다.
이미지 분류는 다양한 신경망이 존재하며 향후 다른 신경망을 적용하여 차이를 비교해보는것도 좋은 연구가 될 것 같다.
향후 기회가 된다면 의료 관련 전문가와 함께 프로젝트를 개선하고 싶다.
9. 아쉬운 점, 더 해봐야 할 것들
1) epoch또한 하나의 하이퍼파라미터이기에 다른 파라미터를 변경하면 어떤 변화가 일어나는지 알아보고싶다.
2) [그림 4]를 살펴보면 검증데이터셋이 몇몇 epoch에서 평탄하지 않은것을 알 수 있다. 이러한 현상이 발생하는 이유를 알아보고 싶다.
3) 다양한 신경망을 사용해서 차이점을 비교해보고 싶다.
4) 본 프로젝트의 결과물인 신경망을 개선하여 90%이상의 정확도를 갖는 신경망을 만든다면 향후 추가 연구를 통해 전문 의료진의 판단 보조기구로도 사용이 될 수 있다 생각된다. 다만 이를 실제 환경에서 사용하려면 관련 전문가와 함께 프로젝트를 진행해야 할 것이다.
10. 소스코드
github.com/mooooondh/PneumoniaTest
<출처 및 참고자료>
[3] 이경원, "전공의를 위한 흉부X선 사진 판독법"임상강좌 _ 전공의를 위한 기본 판독요령(2013): 79.
[4] 송재승, 합성곱 신경망을 활용한 진폐증 X-ray영상 판정 보조 연구(2019).
<이미지 출처>
[그림 1] dataset의 test/NORMAL/IM-0001-0001.jpeg
[그림 2] dataset의 test/PNEUMONIA/person113_bacteria_541.jpeg
[그림 3] 자체
[그림 4] 자체
[그림 5] 자체
[그림 6] 자체
[그림 7] 자체
[그림 8] 자체
[그림 9] 자체
'프로젝트' 카테고리의 다른 글
[아쿠쿠아] v1.4.0 출시! (2) | 2024.02.25 |
---|---|
ASL 알파벳 번역기 만들기 2편 (0) | 2021.06.27 |
ASL 알파벳 번역기 만들기 1편 (0) | 2021.06.02 |
평점기반 도서 추천 (1) | 2020.10.27 |
CNN으로 남성, 여성 구분하기 (0) | 2020.10.03 |