cs231n 2025 ver. - Lecture 10

이준학·2026년 7월 5일

cs231n

목록 보기
16/17

    이번 강의는 외부 강사를 초빙해서 진행하는 형식이었다. Video Understanding에 대한 내용을 다룬다. 지금까지 우리는 classification, semantic segmentation, object detection, instance segmentation을 2D image의 영역에서 살펴봤다. 이번 강의에서는 2D image가 아닌 Video에서의 task들을 만나게 될 것이다.
  일단 Video가 무엇인지부터 짚고 넘어가자.

Video = 2D + time = image들의 sequence

video는 위와 같은 식으로 나타낼 수 있다. Video의 tensor shape은 [T×3×H×W][T \times 3 \times H \times W] 혹은 [3×T×H×W][3 \times T \times H \times W] 와 같이 4D로 표현된다. 여기서 T는 time, 3은 RGB 3개의 채널을, 그리고 H와 W는 각각 height와 width를 의미한다.

    video task들은 2D image task와 비슷한 방식으로 진행된다. Loss function, feature들을 사용해 모델을 훈련시킨다. 문제는 video라는 input의 특성에 맞는 feature를 어떻게 뽑아낼 지에 대한 부분이다. 더 자세히 알아보자. 2D image에서는 object를 인식하고, 그에 대한 feature를 뽑으면 되었는데, video는 action을 알아봐야 한다는 차이가 있다. 우리가 알아봐야 할 것들이 근본적으로 차이가 있는 것이다. (object VS action)
  또한, video는 image보다 용량이 크다. 보통 video는 ~30fps(frames per second)이기 때문에 input의 용량이 굉장히 커지는 것이다.

위의 사진에서 SD는 Standard Definition, HD는 High Definition을 의미한다. HD의 경우, 1분당 10GB정도의 용량을 차지할 수 있다. 용량이 크면 GPU에 들어가지 않을 수도 있다는 단점이 있는 것이다. 그리고 실제로 모델을 훈련시킬 때는 input data뿐만 아니라 모델의 중간 계산 값인 activation, weight들도 저장해야 한다. 이런 식이면 모델의 크기가 굉장히 커질 수 있다.

    이러한 문제는 video clip을 짧게 만드는 것으로 어느 정도로 해결할 수 있다. fps를 낮추거나(1초당 사용하는 frame의 수를 줄이자는 의미) spatial resolution을 낮추는 것으로 짧은 clip을 만들 수 있다. 동영상이 1초 안에 많은 움직임이 있기 힘들기 때문에 1초 내에서 몇 개의 frame만 사용하는 것은 용량을 낮추는데 도움이 되는 방법이다.

Training 시에는 위의 사진처럼 길고 fps가 높은 원본 video에서 몇 개의 frame만 고르고, clip 자체도 잘라서 사용하게 된다. 그리고 testing 시에는 모델들 다른 clip에서 돌린 다음, prediction의 평균을 사용한다. 이제 video classification을 통해 Video Understanding이 어떻게 진행되는지 살펴 보자.

1. Video Classification

1) Single Frame CNN

    Video Classification을 할 수 있는 가장 간단한 방법은 뭐가 있을까라고 생각해보면, Single-Frame CNN을 이용하는 방법이 가장 먼저 떠오른다.

image를 사용해서 훈련시킨 2D CNN에 video frame 한 개씩 줘서 각각 classify하는 방식이다. test time 때는 여러 frame들을 classify 한 결과를 평균 내서 최종 결과를 얻는다. 굉장히 비효율적인 방식인 것 같지만, (실제로 어느 정도 비효율적이긴 하다.) 꽤 좋은 baseline을 만들어 주기 때문에 의미 있는 방식이다.

2) Late Fusion


  다음은 Late Fusion이다. 여전히 2D CNN을 이용하지만,feature extraction의 용도로만 사용한다. 이때 frame feature는 T개의 frame을 사용하므로 [TxDxH'xW']의 shape을 가지게 된다. 각 2D CNN에서 나온 feature들은 모두 concat한다는 뜻이다. 이는 Flatten 되어 MLP에게 전달되고, 거기서 class score를 얻는다. 이 방식의 문제점은 무엇일까? 2D CNN을 사용하기 때문에 만약 T가 커진다면 concat해야 할 feature map도 많아진다. 이렇게 되면 뒤에 MLP가 굉장히 커질 것이기 때문에 효율성이 떨어진다.

    이에 대한 해결책으로 Pooling이 등장한다.

