cs231n Lecture 11 | Detection and Segmentation

shyoon·2025년 1월 5일
0

cs231n

목록 보기
7/7
post-thumbnail

해당 시리즈 포스팅은 스탠포드 대학의 cs231n 강의 내용을 정리한 글입니다.

Semantic Segmentation

기존 Image Classification task가 한 이미지에 대한 카테고리를 예측하는 것이었다면, Semantic Segmentation은 한 이미지 내에서 각 픽셀에 대한 카테고리를 예측하는 task이다.

Semantic Segmentation은 개별 객체를 구분하지는 않기 때문에 우측 하단 그림처럼 소 두 마리가 겹쳐 있다고 해서 그 둘을 따로 구분하진 않고, 그저 소에 해당하는 픽셀인지만 구분한다. 이 단점을 해결하는 것이 Instance Segmentation.


Sliding window

입력 이미지를 아주 작은 단위의 패치로 쪼갠 다음 각 패치에 대한 classification을 수행하는 것이다. 어느 정도 동작은 할 수 있으나, 모든 픽셀에 대해서 작은 영역으로 쪼개고, 이 모든 영역을 forward/backward pass 하는 것은 매우 비효율적이고, 서로 다른 영역이더라도 겹치는 구간이 어느 정도는 존재하게 된다.


Fully Convolutional

Fully connected layer가 없고, conv layer로만 구성된 네트워크이다. Convolution을 할 때 3x3 zero padding을 수행하게 되면 이미지의 spatial information을 잃지 않으면서 최종 출력은 CxHxW 크기인데, 이 때 C는 클래스의 수이다. 모든 픽셀의 Classification loss를 계산하고 평균을 취해서 back propagation을 수행한다.

대신 입력 이미지의 spatial size(HxW)를 계속 유지 시켜야 하는데, 만약 고해상도의 이미지가 들어오게 되면 계산량과 메모리가 너무 많이 든다.


따라서 네트워크 내부에서 downsampling 및 upsampling을 적용해주는 구조가 많이 쓰이게 되었다. 앞쪽의 높은 해상도에서는 conv layer를 조금만 사용하고, 점점 max pooling과 stride를 높여가면서 feature map을 downsampling 한다.

Image Classification 에서도 앞까지는 유사한 구조지만 뒤에는 보통 FC layer가 있었다. 하지만 Semantic Segmentation에서는 다시 spatial resolution을 다시 키우는 과정이 붙는다.

Downsampling은 pooling이나 strided convolution으로 한다 치고, Upsampling은 어떤 방식을 사용해야할까?


Unpooling

  • Nearest Neighbor
    • 2x2 를 input으로 받았다면, 해당하는 receptive field로 값을 그저 복사해서 4x4 를 출력한다.
  • Bed of Nails
    • unpooling region에만 값을 복사하고 다른 곳에는 모두 0으로 채워넣는 방식이다.

  • Max Unpooling
    • Bed of Nails와 유사하되, 같은 자리에 값을 넣는 게 아니라 이전 max pooling에서 선택된 위치에 맞게 채워준다.

Transpose Convolution

Downsampling 시 Strided convolution(stride를 늘려서 downsampling)은 고정된 함수가 아닌, 어떤 식으로 downsampling을 수행할 지 학습이 가능하다. 마찬가지로 feature map을 어떤 식으로 Upsampling 할 지 학습 가능한 방법이 Transpose Convolution이다.

우선 Stirde 2인 strided convolution을 보면, stride 를 2로 설정함으로써 이 2라는 값은 입력, 출력에서 움직이는 거리 사이의 비율이라고 해석할 수 있다. 위 슬라이드를 예시로 본다면 output에서 한 칸 움직이려면 input에서는 2칸 움직여야 한다. 이는 학습 가능한 방법으로 2배 downsampling 하는 것이다. (일반적인 pooling은 학습 없음)


그럼 이제 Transpose Convolution을 본다면, 우선 input feature map에서 값을 하나 선택한다. 위 슬라이드의 input에서 빨간 값이 선택되었다고 하자. 이 값은 하나의 스칼라 값이다.

