cs231n 2025 ver. - Lecture 9

이준학·2026년 6월 20일

cs231n

목록 보기
15/17

    이번 강의는 Object Detection, Semantic Segmentation, 그리고 Visualization에 대한 내용이다. 이전 버전의 Detection 강의랑은 많이 달라졌다. 천천히 살펴보자.

1. Recap

1) Transformer & ViT

    Lecture 8은 Attention과 Transformer에 대한 내용이었다. 우리가 Sequence를 처리하는 방법은 아래와 같이 RNN, Convolution, Self-Attention 3개이다.

각자 장단점들이 있었지만, scalable하고 parallel하다는 것이 장점인 Self-Attention이 요즘까지도 가장 많이 사용되는 방법이었다. 이를 기반으로 한 모델이 Transformer이며, 그 구조는 아래와 같다.

이러한 방법론은 이미지에 적용한 것이 ViT였으며, 구조도는 아래와 같다.

먼저 이미지를 patch로 나누고 이들을 linear projection을 통해 D-dim vector로 만든다. 이미지의 순서를 반영하기 위해 positioning embedding을 추가해준다. 이후로는 Transformer와 동일한 과정이다. 만약 Image Classification을 진행한다면, 위의 구조도처럼 추가적인 input token인 classification token을 추가해주고, 이를 통해 각 class score를 얻도록 한다.

    이미지를 다루기 때문에 masking은 필요 없으며, 오히려 다른 patch들을 함께 보면서 학습을 진행해야 한다. 오늘날의 다양한 알고리즘은 ViT에 기반을 두고 있다.

2) Variants & Tweaks

    Transformer 구조에서 나온 다양한 모델들에 대해 알아보자. 강의에서 Pre-Norm Transformer, RMSNorm, SwiGLU MLP, Mixture of Experts(MoE) 를 언급했지만, MoE만 자세히 알아보려고 한다.

MoE는 현재의 architecture에도 많이 사용되는 방법이다. MLP layer를 여러 set 학습하고, 각 set를 expert라고 취급한다. 각 token은 여러 set의 MLP로 넘어오게 되는 구조인 것이다. GPT, Claude, Gemini 등 유명한 LLM 모델들은 이러한 방식을 사용한다고 한다.

이제 9강의 내용을 살펴보자.

2. Semantic Segmentation

    Semantic Segmentation은 위의 사진과 같이 pixel-wise classification을 진행하는 task이다. 이때 instance는 구분하지 않는다. 만약 하나의 image에 같은 class object 여러 개가 있다면 각 object를 구분하지 않고 하나의 class로만 취급한다는 의미이다. 쉽게 말해서 이미지 내의 모든 pixel들의 classification이 필요한 것인데, 이것이 생각보다 쉽지 않을 수 있다.

1) 문제 해결을 위한 다양한 접근법

    어떻게 하면 Segmentation task를 효과적으로 해결할 수 있을 지 몇 가지 방법들에 대해 생각해보자.

i. Sliding Window

    이미지에서 하나의 pixel만 보고 어떤 class인지 예측하는 것이 가능할까? 인간에게도 그것은 불가능한 일일 것이다. 그래서 자연스러운 접근은 주변의 context(주변 pixel)가 필요하다는 접근이다.

이미지 내에서 patch를 뽑고, 주변 pixel들을 이용해 patch의 가운데 pixel의 class를 예측하는 것이다. CNN과 같은 네트워크를 이용해 할 수 있을 것 같아 보이지만, 하나의 이미지만 하더라도 너무나 많은 연산이 필요하기 때문에 time-consuming하다는 문제점이 있다.

ii. Convolution

    다음 접근 방법은 이미지를 CNN에 encode하고, 마지막에 Semantic Segmentation을 진행하는 것이다.

그런데 CNN은 구조에서 오는 단점이 있다. layer를 지날 수록 spatial size가 줄어든다는 것이다. 하지만 segmentation은 input과 같은 사이즈의 output이 나와야 하므로 이러한 단점은 치명적이다.