2D CNN으로 feature extraction을 하는 것까지는 동일하나, 그 이후 average pooling을 진행한다는 것이 특징이다. feature를 좀 줄여서 linear layer에 넘겨주겠다는 의도이다. 그러나 이전에도 배웠듯이, pooling은 정보의 손실이 일어나기 때문에 모델의 성능이 떨어질 수도 있다는 단점이 있다.

    Late Fusion이 최선의 방법일까? Late Fusion의 단점은 2D CNN에서 fuse를 진행하기 전에 이미 중요한 정보를 잃어버릴 수 있다는 점이다. 이는 CNN이 가지는 구조적인 특성 때문인데, input 이미지부터 시작해서 layer들을 지날 때 마다 feature map의 크기가 작아지고, 이는 정보의 손실을 의미하기도 한다. receptive field가 커지면서 전체적인 이미지에 대한 정보는 보존되지만, low level 정보는 날라갈 수도 있다. 그런데 video classification에서는 이 low level 정보가 중요하다. video에서는 motion이 굉장히 중요한 정보인데, 이러한 low level 정보가 CNN을 통과하면서 날라갈 수 있다는 뜻이다. late fusion의 이러한 문제를 해결하기 위해 등장한 것이 Early Fusion이다.

3) Early Fusion


  Early Fusion은 이름에서도 알 수 있듯이 Fusion을 일찍한다는 뜻이다. low level feature를 보존하기 위해 image와 가까운 feature를 사용한다. Input을 [Tx3xHxW] -> [3TxHxW] 로 reshape하고, 첫 번째 2D Conv layer가 [3TxHxW] -> [DxHxW] 로 feature map을 만들어 정보를 압축하고, 이를 이전과 똑같은 2D CNN에 넣어 class score를 얻는다.
  이러한 방법도 문제가 있는데, 바로 하나의 Layer에서 정보를 압축하려고 하다 보니 모델을 만든 의도와 다르게 그만큼의 성능이 나오지는 않을 수 있다는 것이다. 너무 급하게 정보를 압축하려고 했다는 의미이다. 그래서 등장한 것이 3D CNN이다.

4) 3D CNN

    3D CNN은 이전의 문제들을 해결하기 위해 slow fusion을 목표로 한다. 급하게 해서 정보를 잃는 것을 어느 정도 방지하자는 의도이다.

CNN의 3D 버전과 pooling을 통해 천천히 정보를 fuse하는데, 아래의 사진을 보며 자세히 알아보자.

이것이 3D Convolution을 그림으로 나타낸 것인데, 말 그대로 2D -> 3D로 바뀐 것이다. 이전의 2D CNN이 2D인 정사각형 filter가 input image 위에서 움직였다면, 3D CNN에서는 filter가 정육면체이며, 이것이 3D 공간을 움직이며 feature map을 만드는 형태이다. 처음에 이 컨셉이 잘 이해가 되지 않아서 유튜브에 시각화한 영상을 찾아봤는데, 아래에 내게 도움이 되었던 영상 링크를 첨부한다.
3D Convolution Explained (Visually)

기본적으로 input의 pixel들과 filter의 값들을 곱하고 그들을 다 더해서 하나의 출력값이 나오는 것은 변하지 않는다. early fusion, late fusion, 3D CNN을 비교하면 아래와 같은 표가 나온다고 한다.

Late Fusion : space에서는 천천히, time에서는 마지막 한 번에 fusion
Early Fusion : space에서는 천천히, time에서는 처음 한 번에 fusion
3D CNN : space, time에서 모두 천천히 fusion

5) 2D Conv (Early Fusion) VS 3D Conv

    3D input에서 2D Conv와 3D Conv를 비교해보자. 2D conv는 아래와 같은 사진으로 표현할 수 있다.