이제 이 스칼라 값은 3x3 필터와 곱해서 출력의 3x3 영역에 그 값으로 채워 넣는다. 필터와 입력의 내적이 아닌, 입력 값은 필터에 곱해지는 일종의 가중치 역할을 하게 된다.


그럼 이제 input의 빨간 값에서 한 칸 움직여서 파란 값이 선택되면, output에서는 두 칸 움직인다. 마찬가지로 똑같이 파란 스칼라 값을 필터에 곱해서 출력 값에 넣어준다. 이 때 출력에서 이전 receptive field와 겹치는 부분은 두 값을 더해준다.

이 과정을 반복하는 것이 Transpose Convolution이다. Deconvolution이라고도 하지만, 신호처리 관점에서 deconvolution은 정확히 convolution의 역 연산을 의미하기 때문에 Transpose Convolution이라고 하자. 이 외에도 up convolution(Unet 논문에서는 이렇게 표현), fractionally strided convolution, backwards strided convolution 이라고도 불린다.


Transpose Convolution을 이해하기 쉽게 1D로 표현하면 위 슬라이드처럼 표현될 수 있다.

그래서 왜 Transpose Convolution이라고 이름이 붙여졌을까?


stride가 1인 경우, 좌측 행렬곱에서 1D 필터는 xx, yy, zz 세개의 값을 갖는 3x1 벡터라고 생각하고, input aa는 [0 a b c d 0] 벡터인데, 이에 1D convolution을 진행 한다는 건 XX행렬과 aa 벡터를 행렬 곱 한 결과와 같다.

그렇다면 우측 행렬곱을 보자. 단지 XX 의 전치(Transpose) 행렬과 aa를 곱했을 때 결과는 위와 같은데, 이 결과는 기본 convolution과 결과는 유사하다.


하지만 stride가 2 이상인 경우, XX의 전치 행렬과 aa의 곱은 위에서 예시로 보았던, 우리가 Transpose Convolution이라고 부르는 연산 결과와 같아진다. 그래서 Transpose Convolution이라고 부르는 듯하다.

강의를 들으며 ‘왜 겹치는 부분은 합을 취해주는가?’ 라는 의문이 있었는데, 강의에서도 한 학생분이 똑같은 질문을 했다. 이에 대한 답은 Transpose Convolution 수식과 맞추기 위함인 것 같다. 실제로 이 때문에 checkerboard artifacts가 발생하는 문제가 있고, 4x4 stride 2 혹은 2x2 stride 2로 사용하면 문제가 조금은 완화된다고 한다.


Classification + Localization

Classification + localization task는 이미지 내에서 객체 하나 만을 찾아서 레이블을 매기고 위치까지 찾아내는 작업이다. 말 그대로 이미지 분류를 하고, 그 객체가 어디 있는지 까지 알아내는 작업이다. 다만, 오직 하나의 객체만 있다고 가정한다는 면에서 Object detection과는 구분된다.


위 슬라이드에서 예시로 AlexNet의 입력으로 이미지를 받아서 마지막으로 Fully Connected Layer에 1000가지 class score를 받아서 카테고리를 분류하는 것 까지는 같다. 여기서 4개의 원소를 갖는 벡터와 연결된 FC layer가 하나 더 추가된다. 이는 x,y 좌표와 width, height 값으로 객체의 bounding box 좌표를 나타낸다.


이 때 loss는 softmax 말고도 하나 더 존재한다. 바로 Ground Truth Bounding Box와 예측한 Bounding box 사이의 차이를 측정하는 loss(위 슬라이드에선 L2 loss) 이다. (따라서 이미지의 카테고리 레이블과 객체의 bounding box ground truth 모두 갖고 있어야 한다.)

하지만 만약 두 loss에 대한 학습을 동시에 진행할 때, classification 결과가 오분류라면 bounding box에 대한 예측도 의미가 없어지거나 성능을 떨어트릴 수 있다는 생각이 드는데, 많이 쓰는 해결책 중 하나는 Bbox를 하나만 예측하지 않고 각 카테고리마다 하나씩 예측하고, Ground Truth 카테고리에 속한 예측된 Bbox에만 loss와 연결 시키는 방법이 있다.


