이번 장에서 목표하는 바는 두가지다. 이후의 챕터에서 다룰 내용의 규모와 범위에 대해 파악하는 것과 이후 챕터에서 필요한 내용을 준비하기 위해 주변 환경을 파악하는 것이다.
머신러닝 프로젝트의 현실에서는 예상한 대로 일이 흘러가지 않는 경우가 많다. 따라서 2부(9장~)에서는 그런 경우 다룰 수 있는 도구들이 제공된다. 장애물을 맞닥뜨렸을 때 최소한 막히지는 않도록 해야 한다. 우리의 프로젝트가 성능이 예상보다 좋지 않았을 때 그 다음 어떤 대처방안을 구성해야할 지 떠오르지 않는 암담한 상황에서 벗어날 수 있게 될 것이다.
우리는 환자의 흉부CT 스캔을 입력으로 그것만으로 악성 종양을 자동으로 탐지하는 프로젝트를 구성할 것이다. 1부에서보다 더 진지하고 구조적인 접근 방법이 요구된다.
폐암 감지 문제를 선택
2부에 이 것을 주로 다루는 이유는, 가장 중요한 이유로 미해결 과제라는 점에 있으며 이를 다루면서 최첨단 프로젝트를 파이토치로 하여금 효과적으로 다룰 수 있다는 자신감을 고취시키기 위함이다.
이번 프로젝트는 1부에서 학습한 기술에 기반한다. 특히 8장에서 학습한 내용이 주가 된다. 다만 2차원 이미지 데이터를 다루지 않기에 2차원에 대응하는 관련 도구는 더 이상 사용하지 않는다.
2부의 작업은 모델구성 외의 부분에 얼마나 많은 노력이 들어가야 하는지를 다루게 된다. 우선 1부에서의 실습과정에서 데이터는 정제된 상태로 미리 준비되어 있었고 현재는 다르다는 점에서 차이가 존재한다.
또한 학습을 위해 하드웨어적으로 고성능이 요구되므로 최소 8GB 이상의 램을 갖춘 GPU가 요구된다.
프로젝트에 앞서, CT스캔에 대해 잠시 알아보자. 우리의 프로젝트에서는 주요 데이터 형식으로 CT 스캔 데이터를 다루게 된다. 따라서 CT 스캔이라는 데이터 포맷의 장단점과 기본적인 특성을 파악해야 한다.
Voxel
복셀(voxel)이란 우리에게 친숙한 2차원 픽셀의 3차원 버전으로 이해할 수 있다. 면적이 아닌 공간 용적을 담고 있으며 데이터 필드를 표현하기 위해 3차원 격자로 배열된다. 각 차원 내에서는 거리를 측정할 수 있으며 통상적으로 정육면체이지만 우리가 다룰 복셀은 직육면체를 띤다.
CT 스캔 내 각 복셀은 해당 위치에 있는 물체의 평균 질량 밀도를 나타내는 숫자 값을 가진다. 이 데이터를 시각화하게 되면 밀도가 높은 뼈나 금속 임플란트 등은 하얀색으로, 밀도가 낮은 공기나 폐 조직은 검게 보인다. 지방이나 조직 등 밀도의 차이로 인해 다양한 회색으로 나타난다.
이와 같은 3차원 데이터 표현을 통해 우리는 관심없는 조직을 숨겨 3차원 대상의 내부를 들여다 볼 수 있다. CT스캔과 X-ray의 또 다른 차이점은 데이터가 디지털 포맷이라는 점이다.
디스크의 대부분은 밀도 정보를 가진 CT스캔의 3차원 배열을 저장하는 데 사용된다. 우리의 모델은 이 3차원 배열의 부분에 해당하는 여러 2차원 단면을 사용한다. Chest CT 스캔부터 환자에게 폐암 진단을 내리기까지 총 5가지 주요 단계를 거친다.
CT 데이터 파일을 읽어서 CT 인스턴스를 만든 후 전체 3차원 스캔 데이터를 담고 segmentation을 수행하는 모듈과 결합한 후 추려진 복셀을 작은 덩어리로 나누어 결절로 간주될 만한 것을 찾는다. 최종적으로 악성의 여부를 조사하는데, 이 작업이 특히 어렵다. 악성 종양임은 CT scan만으로 드러나지 않기 때문이다.
lung cancel project 5step
- 원본 CT scan data를 pytorch로 사용할 수 있는 형태로 읽는다.
- segmentation 기술 구현을 위해 pytorch로 하여금 폐의 잠재적 결절에 해당하는 voxel을 찾는다. 이는 heatmap 작성하는 것과 유사하며 3번째 단계의 classifier에서 사용한다.
- 관심 있는 voxel들을 후보 결절군으로 묶는다. 각각의 결절은 인덱스가 부여되며 중심부에서 시작하는 열과 행으로 위치를 알 수 있다.
- 3차원 컨볼루션을 사용하여 각 후보 결절에 대해 실제 결절인지 아닌지로 분류한다.
- 각 결절별로 분류한 결과를 종합하여 환자를 진단한다. 결절 별로 악성 예측을 구한 후 이들의 최댓값을 사용하는 방식으로 하나라도 악성이 예측된 경우 해당 환자는 암 소견을 보인다고 진단한다.
왜 두 개의 분리된 모델 아키텍처가 있고, 전체 데이터 흐름도 복잡하다. 아직 이 주제는 연구자들이 제대로 해결하지 못한 문제이며, 이러한 난해함은 복잡함으로 이어진다. 어떤 난해함일까? 대부분의 CT Scan은 근본적으로 흥미롭지 못하다. 직관적으로, 거의 대부분의 환자의 몸은 건강한 세포로(99.99999%) 이루어져 있다. 결절을 찾는 일은 책으로 가득한 서가에서 철자가 틀린 단어 하나를 찾는 것과 비슷하다.
문제를 풀기 위한 우리의 접근으로 최종 목표에 대한 최적화로 엔드투엔드 기울기 역전파를 사용하진 않을 것이다. 대신 부분마다의 최적화 방식으로 동작할 것이다. 두 개의 모델의 각각은 정확하게 하나의 작업을 수행하는 데 집중한다.
우리가 알아야 할 마지막 핵심은 결절(nodule)
이 무엇인지에 대한 것이다. 폐 결절이란 폐 내부에서 나타날 수 있는 무수한 돌기나 덩어리를 말한다. 정확한 정의로는 3cm 이하이어야 한다.(이상일 경우 lung mass로 정의 되나, 크든 작든 동일한 코드 경로를 사용하므로 모두 결절로 정의한다.) 결절은 양성 또는 악성으로 밝혀질 수 있다.
암은 항상 결절의 형태를 띠며, 이 결절은 밀도가 매우 낮은 폐 조직에 매달려 있거나 폐 벽에 붙어 있을 것이라는 점이다.
책에서 보는 CT Scan은 LUNA 그랜드 챌린지에서 가져온 것으로 해당 대회는 환자 CT Scan 자료를 고품질로 레이블 작업한 공개 데이터셋으로서 데이터 분류기 성능에 대한 공개 랭킹을 제공한다. 이 책에서 우리는 LUNA 2016 데이터셋을 사용한다.
나 죽을 때쯤 다운로드 될 듯?