image classification, object detection 모델은 이미지에서 어떤 물체의 종류를 분류하거나 물체의 유무와 위치를 탐지한다.
Segmentation
- 픽셀 수준에서 이미지의 각 부분이 어떤 의미를 갖는영역인지 분리해 내는 방법이다.
- 이미지 분할 기술로써, 예를 들면 인물사진모드에서 인물과 배경을 분리해내어 배경을 흐리게 아웃포커싱 효과, 크로마키, 자율주행의 도로와 오브젝트 분리 등이 있다.
Segmentation 종류
이미지 내에서 영역을 분리하는 접근방식은 두 가지가 있다.
- Semantic Segmentation 과 Instance Segmentation이 있는데, 접근방식에 따라 문제의 정의와 모델을 구성하는 방식이 달라진다.
- 좌측 상단의 사진은 물체들이 모여있는 곳의 위치를 인식(localization)과 이 물체들이 양이다라고 판별(classification)하는 접근방식 =====> Semantic Segmentation
- 우측 상단의 사진은 양들의 위치를 하나하나 정확히 식별하는 객체인식(object detection)의 접근방식
====> Instance Segmentation
1. Semantic Segmentation(시맨틱 세그멘테이션)
Semantic Segmentation의 예
- Semantic Segmentation의 대표적인 모델은 U-Net이다.
- 입력으로 572X572 크기인 이미지, 출력으로 388X388 크기인 두 가지의 클래스를 가진 Segmentation map이 나온다.
- 가장 마지막 레이어의 채널 개수 2개이므로 두 가지 클래스인것을 확인 가능
- 이 두 가지의 클래스를 문제에 따라 다르게 정의하면 클래스에 따른 Sementic Segmentation map을 얻을 수 있다.
- 예를 들어 인물사진에서는 사람과 배경영역 클래스
- 출력값이 image classification 이나 object detection 보다 큰 이유는 segmentation을 위하여 이미지의 각 픽셀에 해당하는 영역의 클래스별 정보가 필요하기 때문이다.
2. Instance Segmentation(인스턴스 세그멘테이션)
이름에서 알 수 있듯이 Instance Segmentation은 같은 클래스에서도 각 instance(개체)들을 분리하여 Segmentation 수행
간단히 물체의 위치를 파악하여 인식을 하는 semantic segmentation 보다 접근방법이 어렵지만, 생각을 해보면
object detection 모델로 각 개체를 구분한 뒤, 개체 별로 semantic segmentation을 수행하면 가능하다 ==> 이 방식 중 대표적인 것은 Mask R-CNN.
Mask R-CNN의 등장
- Faster-R-CNN의 Region of Interest Pooling Layer(RoIPool) 개념을 개선하여 Segmentation에 유리하게 한
RoIAlign 과 클래스별 마스크 분리
Faster-R-CNN에서 RoIPool 의 개념
- RoIPool Layer는 다양한 RoI 영역을 Pooling을 통해 동일한 크기의 feature map으로 추출해 내는 레이어
- 고정 사이즈 feature map을 바탕으로 바운딩 박스와 object의 클래스를 추론
Faster-R-CNN에서 RoIPool 의 한계점
- object영역의 정확한 masking을 필요로 하는 segmentation 문제에서 Quantization이 필요하다
- 위의 그림처럼 가로 200, 세로 145 픽셀의 RoI 영역을 16X16으로 분할한 영역 중 끼워맞추다 보면 어쩔 수 없이 RoI 영역 밖이 포함되거나 남는 영역이 버려지는 경우가 있다. 이는 정보손실과 왜곡을 야기한다.
- 그림을 확대해서 보면 3X3 RoI Pooling은 가로/세로 3의 배수만큼만 영역에 적용된다. 고로 가로에는 6, 세로에는 3칸만 적용 가능하다.
- 따라서 빨간색 박스 안쪽이 필요한 영역이면, 불필요한 초록색영역이 포함이되고, 필요한 하늘색영역과 파란색영역이 손실된다.
이에 Mask-R-CNN의 RoIAlign은 Quantization을 하지 않고 RoI를 처리할 고정 사이즈의 feature map을 생성할 수 있게 한다.
Mask-R-CNN
아이디어 : RoI 영역을 pooling layer의 크기에 맞추어 등분하고, RoIPool을 했을 때 quantization 영역 중 가까운 것들과의 bilinear interpolation 계산을 통해 생성해야 할 Feature Map을 계산한다.
- Faster R-CNN에서 특성 추출방식을 RoIAlign 방식으로 개선하고 세그멘테이션을 더한 방식
- 그림에서 Bounding box regression을 하는 bbox head와 마스크를 예측하는 Mask head로 나눠져 있는데,Maskmap의 경우 시맨틱 세그멘테이션과 달리 상대적으로 작은 28X28 특성맵 크기를 갖는다. RoIAlign을 통해 줄어든 특성에서 마스크를 예측하기 때문에 사용하려는 목적에 따라서 정확한 마스크를 얻으려는 경우에 부적합하다.
주요 Segmentation 모델 1. FCN
- FCN은 AlexNet, VGG-16 등의 모델을 세그멘테이션에 맞게 변형한 모델
- FCN은 Segmentation을 하기 위해서 network 뒷단에 fully connected layer 대신 CNN을 붙인다.
- CNN은 이미지 내 위치의 특성을 유지하고 fully connected layer는 위치를 고려하지 않게 된다. 위치정보를 유지하면서 클래스 단위의 heat map을 얻어 세그멘테이션을 하기 위해 CNN을 붙인다.
- 마지막 CNN은 위치의 특성유지와 이미지 분류를 위해서 1x1 kernel_size 와 클래스의 개수만큼 채널을 갖는다. ==> 이렇게 CNN을 거치면 클래스 heat map을 얻을 수 있다.
- CNN과 pooling layer를 거치면서 크기가 줄어 heat map의 크기는 원본이미지보다 작은경우가 일반적인데 이를 upsampling을 통해 키워준다.
- Upsampling에도 여러방법이 있는데, FCN에서는 Deconvolution과 Interpolation 방법을 활용.
- Deconvolution은 컨볼루션 연산을 거꾸로 해주는 방법, Interpolation은 보간법으로 주어진 값들을 통해 추정해야 하는 픽셀을 추정하는 방법
※ Interpolation
Linear interpolation : 1차원 상의 2개의 점 사이의 거리 비에 따라 추정
Bilinear interpolation : 2차원으로 확장하여 4개의 점 사이에서 어떤 점의 값을 추정
- FCN-32s 의 경우 upsampling만 하면 세그멘테이션 맵을 얻을 수 있다.
하지만 Skip Architecture라는 기법을 더해서 성능을 향상시킨다.
- FCN-16s는 앞의 블록에서 얻은 예측 결과 맵과, 2배로 upsampling한 맵을 더한 후, 한 번에 16배로 upsampling을 해주어 얻는다.
- 이때 한번 더 앞의 블록을 사용하면 FCN-8s를 얻을 수 있다.
주요 Segmentation 모델 2. U-Net
- FCN에서 upsampling을 통해 키운 특성맵을 입력값과 대칭적으로 만들어 준 것이다.
U-Net 구조
좌측(Contracting path) 네트워크 구조
- Convolution network와 유사한 구조를 가진다.
- 각 블록은 두 개의 3X3 Convolution 계층과 ReLu를 가지고 그 뒤로 downsampling을 위해 2X2 kernel을 2 stride로 max pooling을 하게 된다.
- Downsampling을 거친 후 다음 convolution의 채널 크기는 두 배씩 늘어나도록 설계
우측(Expansive path) 네트워크 구조
- 각 블록에 2X2 up-convolution이 붙어 채널이 절반씩 줄어들고 특성 맵의 크기는 늘어난다.
- Contracting block과 동일하게 3X3 Convolution이 두 개씩 사용되었다.
Contracting path와 Expansive path에서 크기가 같은 블록의 출력과 입력은 skip connection처럼 연결해 주어 low-level의 feature를 활용, 마지막 1X1 convolution으로 원하는 시맨틱 세그멘테이션 맵을 얻을 수 있다.
572X572 크기인 이미지가 input 으로 들어가고 , 388X388 크기의 두 가지 클래스를 가진 segmentation map이 output으로 나온다.
타일(Tile)기법
- FCN은 input image의 크기를 조정하여 Segmentation map을 얻어내는 반면, U-Net은 타일방식을 사용하여 어느정도 서로 겹치는 구간으로 타일을 나누어 네트워크를 추론, 큰 이미지에도 높은 해상도의 Segmentation map을 얻을 수 있게 한다.
데이터 불균형 해결
- 세포를 검출해 내기 위해서는 경계 또한 예측을 해야하는데, 픽셀 단위로 label을 매긴다라고 하면 데이터셋에 세포나 배경보다는 절대적으로 세포 간 경계의 면적이 작다.
- 이 클래스 간 데이터 불균형을 해결해 주기 위하여 분포를 고려한 weight map을 학습때 사용.
- 여기서 weight는 loss에 적용되는 가중치를 말한다. 의료영상에서는 면적이 작은 세포경계를 명확하게 추론하는 것이 더 중요하기 때문에, 세포 경계의 손실에 더 많은 패널티 부과.
주요 세그멘테이션 모델 3. DeepLab 계열
전체 구조
- UNet의 Contracting path와 Expansive path 부분이 Encoder와 Decoder
- 그림에서 Encoder는 이미지에서 필요한 정보를 특성으로 추출해 내는 모듈이고, Decoder는 추출된 특성을 이용해 원하는 정보를 예측하는 모듈. 3X3 convolution을 사용했던 U-Net과 달리 DeepLabV3+는 Atrous Convolution사용.
- Atrous Convolution을 여러 크기에 다양하게 적용한 것이 ASPP(Atrous Spatial Pyramid Pooling)이다.
- DeepLabV3+는 ASPP가 있는 블록을 통해 특성을 추출하고 Decoder에서 Upsampling을 통해 segmentation mask를 얻는다.
Atrous Convolution
- 우측이 Atrous Convolution, 좌측이 일반적인 Convolution.
- Atrous Convolution은 더 넓은 영역을 보게 하기 위한 방법으로 커널이 일정간격으로 떨어져있다.
∴ 컨볼루션 레이어를 깊게 쌓지 않아도 넓은 영역의 정보를 커버 가능
Spatial Pyramid Pooling
Spatial Pyramid Pooling은 여러가지 스케일로 convolution과 pooling을 하고 나온 다양한 특성을 concatenate해준다.
이를 통해 멀티 스케일로 특성을 추출하는 걸 병렬로 수행하는 효과
여기서 Convolution을 Atrous Convolution으로 바꾸어 적용한 것은 Atrous Spatial Pyramid Pooling이라고 한다,
이러한 아키텍쳐는 입력 이미지의 크기와 상관없이 동일한 구조를 활용할 수 있다는 장점이 있다.
∴ 다양한 크기와 비율의 RoI 영역에 대하여 적용하기 유리하다.
Segmentation 평가
일반적으로 Semantic Segmentation 의 결과값은 이미지의 크기에 맞는 세그멘테이션 맵 크기와 시맨틱 클래스의 수에 맞는 채널 크기를 갖는다. 여기서 각 채널의 max probability에 따라서 해당 위치의 클래스가 결정된다.
픽셀별 정확도 (Pixel accuracy)
- 세그멘테이션 문제를 픽셀에 따른 이미지 분류 문제로 생각했을 때, 이미지 분류와 비슷하게 픽셀별 분류 정확도를 평가기준으로 생각가능
- 예측 결과 맵을 클래스 별로 평가하는 경우에는 이진 분류로 생각해 픽셀 및 채널별로 평가, True/False
- Error Metrics에서 Acc를 구할 수 있는데, 예를들어 4X4 의 map에서 중앙 2X2 영역이 전경이고 예측 결과에서 한칸을 틀렸다면, 분자의 TP+TN은 15, False case는 1 한칸은 배경으로 얘측되었으니 FN이 되므로 분모항은 16
∴ pixel acc 는 15/16
Mask IoU (Mask Intersection-over-Union)
ground truth(정답 라벨)과 prediction bounding box(예측 결과 바운딩박스) 사이의 IoU사용
- 마스크도 영역임으로 정답인 영역과 예측영역의 IoU를 계산가능하다
intersection = np.logical_and(target, prediction)
union = np.logical_or(target, prediction)
iou_score = np.sum(intersection)/np.sum(union)
마스크 iou를 클래스 별로 계산하면 한 이미지에서 여러 클래스에 대한 IoU점수를 얻을 수 있다.
이를 평균하면 전체적인 시맨틱 세그멘테이션 성능을 가늠가능하다.
Upsampling의 다양한 방법
Nearest Neighbor
- scale을 키운 위치에서 원본에서 가장 가까운 값을 그대로 적용
Bilinear Interpolation
두 축에 대해서 선형보간법을 통해 필요한 값을 메우는 방식
- $R_1$ 이 $Q_{11}$과 $Q_{21}$의 x축 방향의 interpolation 결과, $R_2$는 $Q_{12}$와 $Q_{22}$의 x축방향 interpolation 결과.
- $R_1$과 $R_1$ 를 y축 방향으로 interpolation하면 새로운 위치 P를 추정가능하다.
- Bicubic interpolation의 경우 3차보간법을 사용
Transposed Convolution
학습할 수 있는 파라미터를 가진 Upsampling 방법
- Convolution Layer는 kernel의 크기를 정의하고 입력된 feature를 window에 따라서 output을 계산하는데, Transposed Convolution은 이와 반대의 연산을 하여 더 넓은 영역의 값을 추정한다.
'DeepLearning|MachineLearning' 카테고리의 다른 글
TTA(Test-Time Augmentation) (0) | 2022.04.28 |
---|---|
Deep Pose (0) | 2022.01.21 |
Face Detection (0) | 2022.01.13 |
OCR(Optical Character Recognition) (0) | 2022.01.06 |
Object Detection (0) | 2021.12.29 |