2) Fully Convolutional Networks (FCN)

    위와 같은 단점 때문에 등장한 것이 FCN이다. input 때와 같은 size의 output을 만들 수 있도록 한 것이 주요한 contribution이다.

좋은 방법이지만, input의 크기를 그대로 유지하는 것 또한 많은 비용이 들 것이다. 이를 보완하기 위한 것이 Downsampling -> Upsampling의 구조이다. 이 방법에 대해 자세히 보기 전에, 새로 등장하는 개념들에 대해서 먼저 이해해야 한다. 바로 Unpooling이다. 우리가 CNN에서 배웠듯이, pooling은 feature map의 크기를 줄여주는 도구로 사용되었다. 단어에서도 알 수 있듯이, Unpooling은 pooling에 반대되는 개념이다.

위의 사진에서도 볼 수 있듯이, input의 크기를 늘리는데 사용되는 개념이다. Nearest Neighbor는 늘리려고 하는 pixel들에 원래 input의 값을 복사해서 넣는 것이고, Bed of Nails는 하나를 제외한 값들은 모두 0으로 채우는 방식이다.

    조금 전 우리는 FCN에서 Downsampling -> Upsampling 구조를 사용한다고 배웠다.

효율적인 구조를 위해 downsampling 때는 pooling과 strided convolution이 사용되고, upsampling 때는 unpooling 또는 transposed convolution이 사용된다.

Transposed Convolution

    이 개념도 이름에서 알 수 있듯이 convolution의 반대 개념이라는 느낌이 든다. 이 개념을 이해하기 위해 먼저 Strided convolution 혹은 learnable downsampling을 보자.

이것이 우리가 알고 있는 strided convolution이다. stride로 인해 input에 건너뛰는 pixel들이 생겨 자연적으로 output의 크기는 줄어들게 된다. 이를 learnable downsampling이라고 표현하기도 한다.

이와 반대되는 개념이 transposed convolution인데, 정확히 어떤 점이 strided convolution과 다른지 아는 것이 중요하다. strided convolution에서는 input에 filter를 얹어 그 값들을 곱하고, 그들의 합을 구한다. 그러나 transposed convolution에서는 filter에 input pixel 1개의 값을 다 곱하고, 그들이 output으로 가게 된다. 예시를 통해 더 자세히 알아보자.

위의 사진은 Andrew Ng 교수님의 강의에서 교수님이 다룬 내용이다. 우리의 세팅과 동일하다. input의 pixel 값 2가 3x3 filter의 각 숫자들과 모두 곱해지고, 그 곱해진 것들이 output에 들어가게 되는 것을 확인할 수 있다. (output의 회색 영역이 padding=1을 나타내기 때문에 들어가지 않는 숫자들도 있다.) 값들이 겹치게 된다면 아래 사진과 같이 값들을 더해준다.

이렇게 FCN은 Learnable Downsampling(Strided Convolution) -> Learnable Upsampling(Transposed Convolution) 의 구조를 갖는 것이다. 이러한 구조를 사용해 현재까지도 흔한 architecture가 UNet이다.

3) UNet

    UNet의 구조는 위에서 우리가 본 것과 비슷하다. Downsampling -> Upsampling 구조를 가지고 있으며, 전체적인 구조도는 아래와 같다.



모델은 크게 Downsampling phase와 Upsampling phase로 나눌 수 있는데, Downsampling에서는 spatial 정보가 줄어들고 채널 수가 많아진다. 반면 upsampling에서는 다시 spatial 정보가 크게 복원되고, 채널 수는 줄어드는 형태이다. 여기까지는 위의 내용과 동일하다.

그러나 위의 사진에서 볼 수 있듯이, 복원할 때 부족한 디테일을 보충하기 위해 downsampling 시에 나온 feature map을 concat해서 더 좋은 퀄리티를 만들 수 있게 해준다. 단순하지만 효과적인 방법이다.