3D input에 맞게 filter 하나가 T의 depth를 가진다. 따라서 local한 특성을 가지는 것은 space 밖에 없다. CNN에서의 중요한 특성인 shift-invariance, 즉 입력이 이동해도 출력이 거의 변하지 않는 특성이 space에만 생기고, time에서는 생기지 않는다는 뜻이다.

    우리가 2D Conv에서 shift-invariance를 원했던 이유는 예를 들어 고양이를 classify한다고 할 때, 고양이가 이미지의 어떤 부분에 있던지 고양이로 인식하고 분류하기 위해서이다. 시간에 따라서도 고양이가 어떤 부분에 있던지 고양이로 분류할 수 있게 하는 것은 3D conv, 그리고 Video Classification을 위해서도 중요한 문제가 된다. 어떤 motion이 어느 time step에 있어도 인식하고 분류하고 싶은 것이다. 이를 위해 3D conv가 등장한다.

    3D Conv는 temporal 차원에서도 input을 slide하며 temporal shift-invariance를 만들어낸다.

어려워 보이지만 차근차근 생각해보면 우리가 2D input에 적용했던 sliding window의 개념을 temporal 차원에도 적용하고, 결과적으로 3D에서 움직이게 되는 것이다. filter도 [RGB(3)xTxH'xW'] 와 같은 shape을 갖는다.

6) Results

    이제 우리가 살펴본 모델들이 실제 데이터셋에서 훈련되었을 때 어느 정도의 성능을 가지는지 알아보자. 사용한 dataset은 Sprots-1M dataset으로, 스포츠 종목에 대한 영상들이 들어있는 데이터셋이라고 한다. 이 데이터셋에서 훈련했을 때의 정확도는 아래와 같다.

3D CNN > Late Fusion > Single Frame > Early Fusion 순인데, 생각보다 Single Frame의 결과가 괜찮은 것을 볼 수 있다. 이렇게 생각보다 Single Frame이 괜찮은 성능을 보이기 때문에, baseline으로 먼저 시도 해보면 좋은 방법일 것 같다.

7) C3D : VGG of 3D CNNs

    이후에 나온 3D CNN계의 VGGNet인 C3D를 살펴보자. VGG 논문과 비슷하게 3x3x3 filter와 2x2x2 pooling들만 사용했다고 한다. 저자들이 Sports-1M으로 pretrain된 모델을 공개한 바가 있다.

이 모델은 성능이 이전의 방법들보다는 괜찮지만 FLOP이 너무 크기 때문에 사람들이 video feature extractor로 많이 사용한다고 한다.

2. Optical Flow

    다음은 Optical Flow 분야의, 조금 흥미로운 아이디어를 가진 모델이다. optical flow는 현재 frame에서 특정 pixel이 다음 frame에 어디 있을 지 예측하는 분야이다. 그 중에서 Two stream network라는 모델에 대해 알아보자. 이 논문의 저자들은 'appearance와 motion을 꼭 동시에 처리해야 할까?'라는 질문에서 시작했다. 저자들은 appearence 정보가 우리가 생각하는 것만큼 중요하지 않을 수도 있으며, 몇 개의 점만 이용해서 우리가 motion을 맞출 수 있을 거라는 아이디어를 제안했다.

vertical, horizontal로 나누어서 예측하고, 이를 통해 motion이 어떻게 수직, 수평 방향으로 움직일 지에 대한 예측을 볼 수 있다.

Two Stream networks는 위와 같은 구조를 갖는다. 이전에 언급했듯이 두 개의 stream으로 나누어 motion과 appearance 정보를 따로 처리한다는 특징이 있다.

1) Spatial Stream Convnet

    먼저 위쪽 stream인 Spatial Stream Convnet은 single image를 input으로 받으며, appearance classification을 통해 어떤 motion인지 구별해내는 역할을 한다.

2) Temporal Stream Convnet

    다음은 아래쪽 stream인 Temporal Stream Convnet이다. 이 네트워크의 input은 여러 frame의 optical flow인데, 이들이 만들어지는 과정부터 알아보자. 먼저, input image에서 이웃한 두 frame마다 optical flow map이 만들어진다. 이때 horizontal과 vertical map이 따로 만들어지게 된다. 이들이 쌓여서 temporal stream convnet에게 전달되는 것이다. 그리고 temporal stream convnet은 early fusion을 통해 flow image들을 처리하고, 나머지는 일반적인 convnet과 동일하다.

    이렇게 두 개의 stream에서 나온 prediction은 class score fusion을 통해 합쳐진다.

