
9강 Detection, Segmentation, Visualization, and Understanding
지난 강의에서 Attention과 Transformer의 구조에 대해서 살펴보며 문장 또는 이미지에서 어느 부분을 집중할 수 있도록 만들었다. 이번 강의에서 부터는 컴퓨터비전의 task 4가지에 대해서 살펴볼 것이며 특정 방법은 어떤 문제가 있고 이를 어떠한 발전과정을 거쳐 극복해 왔는지 그 흐름을 집중해서 보는 것을 추천한다.
Computer Vision Tasks
컴퓨터 비전의 테스크는 다음과 같이 4가지로 볼 수 있다.

왼쪽에서부터 단순히 물체를 분류하는 Classification, 픽셀 단위로 객체와 배경을 분류하여 이미지를 나누는 Semantic Segmentation, 물체를 감지하여 박스 형태로 나타낸 Object Detection, 그리고 픽셀 단위로 개별 객체들을 분류하여 나타내는 Instance Segmentation으로 나눌 수 있다.
우선 가장 먼저 Image Classification이 컴퓨터비전에 있어서 핵심이라는 것을 5강에서 확인할 수 있었다. 숫자 0과 1로 이미지를 보는 컴퓨터가 이해하도록 하는 것이 가장 기본적인 목표이다.

Semantic Segmentation

위 예시처럼 이미지의 픽셀별로 풀, 고양이, 나무, 하늘로 분류하는 것이 Semantci Segmentation이다. 이 task를 학습할 때에는 원본 이미지와 라벨을 붙인 이미지를 쌍으로 학습을 시키면 될 것이다. 그런데 이러한 라벨이 없는 test에서는 어떻게 이미지를 분류할 수 있을까?

검은색 픽셀하나로는 이 픽셀이 어디에 해당하는지는 판단할 수 없다. 그렇다면 이미지의 일부분인 패치로 나누어서 CNN와 같은 모델로 분류하면 될 것 같다.

그러나 이렇게 패치가 겹치면서 모델로 넣으면 굉장히 비효율적이다. 그렇다면 다른 아이디어로 전체이미지를 합성곱층에 넣고 segmentation을 하는 방법이 있다. 하지만 이것도 문제점이 있는데 이미지를 압축하여 특징을 추출하는 합성곱층은 이미지의 크기가 점점 작아질 것이다. 문제는 입력 해상도가 512x512라면 출력 해상도 역시 512x512로 나와야한다.

그래서 이렇게 입력의 해상도 HxW로 같도록 해상도를 유지하면서 합성곱 연산을 할 수 있는데 이것도 해상도를 낮추지 않으면 합성곱 연산이 굉장히 비싸다는 문제가 존재한다. 그래서 최종적인 아키텍처는 다음과 같이 해상도를 줄였다가 다시 늘리는 방법의 형태이다.

해상도를 줄이면서 이미지를 압축하는 방법은 Pooling, 합성곱 연산와 같은 방법이 존재한다. 이를 다운샘플링이라고 한다. 그렇다면 해상도를 키우는 방법인 업샘플링(또는 unpooling)은 어떻게 해야할까?

가장 간단한 방법으로 각 값을 그대로 복제하는 방법과 원래 값을 제자리에 나머지는 0으로 채운다. 또는 pooling할 때 위치를 unpooling 할 떄 위치로 사용할 수도 있다.
Learnable Upsampling
앞서 소개하였던 Upsampling 방법말고도 합성곱층을 이용해서 크기를 키우는 방법이 있는데 그것이 바로 Learnable Upsampling이다. 예를 들어, 기존 3x3 convolution에 이동 간격인 stride와 바깥쪽에 0을 채우는 padding이 각각 1인 경우에 다음과 같이 계산을 한다.