3. Object Detection

    다음은 Object Detection이다. 일단 Object Detection은 Classification + Localization을 해야 한다. Localization은 물체가 어디에 있는지 박스를 치는 것을 의미한다. 그러므로 Object Detection이라는 task는 물체가 어떤 class에 속하는지, 그리고 그 물체를 포함하는 bounding box까지 치는 것까지 해야 하는 것이다. 이미지에 object가 하나만 있는 single object의 경우와 여러 object가 있는 Multiple Object의 경우를 차례로 보며 차근차근 배워보자.

1) Single Object

    먼저 single object의 경우이다. 앞서 말하기도 했지만, 우리가 이미지에서 뽑아내야 하는 것은 object class, 그리고 bounding box이다. bounding box는 주로 (x,y,w,h) 와 같은 좌표로 나타낸다. 박스의 가운데 점의 좌표 (x,y)와 그 width & height를 나타내는 (w,h) 로 구성되어 있는 것이다. 좌표를 나타내는 방법은 굉장히 다양하고, 정하기 나름이다. (x,y,w,h)는 그 중의 하나 정도라고 받아들이면 좋을 것 같다.
  이제 classification과 localization을 어떻게 해결하면 좋을 지 생각해보자.

답은 multitask loss이다. 해결해야 할 문제도 두 개이니, 두 개의 loss를 사용하자는 것이다. classification은 그 동안에 배웠듯이 Softmax loss를 사용한다. localization은 L2 loss로 해결한다. 거리를 다루는 loss function이기 때문에 bounding box의 위치를 조정하기에 적합해 보인다. localization을 regression problem으로 보는 것이다. 이 두 가지 loss를 더한 것을 최종 loss로 사용하는 것이다. 즉, 아래와 같은 최종 loss 식을 갖는다.

Loss= softmax loss(Classification) + L2 loss(Localization)\text{Loss= softmax loss(Classification) + L2 loss(Localization)}

이러한 해결 방법은 single object일 때는 좋지만, Multiple Object의 경우에는 출력해야 하는 숫자들의 개수가 계속 바뀌기 때문에 좋지 않다.

2) Multiple Objects

    만약 이미지 내 object가 여러 개라면 어떻게 문제를 해결할 수 있을까? 일단 가장 naive한 방법은 이미지를 다양한 크기로 crop해서 CNN에 태우고, CNN이 각 crop을 object/background로 classification 하는 방법이다. 그러나 이렇게 하면 너무나 많은 시간과 자원이 소모된다는 단점이 있다. object가 이미지에서 어디에 있을지 모르고, object들의 크기도 다를 수 있기 때문이다. 이를 커버하려면 계산량이 어마어마하고 시간도 오래 걸릴 것이다.
  그래서 등장한 것이 Region Proposal(Selective Search)이다. 이미지에서 object가 있을 만한 region을 뽑아내는 것이다. 이러한 방식이 naive한 방법보다는 상대적으로 속도가 빠르다고 한다.

이제 여러 네트워크들을 살펴보며 Object Detection이 어떻게 이루어지는지 알아보자.

i. R-CNN

    먼저 R-CNN이다.

위와 같은 구조를 갖는다. 먼저 위에서 본 Region Proposal을 이용해 이미지에서 Region of Interest(RoI)를 약 2000개 가량 뽑는다. 그리고 이를 224x224 pixel 크기로 warp 시킨 후, ConvNet에 태운다. 이를 모든 RoI에 대해 진행하고, 각 CNN은 bbox(bounding box)의 좌표와 region의 class 값을 담고 있는 SVM이 출력된다. 이를 통해 bounding box를 수정하고, classification까지 진행하는 것이다. 이전 방법보다 좋은 접근이지만, 여전히 2000개의 region에 대해 CNN을 한 번씩 태워야 한다는 점 때문에 속도가 느릴 수 밖에 없다.

ii. Fast R-CNN

    R-CNN의 속도가 느리다는 점을 보완하고자 등장한 모델이 Fast R-CNN이다. RoI를 뽑고 각 region에 대해 다 CNN을 돌리지 말고, 이미지를 AlexNet, C˝˝Net, ResNet과 같은 backbone CNN에 넣고, 그 중 conv5 layer의 feature map에서 RoI를 찾는 방식이다.