결과를 보면, 이전의 방법들보다 좋은 성능을 내는 것을 확인할 수 있다. 여기서 실험에 사용한 데이터셋은 UCF-101이라는 데이터셋으로, 101가지의 action 카테고리에 관한 데이터셋이라고 한다. 이 결과에서 눈여겨 볼만한 것은 motion만 가지고 prediction을 진행한 버전이 appearance만 가지고 prediction을 진행한 버전보다 성능이 더 좋다는 것이다. 이는 motion 정보가 appearance 정보에 비해 배경에 대한 정보도 없고 key가 될만한 중요한 정보가 많이 담겨 있어서 그렇다고 한다.

3. Modeling Long-Term Temporal Structure

    지금까지 우리가 살펴본 temporal CNN들은 짧은 길이의 영상(약 2~5초)들, 즉 local motion에 대한 부분만 다루었다. 그러나 실제로는 영상의 길이가 굉장히 긴 경우도 많기 때문에 이러한 영상을 처리하는 방법도 연구가 많이 되었다. video를 image의 sequence라고 생각한다면, 이전에 우리가 배운 것들 중에서 적용할 만한 개념이 한 가지 있다. 바로 text sequence를 다루면서 배웠던 RNN이다. 이 recurrent network를 통해 local feature들을 처리해보자.

이전에 배웠던 RNN과 마찬가지로, Many-to-One, Many-to-Many 모두 가능하다. CNN을 이용해 뽑아낸 feature들을 가지고 Recurrent 구조를 만드는 것이다. 이때, CNN은 대부분 feature extractor로 사용되고, 실제로 훈련을 할 때에는 RNN 부분만 backprop을 한다고 한다. (CNN 부분은 backprop하지 않는다.)

    위의 사진을 보면, CNN은 하나의 frame에 대해 feature를 뽑아낸다. 그렇기 때문에 CNN은 local temporal structure를 가진다. 전체 time step이 아닌 time step 일부에 대한 feature이기 때문이다. 반면에 RNN은 CNN이 만든 feature sequence를 다루기 때문에, 현재 hidden state는 이전 hidden state의 정보를 갖고 있다. 이러한 특성을 global temporal structure라고 한다. 이러한 CNN과 RNN의 장점을 모두 가지는 모델을 만들 수는 없을까?

1) Recurrent Convolutional Network

    위의 CNN과 RNN의 구조적 장점을 하나로 합친 것이 Recurrent Convolutional Network이다. 먼저 3D shape([CxHxW])을 가지는 feature들의 grid를 만든다.

각 feature는 두 가지의 영향을 받는다. 이전 time step, 같은 layer의 feature map, 그리고 현재 time step, 이전 layer의 feature map이다. 그리고 vanilla RNN에서는 sequence들 사이의 계산을 matmul로 했다면, 이 모델에서는 모두 2D Conv로 계산한다. 이러한 구조는 temporal, spatial fusion이 모두 가능한 것이 강점이다. 그러나, sequence가 길어진다면 속도가 느려지고, parallelizable하지 않다는 단점이 있다. Vanilla RNN에서의 단점과 상당히 비슷하다. 그때 이러한 문제는 parallelizable한 특징을 가지는 Transformer였고, Recurrent Convolutional Network도 transformer의 self-attention 구조를 이용하면 그 단점을 해결할 수 있다.

2) Spatio-Temporal Self-Attention

    여기서는 Non-local block이라는 구조가 사용되는데, 구조도는 아래와 같다.

Input clip이 3D CNN을 타고 나오면, 그 feature들을 1x1x1 conv(1x1 conv의 3D 버전)에 통과시켜 Query, Key, Value를 얻는다. 그 이후는 self-attention과 비슷한데, Attention weight를 계산하고, residual connection도 이루어진다. 이러한 Non-local block를 기존에 존재하는 3D CNN architecture 사이에 끼워넣을 수 있다.