이렇게 필터와 겹치는 부분을 곱한 뒤 더하는 방법으로 통해서 계산을 하였고 stride가 2, padding을 1로 설정하면 4x4에서 2x2로 크기를 줄일 수 있었다. 그런데 이것을 반대 방향으로 진행한다면 2x2에서 4x4로 크기를 늘릴 수도 있다. 그래서 반대 방향으로 합성곱 계산을 한다고 해서 Transposed Convolution으로 불린다. 간략하게 예시로 살펴보면 다음과 같이 input에 filter를 곱하고 겹치는 부분은 더해준다.

이렇게 Semantic Segmentation에 대해서 알아보았고 이 task에서는 아래 오른쪽 사진의 소처럼 서로 다른 객체여도 하나의 Cow로 분류하고 있듯이 오직 해당 pixel이 어떤 물체인지만을 알 수 있다는 단점이 있다.

객체끼리 나누어서 보려면 Instance Segmentation으로 할 수 있고 이 task이전에 물체를 감지하는 Object Detection부터 알아보아야 한다.

Object Detection
단일 물체를 감지하여 박스로 표시하기 위해서는 2가지를 알아야한다.
1. 이 물체가 무엇인지 구별하는 classification
2. 박스의 좌표를 예측하는 localization
물체의 정체, 즉 라벨을 알기 위해서는 각 라벨의 확률을 구하고 가장 높은 것으로 예측을 하면 된다. 그런데 박스의 좌표의 경우에는 총 4개를 알아야 한다. x,y 좌표값과 너비와 높이인 w,h이다. 이 4가지를 구하려면 선형회귀와 같이 예측값을 4개를 구하여서 정답 박스의 4개의 값과 차이를 줄이도록 하면된다.

위와 같이 고양이 1마리의 사진에서는 고양이 라벨 1개 그리고 박스 좌표 4개를 예측하면 된다. 그리고 강아지 2마리와 고양이 1마리면 라벨 3개에 박스 좌표를 12개를 예측해야 한다. 하지만 이렇게 output의 갯수가 달라지게 되면 가중치의 차원이 바뀌어야 하는데 CNN은 고정된 가중치를 가지고 있어 불가능 하다. 따라서 여러 개의 물체가 있는 경우에는 이미지를 일부분으로 나누어서 그 잘라진 부분이 배경에 해당하는지 아니면 물체인지를 구별한다.

이 방법에 는 어떤 문제점이 있을까? 문제는 이렇게 잘라서 올바른 곳에 되는 경우만 하기 위해서는 될 때까지 CNN에 적용을 해야하므로 수많은 계산이 필요하다.

이 문제를 극복하기 위해서 사용하는 방법은 Selective Search이다. 단순하게 박스 중에서 객체가 있을만한 박스만 남기는 방법이다으로 CPU에서 몇초내로 약 2천개의 가능성이 높아보이는 박스를 region proposal로 제안한다.

R-CNN
Selective Search 방법을 이용한 R-CNN은 다음과 같이 진행한다.
1. 입력 이미지에서 selective seatch를 통해서 약 2천개의 Regions of Interest(ROI)를 구한다.
2. 다양한 크기의 ROI를 224x224의 크기로 맞춘다.
3. 이를 합성곱층에 통과시킨다.
4. SVM을 이용하여 분류하고 Bbox regression을 통해 box의 좌표를 구한다.

하지만 2천개 정도의 이미지를 독립적으로 합성곱층에 통과시키는 것은 매우 느리다. 그래서 제안된 방법으로 전체 이미지를 합성곱에 통과시키고난 feature space에서 이미지를 자르는 방법이다. 기존의 R-CNN보다 빠르다고 해서 Fast R-CNN으로 부른다.
Fast R-CNN
순서는 다음과 같다:
1. 전체 이미지를 커다란 모델인 backbone에 통과를 시킨다.
2. 통과하고 나온 feature map에서 ROI를 구한다.
3. 크기를 조정하고 CNN을 통과시킨다.
4. Linear 함수를 통해 라벨을 정하고 box 좌표를 구한다.