RoI를 Crop+resize한 후 CNN에 넣고, 거기서 bbox offset과 object의 class를 예측하는 방식이다. R-CNN에 비해 빨라지긴 했지만, 여전히 RoI를 뽑는데 많은 시간이 걸린다. 이를 만약 learnable한 네트워크로 만들 수 있다면 좋을 것이다.

iii. Faster R-CNN

    Fast R-CNN에서 더 속도를 끌어올리기 위해 고안된 모델이 Faster R-CNN이다. CNN이 Region Proposal을 하게 하는 것이 주된 아이디어이다. 이렇게 Region Proposal을 하는 네트워크를 Region Proposal Network(RPN)이라고 한다. 다른 부분들은 Fast R-CNN과 동일하다.

RPN
  RPN은 아래와 같은 구조를 갖는다.

먼저 이미지를 CNN에 태워 feature map을 얻는다. 그 feature map에서 random하게 object가 어디 있을지 예측하는 것이다. 이를 위해 fixed size anchor box를 사용한다. 각 지점에서 anchor box 안에 object가 포함되어 있는지 예측한다. Yes/No의 binary classification을 하는 것이다. 만약 object가 있다면, anchor box와 GT box 사이의 correction을 계산한다. 위의 사진을 보면 anchor가 object인지에 대한 1개의 숫자와 bbox 좌표 correction을 하는 4개의 숫자가 있는 것을 확인할 수 있다. 실제로 RPN이 사용될 때는 size와 scale이 다른 K개의 anchor box를 사용한다.

    이러한 RPN + refinement network 방식은 효과적이지만, two-stage object detector라는 점이 단점이다. RPN network에서 region을 뽑고, 이것을 이용해서 bbox regression과 classification을 진행하기 때문이다. 만약 single-stage object detector가 있다면 더 간단한 네트워크가 될 것이다.

3) Single-Stage Object Detectors

    이제 요즘에도 많이 사용되는 single stage object detector들에 대해서 알아보자. 대표적인 모델로는 YOLO, SSD, RetinaNet, 그리고 DETR 등이 있다. 여기서 중요한 모델 하나를 꼽으라고 하면 단연 YOLO가 될 것이다. 속도가 굉장히 빨라 real-time object detection에 현재까지 많이 사용되고 있다.

i. YOLO (You Only Look Once)

    YOLO는 현재까지도 강력한 모델이며, 여러 버전이 나와서 여기서 다루는 내용 이외에 논문을 직접 찾아보는 것도 도움이 될 것이라고 한다. 일단 YOLO가 어떻게 작동하는지 그 원리를 알아보자.

  1. 먼저 이미지를 SxS 크기의 grid로 나눈다. (하나의 grid가 SxS 크기여야 한다는 의미다.)
  2. 각 grid마다 CNN을 통과하며, output은 위의 사진과 같이 box에 object가 있을 확률, B개의 bounding box 좌표, class에 속할 확률 3개가 나온다.
  3. thresholding을 통해 object가 있을 만한 확률이 가장 높은 bounding box들을 골라내게 된다.

이야기한 전반적인 과정을 그림으로 나타내면 아래와 같다.

이 정도가 강의에서 YOLO를 소개한 전부인데, 나중에 논문도 읽어볼 생각이다.

ii. DETR (Object Detection with Transformers)

    다음은 Transformer Architecture를 이용한 DETR이다. Transformer를 통과하면 box들을 output하는 것이 특징이다. anchor box나 regression도 없다.

위의 사진이 전체적인 구조도이다. 먼저 이미지가 CNN을 통과해 만들어진 feature map을 positional encoding과 함께 Transformer Encoder-Decoder에 보낸다. 그러면 box들이 출력되고, 이를 FFN(feed forward network)을 통해 object가 있는지 여부와 object의 class, bbox의 좌표를 얻게 된다.
  decoder 부분에 보면 object query가 있는데, 이는 learnable한 parameter로, 우리가 찾고 있는 object 개수 = object query의 개수가 된다. FFN은 일단 object의 유무, 그리고 만약 있다면 class랑 bbox 좌표를 출력하게 된다.

