의료 AI(딥러닝) 공부 일기

CH 03-0. Deep Learning for Biomedical Image

ignuy 2024. 7. 7.

Biomedical Image Training 개요

BIT(BT + IT)분야에서 가장 성공적으로 성장한 분야는 vision application 분야이다. 최근 자연어 처리도 각광 받고 있지만 기존에 CS 분야에서 CV가 크게 성장했었기 때문에 딥러닝의 폭발적인 발전이 이루어질 수 있었다.

그 대표적인 사례가 Lung cancer에 image deep learning을 접목하여 FDA approved를 받은 사례와 논문이 있다.

이를 위해 세가지 도메인이 합쳐지게 된다. “Medical Image data + CV + ML”

앞선 챕터에서 자주 등장했듯이 바이오메디컬 분야도 데이터의 양이라는 한계에서 벗어나기 위해 벤치마킹 데이터셋을 위한 노력이 이어지고 있다. 그  예시 중 하나가 “MedMNIST

Convoluntional neural network(CNN)

굉장히 많이 쓰이는 Image Deep Leaning 기법이다. 최근까지도 각광받고 있다.

Image Modality

이미지 하나의 unit(pixel)은 0-255 값으로 구성되어 있다. 이 때문에 보통 255로 나누어서 Min-Max normalization하거나 Normal Distribution 기반으로 normalization한다. 우리가 image를 보기에는 단순한 1차원 정보이지만 실제로 컴퓨터는 이미지를 3차원(세로위치, 가로위치, RGB 값)으로 구성한다.

Input data Normalization

데이터들이 주어졌을 때, 이 데이터는 일정 범위 내에서 zero-centered 상태, 또는 normalized 상태가 되어 작은 프레임으로 연산하는 것이 효율적이다. 따라서 우리는 Image 각각의 unit의 값을 가지고 255로 나누어 zero-centered 상태로 만들 것이다.

CNN 개요

CNN은 local한 picture를 찾기 위해서 만들었으며 MLP(mulit layer perceptron)을 기반으로 만들어 졌다. MNIST를 예시로 단순한 Fully connected model을 생각해보자.

MNIST의 데이터 셋은 28X28 pixels 사이즈로 총 784 pixels이 있다. 이 모든 픽셀들을 Fully connected하게 연산하여 값을 도출해도 된다. 단순하게 MLP로 연산하면 MNIST 데이터 한정해서 대략 8n% 정도 나오는 것으로 알고 있다.

여기서 한단계 진화한 형태의 머신러닝이 필터를 사용하여 이미지 벡터 형식으로 바꾸고 전통 머신러닝인 SVM이나 Random Forests, ANN에 넣는 것이다.

성능은 향상될 수 있었지만 결국 피처를 사람이 뽑아서 룰베이스의 필터에 적용시켜야 하므로 결국 휴먼 리소스가 들어가게 된다. 딥러닝, 그중에서도 특히 CNN에서는 weight가 알아서 이 피처를 뽑도록 한다.

CNN 원리

3차원 벡터에 맞게 weight를 디자인해야 한다. 그 후 전체 이미지를 조각조각 나누어 로컬 이미지를 만들고 로컬이미지를 수차례 들여다보면서 벡터화하여 반복되는 패턴을 찾는다. 이 때 연산은 weight sharing 등 고급 기술이 들어가게 된다. 이제부터 아래 CNN의 키 컴포넌트들을 차근차근 다 공부해보자.

Pytorch에서 CNN?

아래 사진은 Pytorch 공식 docs에서 Classification을 위한 CNN 아키텍처들을 나열해둔 것이다. CNN이 딥러닝이나 CV 영역에서 던진 파장이 크기 때문에 아직도 활발히 연구가 이루어지고 있다고 한다. 다양한 layer들을 마치 레고처럼 쌓을 건데, 그 때 어떤 상황에서 가장 좋은 성능을 내는지 이미 연구를 마친 조합법이라고 생각하자.