Human Pose Estimation

사람의 관절 수가 모두 같다는 가정 하에, 14개의 관절의 위치를 예측하여 사람의 포즈를 예측하는 task이다. 예측된 14개의 점에 대해서 regression loss를 계산하고 backpropagation으로 학습 시킨다.


Object Detection

Classification + localization 와 달리, 이미지 마다 예측해야 하는 Bbox의 수가 달라져서 Regression 문제를 풀기 훨씬 까다롭다.


Sliding Window

과거 많이 사용했던 방법 중 하나로, Semantic Segmentation에서 이미지를 작은 패치로 쪼갰던 것과 비슷한 아이디어이다.

입력 이미지로부터 작은 영역을 추출해서 그 부분만 CNN의 입력으로 넣고 이에 대한 분류를 수행한다. 위 영역의 경우에는 고양이나 강아지가 없는 배경으로 분류 될 것이다.


이번엔 위와 같은 영역을 추출해서 분류한다면, 강아지로 분류가 될 것이다. 단순한 아이디어지만, 이 방식은 여러 문제점이 발생한다.

  1. 이미지에 몇 개의 객체가 존재할 지, 그리고 어디에 존재할 지 알 수 없다.
  2. 객체의 크기가 어떠한 지도 알 수 없다.
  3. 작은 영역 하나하나 CNN을 통과시키려면 계산량이 어마어마하다.

Region Proposals

또 다른 전통적인 방식으로, 딥러닝을 활용하지는 않고 전통 신호 처리 방식을 활용한다. 이미지 내에서 blobby(뭉텅진) 한 곳들을 찾아서 객체가 있을 법 한 1000개의 Bbox를 제공해준다. Selective Search라는 알고리즘은 3초 내로 2000개의 Bbox를 얻을 수 있다.


Region-Based Methods

Region Proposals을 얻어서 Region Proposal Network를 통과시키는 R-CNN 시리즈에 대해서 알아보자.

R-CNN

  1. 이미지가 주어지면 Region proposal(ROI)을 얻기 위해 Region Proposal Network를 수행한다. Selective Search라는 고정된 알고리즘을 통해 2000개의 ROI를 얻는다.

  1. 추출된 ROI로 CNN Classification을 수행할 때 Input size를 맞춰줘야 하기 때문에 ROI들을 같은 크기로 Warping 해준다.

  1. 각 ROI들을 CNN을 통과시켜서 각각 분류를 적용한다. R-CNN에서는 SVM을 사용하였다.

  1. Region proposals를 보정하기 위한 regression 과정을 거친다.

R-CNN의 문제점은 2000개의 독립적인 ROI들이 모두 CNN의 입력으로 들어가게 되어 학습이 상당히 느리고, 이 ROI들을 선택하는 Selective Search도 고정된 알고리즘이라 문제가 될 수 있다. 심지어 Inference에도 이미지 한 장 당 대략 30초가 소요된다. 너무 느리다.


Fast R-CNN

위와 같은 R-CNN의 문제점들을 상당히 해결한 것이 Fast R-CNN이다.

  1. 입력 이미지에서 Selective Search 방식으로 ROIs를 구하는 방식 대신, 먼저 전체 이미지에 CNN을 수행하여 전체 이미지에 대한 고해상도 feature map을 얻은 후에 여기서 Selective Search를 수행하여 ROIs를 얻는다. 이렇게 되면 CNN의 feature를 여러 ROI들이 공유할 수 있다.

  1. FC-layer를 거치기 전 Input의 크기를 맞추기 위한 ROI pooling layer를 먼저 지난다. 이는 학습이 가능하다.

  1. Warping 된 ROI들을 FC layer의 입력으로 넣어 Classification score와 Linear Regression offset을 계산한다.

  1. 학습 시에는 마찬가지로 두 loss를 합쳐 Multi-task loss로 Backpropagation을 진행한다.