3) Inflating 2D Networks to 3D (I3D)

    I3D는 모델보다는 테크닉에 가까운 개념이다. 우리는 지금까지 수많은 2D image architecture들을 연구해놨다. 이름에서도 알 수 있듯이, '그렇게 많은 2D image architecture를 3D용으로 재사용할 수는 없을까?'라는 질문에서 시작한 것이 I3D이다. 기본적인 아이디어는 다음과 같다.

  • 2D architecture의 2D Kh×KwK_h\times K_w conv/pool layer를 3D Kt×Kh×KwK_t \times K_h\times K_w 로 바꾼다.
  • 기존에 학습을 통해 얻었던 2D 버전의 weight들을 3D 버전을 초기화 하는데 사용한다.
  • 당연히 차원이 맞지 않기 때문에, KtK_t번 복사하고, 그를 KtK_t로 나누어서 사용하면 된다.

이런 테크닉을 사용하면 좋은 성능을 낼 수 있고, 2D 버전의 모델에서 사용한 weight들이나 모델 구조들을 재사용할 수 있다는 점에서도 경제적이다.

이 밖에도 Video를 위한 Vision Transformer도 많이 등장하고 있다.

나중에 시간이 된다면 위의 모델들도 좀 알아보려고 한다.

4. Visualizing Video Models

    Video model들의 visualization은 어떻게 이루어지는지 알아보자. 이전의 two-stream network를 예로 들어보자면, 순서는 다음과 같다.

  • random한 appearance image, flow image를 initialize한다.
  • forward pass 한 번, 특정 class에 대한 score에 대한 backprop을 진행한다.
  • gradient ascent를 통해 classification score를 최대화 한다.

이전에 살펴본 2D의 visualization과 같이 gradient ascent를 사용한다.

5. Other tasks in Video Understanding

    지금까지 우리는 video에서의 action을 인식하고 분류하는 task만 살펴봤었다. 다른 task는 무엇이 있는지 알아보자.

1) Temporal Action Localization

    Temporal Action Localization은 untrimmed video sequence가 주어졌을 때, video에서 action이 일어나고 있는 부분을 찾아내고, 그 action이 무엇인지 classify하는 task이다.

위의 사진에서도 나오듯이, Faster R-CNN과 비슷한 구조를 사용해 temporal proposal을 생성한 후 classify를 진행할 수 있다.

2) Spatio-Temporal Detection

    Spatio-Temporal Detection은 untrimmed long video가 주어졌을 때, 그 안에 모든 사람들을 detect해서 그들이 어떤 행동을 하고 있는지 classify 하는 task이다.

3) Visually-Guided Audio Source Seperation

    Visually-Guided Audio Source Seperation은 visual 정보를 이용해 소리를 구별해내는 task이다. 예를 들면, 사람의 입 모양을 보고(visual 정보) 누가 이야기 하고 있는지(audio seperation)를 알아내는 것도 Visually-Guided Audio Source Seperation이 될 수 있다.

4) Musical Instruments Source Seperation

    Musical Instruments Source Seperation은 Motion & Object centric한 정보를 이용해 어떤 악기에서 나는 소리인지 구별해내는 task이다.

5) Audio-Visual Video Understanding

    Audio-Visual Video Understanding은 audio spectrum을 video patch에 매핑하고, transformer 기반의 architecture를 사용한다. 자세히 내용을 다루지는 않는 것 같다.

6) Effective Video Understanding

    Effective Video Understanding은 video가 너무 길면 처리하기 힘들기 때문에, 효율성을 높이고자 시도한 것이다. sampler가 영상의 어떤 부분이 중요한 부분인지 예측하고, 그 영상들만 clip classifier에 돌리는 방식이다.


관련된 논문들이 많으니, 나중에 읽어봐야겠다.

7) Multiple Egocentric Video Understanding

    Wearable 디바이스들에서 어떤 사람이 이야기를 하고 있는지 visual 정보를 통해 알아내는 task이다.

8) Video Understanding + LLMs


요즘 LLM이 많이 쓰이는 만큼, Video Understanding도 이와 결합되어 많은 연구가 진행되고 있다. Video Level의 foundation 모델들이 연구되고 있고, video understanding을 어떻게 LLM과 효과적으로 같이 사용할 것인지, video를 어떻게 prompt할 것인지에 대한 다양한 task들이 존재한다고 한다.

profile
AI/ Computer Vision

0개의 댓글