4. Instance Segmentation

    다음으로 살펴볼 task는 Instance Segmentation이다. Semantic Segmentation은 같은 class의 object끼리는 구분하지 않고 하나의 instance로 처리했다. 그러나 Instance Segmentation은 같은 class의 object끼리도 구분하는 task이다.

거창한 변화는 아니다. Instance Segmentation으로 유명한 모델은 Mask R-CNN인데, 이는 Faster R-CNN을 기반으로 한다.

달라지는 것은 많이 없으며, 그저 네트워크 마지막 단에 작은 mask network를 더해준다. 이 mask network는 각 RoI에 대해 작동하며, mask를 예측한다.

Mask R-CNN은 꽤 좋은 성능을 보이며, Pose Estimation에도 사용된다.

강의에서는 Open Source Framework에 대해서도 소개해주는데, Detectron2가 소개된다.

5. Visualization and Understanding

    인공지능 네트워크들을 이해하는 것, 그리고 그 안에서 어떤 일이 일어나는지에 대한 연구는 지속적으로 진행되어 왔다. 인공지능 네트워크를 이해하기 위한 시도들에 대해 알아보자.

1) Visualizing Filters in Neural Networks

    AlexNet이나 다른 CNN의 filter들을 시각화 해보면 아래와 같다.

초기 layer들의 filter는 단순한 패턴을 학습하고, 뒤의 layer로 갈수록 receptive field가 커지며 복잡하고 semantic한 패턴들을 학습한다.

2) Saliency via backprop

    saliency map은 어떤 pixel이 중요한 지 알아보기 위해 사용되는 개념이다.

그 과정에서는 backprop을 사용하며, pixel value에 대한 class score의 gradient를 계산하면 그들을 시각화해서 어떤 pixel이 중요한 지에 대한 정보를 알 수 있다. 특정 pixel value를 바꾸면 특정 class의 score에 영향을 미쳐 score 값이 바뀐다고 해보자. 이러한 상황이라면 그 pixel이 classification에 중요한 영향을 끼친다고 해석할 수 있을 것이다.

Saliency map을 이용하면 어떤 부분이 중요하게 나오는지 위의 사진과 같이 확인할 수 있다.

3) Class Activation Mapping (CAM)

    CAM은 이후에 나올 Grad-CAM과 함께 CNN을 이해하는데 가장 많이 사용되는 알고리즘 중에 하나이다. CNN을 해석하는 것이 용이한 이유는 그들의 고유한 architecture가 tracable한 특성을 가지기 때문이다.

자세한 얘기는 하지 않겠지만, Class score를 이용해 feature map을 타고 올라가면 네트워크가 어떤 부분을 중요하게 생각하는지 알 수 있다.

위의 예시는 실제 이미지를 가지고 CAM을 뽑은 것이다. 그러나 CAM의 단점은 마지막 Conv layer에만 적용할 수 있다는 것이다.

(솔직히 계산을 다 살펴본 것이 아니기 때문에왜 마지막 conv layer에만 적용 가능한지는 아직 모르겠다. 마찬가지로 논문을 살펴보며 이해해보려고 한다.)

4) Gradient-Weighted Class Activation Mapping(Grad-CAM)

    위와 같은 문제를 해결하기 위해 등장한 것이 Grad-CAM이다.

먼저, 임의의 layer를 고른다. 그리고 나서 그에 대한 class score의 gradient를 계산하고, global average pooling을 진행해 weight를 얻는다. 마지막으로 activation map을 계산한다.

위의 사진처럼 좋은 성능을 보이는 것을 알 수 있다.

CAM과 Grad-CAM은 더 많은 공부가 필요해 보인다. 강의에서는 구체적인 계산을 살펴보진 않았지만, 개인적으로 공부를 해보려고 한다.

6. 더 공부할 것

  • YOLO 논문 읽어보기
  • CAM, Grad-CAM 논문 읽어보기
profile
AI/ Computer Vision

0개의 댓글