그렇다면 feature map에서 어떻게 ROI를 구하는 지에 대해서 살펴보자.
Region Proposal Network
합성곱 연산을 통과하고 나서의 CNN은 정보가 압축된 상태여서 원본 이미지하고 다르지만 이 부분에서는 이해를 돕기위해 동일하게 보았을 때 다음과 같은 합성곱층이 존재한다.

여기에 각 격자점 부분에 고정된 크기의 앵커 박스가 있다고 하면 20x15=300개의 앵커 박스가 있다고 가정할 수 있다.

이 앵커 박스들에 합성곱층을 한 번 더 적용을 하여 이 앵커는 물체를 포함하는 지에 대한 점수를 매긴다. 객체가 있다고 판단한 박스에 대해서 정답 박스로 변하기 위해서 얼마나 조정해야하는 지를 나타내는 box transform을 구한다.
YOLO (You Only Look Once)
Region Proposal Network처럼 후보 영역을 구한다음에 다시 한 번 합성곱층을 통과시키는 방법을 two-stage object detection이라고 한다. 이와 달리, 한 번의 forward만으로 구하는 방법을 Single-Stage Object Detectors라고 한다. 대표적인 모델로 YOLO / SSD/ RetinaNet등이 있고 그 중에서 가장 실제로도 많이 사용되고 유명한 YOLO에 대해서 알아보자.
You Only Look Once의 줄인말인 YOLO는 해석처럼 한 번에 이미지를 봐서 진행한다는 single-stage 모델이다. 실시간에 가까울 정도로 빠른 속도로 정확도 높은 결과가 나온다는 큰 장점이 있다.
우선 이미지를 격자 형태로 나누고 각 격자부분마다 B개의 박스를 예측하며 물체가 존재여부, 박스의 위치와 크기 그리고 어떤 클래스인지 확률 3가지를 예측한다. B=2라면 격자 셀 하나당 2개의 박스를 예측한다.

이렇게 수많은 박스 중에서 실제 정답 박스와 가장 가까운 박스를 선택하면 박스를 구할 수 있다.

DETR(Object Detection with Transformers)
Transformer를 이용한 Object Detection으로 DETR이 처음으로 사용하여 이 방법을 소개하고자 한다. 매우 간단한 파이프라인으로 CNN을 통과시킨 feature를 transformer로 보내면 박스 예측을 할 수 있다.

조금의 디테일을 더 알아보자면 feature map에 위치 정보인 positional encoding을 더하고 transformer의 인코더 부분에 넣는다. 그럼 encoder의 결과가 cross attention으로 key와 vaule가 디코더로 주입이 되고 decoder의 쿼리에 해당하는 object queries와 계산하여 이미지의 어떤 부분을 선택적으로 볼 것인지 조절할 수 있다.

Instance Segmentation
서로 다른 객체들을 구별하며 픽셀단위로 분류하는 Instance Segmentation을 알아보기 위해서 object detection에서 Fast R-CNN보다 발전된 아키텍처를 소개한다. Fast R-CNN보다 더 빠르다고해서 Faster R-CNN이다.

강의에서는 바로 넘어갔지만 Faster R-CNN의 발전부분을 언급하자면 region proposal network를 도입하였다는 것이 가장 핵심이다. Fast R-CNN에서 사용한 selective search의 경우에는 1장 처리에 약 2초가 걸렸는데 RPN을 사용하였을 때 약 0.2초로 줄였다.
이 Faster R-CNN에서 픽셀 단위의 마스크를 예측하는 부분 하나를 더 추가하면 Instance Segmentation을 할 수 있다.

28x28의 Mask를 예측하는 부분을 통해서 특정 픽셀에 물체에 해당하는지 여부를 판단할 수 있고 이러한 구조를 Mask R-CNN이라고 한다.

다음은 mask하는 결과물이다. 의자에 해당하는 부분에 마스킹이 되어있는 모습이다.

또한 포즈도 가능하여 어떤 자세를 취하는지를 얻을 수 있다.

Visualize & Understanding
2013년부터 2020년까지 신경망이 어떻게 학습이 되는지를 시각화하는 주제가 많이 다루어졌고 여기에서는 이에 대한 요약이 담겨져 있다. 가장 먼저 선형 classifier의 각 클래스를 시각화하면 다음과 같다.