R-CNN과 비교하여 Fast R-CNN은 10배 가량 빠른 학습 속도를 보이고 Inference에도 매우 빠르다. 이미 매우 빠르긴 하나, Region Proposal에서 대부분의 시간을 잡아먹는 점이 아직도 아쉬운 점이다. 이 Region Proposal 시간까지 줄일 수 있다면 훨씬 더 빨라질 수 있다.


Faster R-CNN

이를 더 개선한 것이 Faster R-CNN이다. R-CNN 시리즈는 닉값을 하는 것 같다.

ROI들을 구하는 부분이 병목인 점을 개선하고자 하여, 네트워크가 직접 ROI들을 만들 수 있게 설계되었다. 입력 이미지 전체가 CNN에 들어가서 feature map을 만드는 것 까지는 동일하고, 이를 갖고 별도의 Region Proposal을 계산하는 Region Proposal Network(RPN)가 존재한다. 이를 통해 ROIs를 얻고 나면 나머지는 Fast R-CNN과 동일하다.

추가된 RPN으로 인해 Faster R-CNN은 총 네 개의 loss를 한 번에 학습한다. 이 RPN의 loss 중 한 가지는 이 곳에 객체가 있는 지 없는 지를 분류하고, 나머지 하나는 예측한 Bbox에 관한 것이다.


Single Shot Methods

Region-based methods와 다르게 feed forward를 오로지 한 방향으로 수행하는 네트워크들이다. 각 Task를 따로 계산하지 말고 하나의 regression 문제로 해결하는 방식.

YOLO / SSD

포스트를 작성하는 2024년 말 시점 v11까지 나온 YOLO…

입력 이미지를 7x7의 그리드로 나눈다. 그리고 각 그리드에는 Base Bbox들이 있는데,

슬라이드의 그림처럼 세로로 긴 박스, 정사각형 박스, 가로로 긴 박스 이런 식의 한 그리드를 중심으로 다양한 모양의 Bbox들이 올 수 있다.

이들을 기준으로 실제 위치가 되려면 base Bbox를 얼만큼 옮겨야 하는 지에 대한 offset을 예측한다. 그리고 각 Bbox에 대해서 그 안에 해당 카테고리에 속한 객체가 존재할 가능성의 Classification scores를 계산한다.

출력 결과를 보면 각 그리드 별로 (5B+C)(5B + C) 개의 tensor를 가지는데, 여기서 B는 한 그리드의 base Bbox 개수이고, 5를 곱해주는 이유는 각 Bbox 당 dx, dy, dh, dw 와 confidence를 저장해야하기 때문이다. 그리고 CC 는 background를 포함한 클래스의 개수이다. 따라서 2D 이미지를 입력으로 받아서 출력은 3D Tensor를 뱉게 되고 이를 거대한 CNN으로 한 번에 학습 시킨다.

개별 ROI에 대한 연산이 아니기 때문에 Faster R-CNN보다도 빠르다는 연구 결과가 있다.


Instance Segmentation

입력 이미지가 주어지면 객체 별 위치와 레이블을 알아내는 task로, Object detection과 유사하지만 Bbox가 아닌 Segmentation mask를 예측해야 한다.


Mask R-CNN

입력 이미지를 CNN에 통과시켜 얻은 feature map으로 RPN을 거쳐서 ROIs를 얻는 것 까지는 Faster R-CNN과 동일하다. 하지만 그 후 Classification / Bbox Regression을 하는 것이 아니라, 각 Bbox를 갖고 해당 ROI 영역 내에서 Segmentation mask를 예측하도록 한다.

ROI pooling을 진행한 후에는 두 갈래로 나뉘게 되는데, 상단 갈래는 Faster R-CNN처럼 각 ROI가 어떤 카테고리에 속하는지 계산하고, 그 좌표를 보정해주는 Bbox regression도 수행한다.

하단 갈래에는 Semantic Segmentation을 위한 미니 네트워크가 있어서 각 픽셀마다 객체인지 아닌지를 분류한다.


Reference

profile
큰 사람이 되겠어요

0개의 댓글