본문 바로가기
Graduate Lectures(2024-2)/딥러닝영상인식1

[Lecture 11] Image Segmentation and Object Detection

by BangGeuk 2024. 12. 17.

본 강의 학습 목표는 다음과 같다.

  • Semantic Segmentation: Fully Convolutional Network (FCN), In-Network Up-/Down-Sampling
  • Object Detection: R-CNN, Fast R-CNN (RoI Align/Pooling), Faster R-CNN (Region Proposal Network)
  • Instance Segmentation: Mask R-CNN

 

Semantic Segmentation

픽셀 하나만 보고 어떤 class에 속하는지 판단하기 어렵다. 픽셀 하나의 주변 것을 보면 class를 판단할 수 있다. 이미지의 작은 영역 패치를 CNN을 통과하여 class를 맞출 수 있다. 우리는 전체 이미지에 대해 모든 픽셀들에 대해 class를 맞추는 것이 목표이다. 하지만, 이렇게 계산할 경우 계산량이 너무 많아진다. 패치들 간의 겹치는 영역을 계속 계산하기 때문에 비효율적이다. 전체 이미지를 CNN을 한 번만 통과해서 semantic segmentation을 하는 것을 목표로 한다. Fully Convolutional Network를 이용하여 이를 해결한다.

 

Fully Convolutional Network (FCN)

convolutional layer만 가지고 모든 픽셀에 대한 class를 맞춘다. 마지막 C는 class 개수이다. 즉, c를 맞추는 것을 목표로 한다. 여기에 argmax를 취하면 H x W 이미지에 대한 mask를 생성할 수 있다. 각 채널은 cow class score, tree class score, sky class score 등등 이루어져 있고 각 채널은 각 클래스 점수를 가지고 있어 argmax로 class를 분류할 수 있다. 하지만, convolution에 원본 이미지 해상도를 사용하면 비용이 너무 많이 든다. 이를 해결하기 위해, downsampling & upsampling을 적용한다. 

 

In-Network Up-/Down-sampling

계산량을 해결하고자 downsampling과 upsampling을 적용한다. 채널 수를 증가시키면서 이미지를 줄이다가 다시 채널 수를 감소시키면서 이미지를 증가시키며 마지막에 동일하게 argmax를 통해 class를 예측한다. 여기서 downsampling은 pooling, strided convolution을 적용한다. upsampling은 어떻게 하는지 알아본다.

 

In-Network upsampling: "Unpooling"

2x2 이미지를 똑같은 숫자로 늘리는 방법과 0으로 채우는 방법이 있다. 이는 너무 단순하기 때문에 잘 사용하지 않는다.

 

In-Network upsampling: "Max Unpooling"

max pooling을 통해 어디서 정보를 얻었는지를 기억하고 그대로 그 위치에 붙이는 방법이다.

 

다음은 Transposed Convolution의 1D 예제다. input과 filter를 통해 output을 늘린다. stride를 2로 설정하면 다음과 같이 두 칸 띄어서 결과를 더한다.

 

다음은 Transposed Convolution의 2D 예제다. 빨간색 값과 filter와 모두 곱한다. 파란색도 동일하게 filter와 모두 곱한 후, 빨간색에서 곱한 값과 파란색에 곱한 값이 겹치는 영역은 더한다. 여기서 filter는 학습이 가능하기 때문에 input을 output으로 확장하는 과정에서 학습한다.

 

Object Detection

object detection의 경우, 한 이미지에 여러 가지 class를 맞추는 task이다. 즉, classification + localization을 한다. class와 좌표를 모두 맞춰야하기 때문에 loss를 각 loss를 더하여 학습한다. 하지만, 이렇게 학습할 경우 한 이미지에 객체의 개수가 다를 경우 구조가 달라져 문제가 생긴다. 이를 해결하기 위해, CNN을 여러 번 통과시킨다.

 

R-CNN

object가 있을 것 같은 region proposal을 이용해 학습한다. selective search를 통해 여러 가지 Regions of Interest (RoI)를 뽑는다. 즉, 관심 있는 영역들을 여러 개 뽑는다. 각 RoI를 224x224 픽셀로 변환한 후 CNN을 통과시켜 classfication과 bounding box에 대해 regression을 진행한다. CNN은 AlexNet, VGGNet 같은 pretrain된 모델을 사용하였기 때문에 이미지를 224x224 픽셀로 줄여 어떤 이미지 해상도든 학습할 수 있도록 하였다. 하지만, R-CNN은 RoI를 너무 많이 뽑아야 해서 속도가 너무 느리다. 이를 해결하기 위해, Fast R-CNN이 등장한다.

 

Fast R-CNN

각 RoI를 CNN에 통과시키지 말고 이미지를 CNN에 통과시켜 feature map을 이용해 RoI를 뽑아서 crop하고 resize하여 CNN을 통과하여 bounding box regression과 classification을 한다. 하지만, 이미지에서 selective search를 했기 때문에 완전히 feature map에 대응되지 않는다. 이를 해결하고자 RoI align과 원하는 크기로 맞추기 위해 RoI pooling을 적용한다.

 

RoI Align

selective search를 통해 찾은 영역의 크기와 feature map에서의 크기가 다를 수 있다. 원본 이미지에서의 좌표를 비례해서 feature map 좌표로 계산을 했는데 정수로 나오지 않는 경우가 있다. 이를 해결하기 위해, RoI Align을 적용한다.

 

초록색 좌표를 얻기 위해 주변 좌표를 이용하여 계산한다. bilinear interpolation이라고 한다. 식을 보면 4가지 경우가 존재한다. (i=1,j=1), (i=1,j=2), (i=2,j=1), (i=2,j=2). max를 통해 얼마나 유사한지 계산을 하는 것이다. 그 값을 f 좌표와 곱한다. 즉, 유사한 좌표는 많이 반영되고 유사하지 않는 좌표는 덜 반영된다.

 

이제 각 초록색 좌표 값들을 모두 계산했으니 원하는 크기로 pooling을 한다. 항상 같은 크기로 풀링을 하기 위해, RoI Pool을 적용한다.

 

RoI의 크기가 무엇이든 간에 2X2 크기로 나누고 max pooling을 한다. 이를 통해, 학습 시간과 테스트 시간을 많이 감소시켰다.

 

Faster R-CNN

Faster R-CNN은 selective search를 사용하지 않고 network로 해결한다. 여기서, Region Proposal Network (RPN)이 등장한다.

 

다음과 같이 고정된 크기의 anchor box를 사용하여 region proposal을 사용한다.

 

각 region proposal들에 대해 classification을 해야하니 1x20x15 만큼 수행하면 된다. bounding box는 4x20x15. 하지만, 객체의 크기가 더 작거나 길수도 있기 때문에 k개의 다양한 anchor box를 만든다. 이를 통해, 더 빠른 속도로 해결할 수 있게 되었다.

 

Instance Segmentation

Instance마다 segmentation을 따로 한다. 즉, 고양이가 2마리 있어도 각각 다르게 segmentation을 한다. object detection에서 mask prediction을 추가한 것이 Mask R-CNN이다.

 

기존 Faster R-CNN에서 기존 semantic segmentation에서 수행한 것을 추가한다. 

 

Mask R-CNN 모델의 실제 결과이다.

 

Mask R-CNN 모델은 pose estimation도 가능하다.