저 많은 내용을 다 공부해야 하냐고 떨지말자. 모델 개념이나 구현이 어려워도 미리 구현된 torchvision library(colab 기본 내장)를 사용한다면 코드 한 줄로 구현할 수 있다. 또한, 실전에서 모델을 바꿔서 사용할 경우는 거의 없다. 그 이유는 torchvisioin library에서 제공하는 pre-trained model을 transfer해서 사용할 때 성능이 잘 나오기 때문이다. CNN을 feature extractor로 사용하여 output layer만 떼어내고 다른 레이어들을 Freeze 할 수 있다.

또한, Medical data는 대부분 흑백이 많다. X-ray, CT 데이터들 전부 흑백이니 ImageNet Dataset을 흑백으로 처리해서 Pretrained를 만드니 성능이 좋아졌다는 논문도 존재한다.

CNN의 기초 컨셉

선형대수개념

Element wise 와 Dot product

모든 딥러닝은 layer를 하나 지날때마다 data 형식이 reshape될 수 있다. CNN의 경우엔 로컬 벡터와 element wise 연산으로 압축된 피처를 만들어낸다.

Zero-padding

이미지 둘레를 0으로 패딩해준다. 결과적으로 이 과정에서 image크기가 살짝 증가한다. 필터를 거치면 거칠수록 벡터의 크기가 줄어들기 때문에 원본을 “보존”하기 위해서 진행하기도 하고 값들을 “보정”하기 위해서 진행하기도 한다.

2D Convolution

Input Image를 filter로 곱해준다.

2D Convolution에서 다룰 수 있는 파라미터는 여러가지이다. padding은 말 그대로 padding size를 다루고, stride는 filter를 움직이는 간격을 다룬다. 위에 가져온 예시는 padding과 stride가 1이다. stride를 2로 줄 수도 있고 이때는 filter가 2칸씩 뛰게 된다. Input_channel의 숫자를 키우면 3개의 input vector로 filter를 씌워 연산을 진행하고 결과 값을 합친다. output_channel의 숫자는 말그대로 결과 vector의 갯수이다.

이렇게 Input_channel, output_channel, kernel_size, padding, stride를 통해서 원하는 channel size를 마음대로 조절할 수 있다.

지금까지 공부했던 것과 같이, filter가 같은 영역의 weight를 공유하고 있기 때문에 local feature를 잡는데 특화된 딥러닝, CNN이 탄생하게 된 것이다.

다만, 주의해야 할 점은 Convolution layer의 사이즈이다. Convolution layer의 filter는 반드시 input volume의 최대 depth를 만족시켜야 한다. input의 모든 element에 대해 element wise를 진행해야 하기 때문이다. 또한, filter의 사이즈는 반드시 output size와 동일한 크기여야 한다.

1D Convolution

주로 NLP Model에서 사용된다. 필자도 감정분석과 의도파악 NLP 프로젝트에 도전할 때, CNN을 활용했었다. 1D Convolution은 2D Convolution과 다르게 이동 방향이 한개이다(축이 한개이므로 당연한 이야기이다).

3D Convolution

CT 이미지로 3D 벡터화된 데이터에 대해서 진행한다. 원리는 위와 다를게 없어서 이해하기 어렵지 않으므로 설명은 생략한다.

Pooling

feature map에 filter를 씌워보면서 한가지 값을 도출해야 하는 것을 위에서 배웠다. 이때 값을 뽑아내는 방식을 Pooling이라고 하며 Max Pooling, Average Pooling 등이 있다.

Max Pooling은 filter위에 있는 값들 중 가장 큰 값만 뽑는 방식이고, Average Pooling은 평균 값을 뽑는 방식, Sum Pooling은 총합을 뽑는 방식이다. 이 Pooling을 통해서 Dimesion Reduction 효과를 볼 수 있다.

뽑는 방식이야 여러 가지이므로 필요에 따라서는 가장 작은 값을 뽑을수도 있지만 보통의 경우엔 Max Pooling을 활용한다. Edge가 주로 Max에 걸리기 때문이다.

따라서 원본 이미지를 local feature map 으로 무수히 나누고 Pooling을 거쳐서 해당 feature들을 찌그러 뜨리는 느낌으로 CNN이 진행된다. 위 예시에서 L3까지 2D data를 가지고 Feature Extraction을 수행하고 L4부터 1D로 처리하기 위해서 Flatten이라는 과정을 거친다. 3차원 데이터를 순서에 맞게 1차원으로 쭈욱 펼쳐준다. 정해진 순서에 맞게 데이터를 변환했으므로 당연히 역의 과정도 가능하다.