이 가중치 벡터를 픽셀단위로 펼치게 되면 해당 클래스의 평균적인 모습이 보인다. 예를 들어 비행기의 파란 하늘 배경, 자동차의 보라색 차체 색 그리고 개구리의 녹황색을 예로 들 수 있다.
그 다음으로 신경망인 AlexNet을 시각화하면 다음과 같이 나타낼 수 있다.

시각적으로는 무엇을 나타내는 지는 확인할 수 없지만 물체의 모양과 방향을 압축한 형태이다. 더 깊은 레이어로 갈수록 더 압축된 의미를 갖고 있으며 채널 수가 증가한다라는 것을 CNN파트에서도 확인할 수 있었다.
다음으로 어느 픽셀이 객체가 담겨져있는지 파악하는 것도 중요한데 예를 들어 의료 분야에서 종양 유무를 판별할 때 사진 속 어느 부분이 종양에 해당하는 지 파악하는 것이 중요하다. 대표적인 방법으로 Sailency via Backprop인데 모델이 강아지라고 판단할 때 이미지의 어떤 픽셀이 중요했냐를 파악한다.

위의 사진에서 평소 학습처럼 이미지에서 CNN으로 흘러보내고 어느 픽셀이 gradient가 높은지를 saliency map으로 구한다. 따라서 아래 흑백 이미지의 밝은 부분은 gradient가 커서 이 픽셀을 조금만 바꿔도 점수가 크게 변하는 즉 모델이 중요하게 본 곳이다.
또다른 방법으로 클래스 계산을 하는 fully-connected layer에서 시각화를 통해 어떤 공간 위치가 클래스에 기여하였는지에 대해서 알고자 하는 방법인 Class Activation Mapping(CAM)에 대해서 소개한다.

마지막 CNN feature에서 Pooling을 통해 압축하고 FC 층을 통해 클래스 점수를 계산하는 기본 방법에서 FC의 가중치를 feature map에 곱하면서 어디를 보고 판단하였는지 히트맵이 나온다. 예시로 바벨 운동 기구로 분류하게된 히트맵을 볼 수 있다.

CAM의 문제점은 마지막 CNN layer에서만 적용이 가능하다는 문제가 존재하여 Grad-CAM을 도입하여 어떤 레이어에서도 적용이 가능하게 발전하였다. Grad-CAM에 대해서 간단하게 설명하자면 마지막 layer가 아닌 아무 레이어나 선택이 가능하고 값에 따라 클래스 score가 변하게 미분하여 gradient를 구한다음 거기에서 평균을 내서 중요도를 하나의 숫자로 요약할 수 있게된다.

다음과 같이 다양한 모델에서 적용이 가능하다.
마지막으로 ViT에서는 결과값 자체가 어디에 집중할지에 대한 가중치이므로 쉽게 시각화할 수 있다.

다음 글 : Video Understanding
강의자료
CS231n 강의 공식사이트 - cs231n.stanford.edu
CS231n Spring 2025 유튜브 강의 - youtube
CS231n 강의 슬라이드 - cs231n.stanford.edu/slides/2025
CS231n 과제 및 자료 - cs231n.stadford.edu.github.io
'[2025] CS231n' 카테고리의 다른 글
| [2025] CS231n 8강: Attention and Transformers - CS231n 강의 노트 (0) | 2026.04.18 |
|---|---|
| [2025] CS231n 7강: Recurrent Neural Networks - CS231n 강의 노트 (0) | 2025.12.27 |
| [2025] CS231n 6강: Training CNNs and CNN Architectures - CS231n 강의 노트 (0) | 2025.11.20 |
| [2025] CS231n 5강: Image Classification with CNNs - CS231n 강의 노트 (0) | 2025.11.17 |
| [2025] CS231n 4강: Neural Networks and Backpropagation - CS231n 강의 노트 (0) | 2025.11.06 |