Overfitting

인공지능 모델이 train set에 과하게 몰두하며 test set에 대해서 error rate이 올라가는 경우가 있는데, 이를 overfitting이라고 한다.

CNN을 비롯한 여타 딥러닝 모델들은 상당히 layer를 딥하게 쌓는다. 파라미터 수가 많고, 수용 능력이 좋아서 overfitting 문제가 쉽게 발생한다. 특히 바이오 데이터는 Sample수가 적으나 Feature 수가 ㅁ낳아서 Overfitting이 잘 발생한다.

Overfitting을 피할 수 잇는 방법 4가지 :

  1. L1 and L2 Regularization
  2. Dropout
  3. Data Augmentation
  4. Early Stopping

Regularization

weight를 업데이트할 때, weight가 너무 크게 변동되면 값을 보정하여 반영하는 기술이다. Ridge Regression, Lasso Regression, Elastic Net Regression 등이 있다.

Dropout

Fully connected 구조에서 중간중간 임의의 노드들의 기능을 완전히 꺼버리는 것을 말한다.

dropout rate를 선정하면 쉽게 설정이 가능하다.

노드를 아예 꺼버리지 않고 커넥션만 끊는 Dropout도 존재한다.

Data Augmentation

하나의 데이터를 다양하게 변조시켜서 활용하는 것이다.

Early Stopping

자주 쓰이진 않는다. 모델의 훈련을 조기에 종료하는 방법이다.

Normalization Trick

데이터 Normalization은 이미 위에서 다루었다. 연산을 한번 할때마다 값이 튀는 경우가 많으므로 이 경우 모두 Normalization을 진행하여 overfitting을 막을 수 있다. 심플하게 Batch마다 Normalization을 진행한다는 아이디어가 Batch normalization이다. 그밖에도 활용할 수 있는 Normalization trick은 Layer Norm., Instace Norm., Group Norm. 등이 있다.

CNN Architecture

VGG

VGG를 시작으로 CNN에 대한 관심도가 급격히 올라가게 되었다.

GoogleNet

획기적인 아키텍처를 들고 나왔다.

  1. 1X1 Input demesion으로 1차원화 시켜서 병렬 처리
  2. Average Pooling

1X1 filter는 Dimension Reduction이라고 생각하자. input demension과 convolution filter의 dimension이 일치해야 한다고 했는데, 1X1filter를 통해서 아무리 복잡해도 한 개의 층으로 압축이 가능하다. 따라서 1X1 filter를 중간중간 집어 넣음으로써 자유로운 압축기법을 활용했다는 점이 인상깊다.

 

또한 Golbal Average Pooling이 여기서 등장한다.

그 동안 2D data를 flatten해서 1차원으로 바꿨는데 이는 Input size가 커지면 커질수록 1차원 output의 크기가 비례해서 커질 수 밖에 없다. 그럼 이미지 크기마다 output size가 변동되는 특징 때문에 반드시 Input image size를 고정시키고 모델을 훈련시켜야했다.

하지만 Global average Pooling 기법이 등장한 이후 Input image size가 변동되어도 output size가 바뀌지 않게 되어 더 활용도가 증가하였다.

ResNet

앞선 모델은 Layer를 깊게 쌓으면 쌓을 수록 성능이 올라갔다. 오 그럼 gpu가 성능이 좋아질수록 layer를 미친듯이 쌓고 모델의 성능이 올라가겠네?

이 관점을 ResNet이 부셔준다. 여기서 심플하게 layer를 쌓아만 올린다고 해결될 일이 아니라 오히려 data들이 과하게 희석된다라는 해석이 나오게된다.

이 문제를 해결하기 위해서 ResNet이 제안한 기술이 Skip connection이다. 연산을 하다가 이전 레이어의 데이터를 합쳐주는 것이다. 이후 image 분석에만 좋을 줄 알았던 이 Skip connection 기법이 다른 딥러닝 모델에도 효과를 보이면서 다양하게 자리잡게 된다.

DenseNet

Densenet은 skip connection의 컨셉을 확장하여 적용했다. 중간중간 feature들을 살리면서 적용하는 방법을 활용하여 모델을 학습시킨 결과 성능이 올라갔다.

Segmentation

결국, Deep Learning, 그리고 우리가 현재 학습하고 있는 CNN의 역할은 Obejct Dection과 Segmentation을 목적으로 하고 있다. 지금부터 CNN이 풀 수 있는 문제를 살펴보자.

Biomedical 에서는?

사실 Object detection이 병변 탐지에 활용도가 높은 것이 사실이지만, Segmentation의 연구 비율이 훨씬 높다는 것으로 보인다. 그 이유는, 바이오메디컬 데이터 특성상 rentangle한 데이터가 잘 없다. 따라서 Obejct detection으로는 rectangle하게 박스를 쳐버리면 필요없는 공간을 너무 많이 차지하게 되서 최근에는 Segmentation 연구가 활발히 이루어지는 것 같다.

Segmentation

박스 단위의 object detection이 아닌 pixel 단위의 segmentation은 같은 분류여도 각각의 다른 객체로 보느냐 아니냐에 따라 각각 Intance segmentation, Semantic segmentation으로 나뉜다.

분류할 종류마다 마스크를 labeling할 필요가 있다. 따라서 data도 (height, width, class의 수)로 나온다.

Segmentation Architecture

otput 이 기존에 있던 Image 크기로 나와야 하므로 data의 size가 줄어들었다 커지는 구조를 가지고 있다. conv. net을 통과하면 데이터 사이즈는 자연스럽게 줄어들게 된다. 이 크기를 늘리는 과정을 이제 알아보자.

Object Detection

multiple output이기 때문에 multi tasking model이라고 할 수 있다.

Sliding Window

초반에는 네모 박스를 이미지로 훑으면서 모델을 훈련시켰다. 다양한 크기의 rectangle을 움직여가며 훈련시켰는데,,, 이 과정은 그냥 딱봐도 비효율적이다.

Region Proposals(R-CNN)

그래서 CV의 아이디어가 도입되어 진화한 방법이 Region Proposal이다. 비슷한 색들을 selective search한다. 비슷한 색계열을 모으고 겹치는 애들을 다 빼주고 적절한 후보를 뽑아 모델에게 훈련을 제안하는 방식이다.

상당히 선택의 폭을 줄이긴 했지만 여전히 너무 많은 region을 제안하게 되었고 CPU 단위로 동작하는 기능이라 연산이 비효율적이었다. 결국 결과적으로 이미지 한장에서 2000여 번의 classification이 돌아가게 된다.

Fast R-CNN

그럼 이미지에서 제안하지 말고 Conv. net에서 나온 feature map을 가지고 proposal하자. 그럼 CNN을 돌리는 과정이 simple 해질 것 같다는 생각에서 시작하였다.

이 기법을 시작으로 region proposal을 CNN으로 대신하는 방법이 고안된다.

Faster R-CNN

남아있던 region proposal도 CNN을 통해서 수행해보자는 생각에서 시작되었다.

하지만 아직까지도 region proposal이란 방법 자체에 한계가 명확했다.

YOLO / SSD

이미지를 그리드 형태로 자르고 그 그리드를 기준으로 다양한 형태의 anchor box를 준비하여 연산한다.

알아먹기 좀 어렵다. 나중에 한번에 정리해보자.

Biomedical에서는?

Obejct Detection은 상당히 까다로운 기술이다. 특히 biomedical 분야에서는 다른 분야와는 달리 속도가 안중요한 경우가 많다. 그래서 시간이 오래걸리더라도 정확한 모델을 쓰는 것을 추천한다.

Two stage method(Faster R-CNN) 는 Object detection에서 좋은 정확도를 제공하므로 시간이 오래걸려도 Biomedical 분야에서 활용되어지고 있다.

Mask RCNN

Instance segmentation과 Obejct Detection은 어찌보면 상호 보완적인 관계이다. 두 방법을 잘만 활용한다면 정확도를 높일 수 있을 것이다.

댓글