1. Introduction
Object Detection에는 2가지 중요한 Challenges가 있는데,
- Object Location에 대한 수많은 Region Proposal들이 '처리' 되어야 한다
- 이러한 Proposal들은 'Rough Localization'이라, precise localization이 되기 위해 refine되어야 한다
이러한 Challenge들을 해결하기 위해 우리는 'Speed, Accuracy, Simplicity' 등에서 타협을 볼 수 밖에 없다.
이 논문에서는 Fast R-CNN(Fast Region-based Convolutional Neural Network)이라는 Method를 제안하는데, 이는 'single-stage training algorithm' 이다. 즉 기존에 R-CNN이나 SPPNet으로는 불가능했던 end-to-end 학습이 가능하다는 말이다.
end-to-end 학습이란 Input을 넣어 output이라는 출력이 나올 때까지의 whole process를 단일 Model로 학습한다는 것이다.
Object Detection의 Main Point는 해당 object의 위치를 bounding box로 찾고, bounding box 내 오브젝트를 판별하는 것이다.
Bounding box regression (Bounding box가 어딨는지 좌표값을 예측하고 Object에 fit 하도록 좌표를 조정),
Classification(Bounding box안에 있는 건 무엇인가?) 두개의 문제를 같이 해결하는 것이다.
논문에서는 이를 각각 classify object proposals and refine their spatial locations 라 한다.
이러한 특징을 가진 Fast R-CNN은 R-CNN과 SPPNet보다 train-time 과 test-time에서 모두 빠르며, mAP 또한 높다.
1.1 R-CNN and SPPNet
R-CNN은 다음과 같은 단점들을 가진다:
1. Multi-Stage Pipeline
- Regional Proposal & Feature Extractor -> Softmax & SVM -> Bounding Box Regression이라는 3단계 Pipeline의 한계가 있다
- Pipeline의 각 단계가 독립적으로 최적화(fine-tune)되기 때문에 한 단계에서 발생한 작은 오류가 다음 단계로 전파될 수 있으며, 각 단계마다 오류가 누적되어 전체 결과의 정확도에 영향을 미칠 수 있다
- 따라서 Back Propagation이 불가능하다
2. Expensive in space and time
- 하나의 사진 안에 있는 각 Region Propsal마다 Object Detection을 별개로 수행해줘야 해서 매우 오랜 학습시간이 소요된다
3. Slow Object Detection
- 각 test image 안에 있는 여러 object proposal에 대해 각각 Feature Extractor에 넣어줘야 한다 (2번이랑 비슷하다)
4. Image Loss
- 여러 개의 서로 다른 size의 Region Proposal들을 Pretrain된 Feature Extractor가 요구하는 고정된 size로 통일시켜줘야 해서 region proposal을 자르거나 찌그러뜨려 image의 손실이 일어나게 된다
SPPnet도 다음과 같은 두 개의 단점을 가진다.
1. Multi-Stage Pipeline
- Extracting Features, Fine-Tuning Networks w/ log loss, Training SVMs, Fitting Bounding Box Regressors의 Pipeline의 한계
- 따라서 여전히 Backpropagation이 불가능하다
2. Fixed Convolutional Layers
- SPPnet에서 사용된 Fine-Tuning algorithm은 SPP 이전에 있는 Convolutional Layer들을 업데이트 할 수 없다
- 즉 네트워크의 초기 Layer들은 Pre-trained된 가중치를 유지하고 변경하지 않는데, 이는 Deep Network의 정확도를 제한한다
1.2 Contributions
- 모두 동일한 사이즈의 Region Proposal을 만들기 위해 SPP를 사용하지 않고 ROI(Regions Of Interest) Pooling를 사용한다.
- Object가 무엇인지 클래스를 분류할 때 SVM Classifier을 사용하지 않고 Softmax Layer만을 사용한다.
연구진들은 R-CNN과 SPPnet의 단점을 speed, accuracy의 측면에서 보완하는 Fast R-CNN Method을 고안했다.
Fast R-CNN은 다음과 같은 4가지의 Advantage가 있다:
- Higher detection quality (mAP) than R-CNN, SPPnet
- Training is single-stage & Multi-Task Loss 사용가능
- Training이 모든 Network Layer들을 업데이트 할 수 있다
- Disk Storage가 요구되지 않는다
2. Fast R-CNN architecture and training
Fast RCNN도 RCNN과 똑같이 처음에 Selective Search를 통해 Region Proposal을 뽑아내긴 한다.
하지만 R-CNN과 다르게 뽑아낸 영역을 Crop하지 않고 그대로 가지고 있고,
전체 이미지를 CNN 모델에 집어 넣은 후,
CNN으로부터 나온 Feature Map에 RoI Projection을 하는 방식이다.
즉 input image 1장으로부터 CNN Model에 들어가는 이미지는 2000장 → 1장이 된다.
Total Image와 Object Proposal들을 Input으로 넣어 CNN으로 처리한다. 이 과정에서 Total Image에 대해 Convolution Operation과 Max Pooling을 반복하여 Output Feature Map을 Extract 한다.
그리고 이전에 Region Proposal중 Selective Search를 통해 만들어놓은 RoI를 Feature Map에 Projection 시킨다.
RoI Pooling Layer에서 Feature Map의 각 Object Proposal마다 고정 길이의 Feature Vector를 추출한다.
이렇게 나온 Feature Vector는 FC Layer를 통과해 두 개의 Branch로 나뉜다.
- K개의 Object Class + 1개의 Background Class: $K+1$개의 Class에 대한 Softmax Probability
- K개의 Object Class 각각에 대해 4개의 실수가 반환된다: Bounding Box Regression (Position)
- Bounding Box의 Center 좌표, Height, Width
2.1 The RoI Pooling Layer
서로 다른 Size의 Region Proposal을 One-Pyramid Level의 SPP을 이용하여 고정된 크기의 Feature Vector로 만드는 과정
이 Feature Map에 Projection 한 RoI들을 RoI Pooling 하는 것이 Fast R-CNN의 핵심이다.
위 그림처럼 Projection시킨 RoI를 FCs(Fully Connected Layer)에 넣기 위해서는 같은 Size의 Feature map이 필요하다.
하지만 Selective Search를 통해 구해졌던 RoI 영역은 각각 다른 크기를 가지고 있다. 따라서 이 Resolution의 크기를 맞춰주기 위해 RoI Pooling을 수행한다.
사실 SPP 과정도 ROI Pooling 과정이라고 할 수 있다. ROI Pooling 의 구체적인 정의는 서로 크기가 다른 Region Proposal을 Fixed Size Vector 로 만드는 것을 의미한다. 여기서는 SPPnet과의 차이점을 강조하기 위해 Fast RCNN에서만 ROI Pooling이라고 정의하겠다.
즉, 크기가 다른 Feature Map의 Region마다 Stride를 다르게 Max Pooling을 진행하여 결과값을 맞추는 방법이다.
위 그림의 박스 1개가 1개의 픽셀을 뜻한다.
위와 같이 8x8 input feature map에서 Selective Search로 뽑아냈던 5x7 짜리 Region Proposal 부분이 있고,
이를 2x2로 만들어주기 위해 Stride (7/2 = 3, 5/2 = 2) 로 Pooling Sections를 정하고,
Max pooling 하여 2x2 output을 얻어 낸다.
ROI Pooling은 SPP Pooling 과정과 동작과정은 동일하다. 단, 분면을 여러 번 수행하지 않고 단 7×7 분면으로 나눈 것 하나로만 SPP를 수행한다는 것이 차이점이다.
즉, 정리하자면 다음과 같다.
Fast R-CNN에서 먼저 입력 이미지를 CNN에 통과시켜 Feature Map을 추출하고 이전에 미리 Selective Search로 만들어놨던 Region Proposal을 Feature Map에 Projection 시킨다.
따라서 그림은 Feature Map에 $h \times w$ 크기의 검은색 box가 projection된 Region Proposal이다.
미리 설정한 고정된 크기의 Feature Vector를 $H \times W$의 크기로 만들어 주기 위해 $\frac {h} {H} \times \frac {w} {W}$ 크기의 Grid를 RoI 위에 만든다.
RoI를 Grid 크기로 Split 시킨 후에 Grid별로 Max Pooling을 적용하여 각 Grid 칸마다 하나의 값을 추가한다.
Projection된 Region Proposal: $h \times w$
고정된 크기의 Feature Vector: $H \times W$
- $H, W$는 Layer Hyperparameter이다
- 임의의 RoI Size에 대해 independent하다
Pooling Section(each grid): $\frac {h} {H} \times \frac {w} {W}$
Q1. RoI Pooling 이후 2개의 FC Layer에 2D Feature Matrix를 Input으로 넣어주기 위해서는 Flatten 과정이 필요하다. 그렇다면 왜 Flatten 과정을 RoI Pooling의 끝 부분에 포함시키지 않았는가?
A. 구현과 아키텍처 설계의 유연성, 명확성, 그리고 모듈화가 주된 이유이다:
1. 모듈화 및 재사용성: RoI Pooling과 Flatten 과정을 분리함으로써, 네트워크의 다양한 부분을 더 유연하게 재사용할 수 있다. 이는 아키텍처의 각 부분을 독립적인 모듈로 취급할 수 있게 하여, 다른 종류의 네트워크 아키텍처에 쉽게 적용하거나 수정할 수 있는 장점을 제공한다.
2. 명확성 및 이해의 용이성: RoI Pooling이 공간적인 정보를 고정된 크기의 출력으로 변환하는 과정에 집중하도록 하며, Flatten 과정은 이 고정된 출력을 FC Layer가 처리할 수 있는 형태로 변환하는 별도의 단계로 두는 것이 논리적으로 명확하다. 이렇게 하면, 네트워크의 각 부분이 수행하는 역할을 더 쉽게 이해하고, 디버깅 및 최적화를 용이하게 하다.
3. 유연성: Flatten 과정을 별도로 두면, 네트워크 설계자는 RoI Pooling의 결과를 다양한 방식으로 활용할 수 있는 유연성을 갖는다. 예를 들어, 특정 경우에는 RoI Pooling 결과를 Flatten하지 않고, 대신 다른 유형의 layer나 처리 과정에 직접 연결할 수도 있다. 이는 특히 다양한 실험적 설정이나 새로운 아키텍처 개발에 유용하다.
4. 성능 최적화: 별도의 Flatten 과정을 통해, 네트워크 구현시 성능 최적화를 위한 추가적인 선택지를 갖게 된다. 예를 들어, 특정 하드웨어나 소프트웨어 환경에서는 Flatten 작업을 특정 방식으로 최적화할 수 있으며, 이는 전체 네트워크 성능에 긍정적인 영향을 미칠 수 있다.
결론적으로, RoI Pooling 이후 Flatten 과정을 별도로 두는 것은 네트워크 설계의 모듈화, 이해의 용이성, 유연성 및 최적화 가능성을 증대시키는 중요한 설계 선택이다.
2.2 Initializing from pre-trained networks
연구진들은 3개의 Pre-Trained ImageNet기반 Feature Extractor를 기반으로 실험을 진행했다.
각 Network는 5개의 Max Pooling Layer, 5 ~13 개의 Conv Layer를 가지는 3개의 Pre-trained 모델이다.
이때, Pre-Trained Network가 Fast R-CNN Network를 Initialize하면 다음의 3가지 transformation이 일어난다.
- 마지막 max pooling을 첫 FC layer와 H, W가 호환되도록 세팅된 RoI pooling layer로 변경하였다
- 마지막 FC layer와 softmax를 이전에 말한 2개의 Layer인 K+1 softmax, Bbox regressor로 변경한다.
- Image List와 RoI List 2가지를 Input으로 사용한다
Softmax
마지막으로 Fixed Length Feature Vector를 FCs(Fully Connected Layer)에 집어 넣은 후, 두 자식 layer인 output layer로 뻗어 나가 Classification과 Bounding box Regression을 진행 한다.
이는 R-CNN과 비슷하게 진행 하였지만 Fast R-CNN은 Softmax를 사용하여 Classification을 진행 하였다.
Q2. Softmax만 사용하는 이유는 무엇인가?
A. 이전의 SPPnet 모델까지는 먼저 Softmax Layer로 Object가 어떤 클래스인지 확률값으로 도출시키면서 파라미터를 학습하고 다시 최종 클래스 분류를 위해 SVM Classifier를 사용했다. 하지만 이렇게 하게 되면 보다시피 2번 수행하는 번거로움이 있게 되고 결국 End-to-End 모델이 되지 못한다.
그래서 SVM Classifier 를 없애버리고 Softmax Layer 하나만을 두고 Object의 최종 클래스를 분류시킨다.
이렇게 함으로써 Object의 클래스를 최종 분류하는 문제와 Object를 탐지해 감싸는 Bounding Box의 좌표를 회귀하는 문제 2개를 동시에 학습시키게 된다. 즉, 이제 End-to-End 모델이 되는 것이다.
2.3 Fine-Tuning for Detection
Fast R-CNN의 장점은 모든 network에 대하여 Backpropagation을 통해 update가 가능하다는 것이다.
이는 곧 end-to-end 학습이 가능하다는 말이고, Fast R-CNN의 RoI가 너무 커서 기존 SPPnet, RNN에 적용된 방법을 사용하는 것은 비효율적이다.
Q3. SPPnet은 왜 Spatial Pyramid Pooling Layer 이전의 Convolution Layer의 Weight을 업데이트 하지 못하는가? 즉, Backpropagation 과정이 왜 한 번에 일어날 수 없는가?
A. SPPnet과 Fast R-CNN 간의 주요 차이점은 각 RoI로부터 feature를 추출하는 방식에 있다.
이때, "중복"은 SPPnet에서 RoI가 projection된 동일한 Feature Map 내에서 여러 spatial bin 크기에 걸쳐 pooling을 수행한다는 것을 의미한다. 이는 동일한 위치에서 정보를 여러 번 샘플링하고 다른 크기의 feature vector에 통합하기 때문에 중복으로 이해할 수 있다. 이러한 중복으로 인해, 각 RoI 간의 독립성이 손상될 수 있으며, backpropagation에서 개별 RoI의 변화를 효과적으로 특정 feature map 위치에 업데이트하기 어렵게 만든다.
반면, Fast R-CNN에서의 RoI pooling은 각 RoI에 대해 단 한 번만 최대 pooling을 수행하여 고정된 크기의 feature map을 생성한다. 이는 각 RoI가 갖는 고유한 정보를 유지하게 하며, backpropagation을 통해 각 RoI의 오차 신호가 해당하는 feature map 위치에 정확하게 전달된다. 이렇게 되면 가중치 업데이트가 각 RoI에 대해 명확하고 효과적으로 이루어진다. 따라서, Fast R-CNN이 SPPnet에 비해 학습 효율성이 더 높다고 할 수 있다.
따라서 Feature Sharing을 할 수 있는 다른 방법을 사용했다.
SGD의 mini-batch를 계층적으로 샘플링하는데 처음 N개의 이미지를 뽑고, 각각의 이미지에서 R/N개의 RoI를 뽑아냈다.
- $R$: Total RoI 개수
- $N$: Image의 개수
같은 이미지에서 뽑은 RoI들은 forward, backward 모두 Computation(연산)과 Memory(메모리)를 공유한다.
- N=2, R=128이면 이미지 하나당 64개의 RoI를 샘플링하여 훨씬 빠르게 학습이 가능하다.
- N = R = 128이면 이미지 하나당 1개의 RoI를 샘플링하기 때문에 학습이 다르다.
즉, $N$을 줄일수록 하나의 Image에서 Sampling되는 RoI의 개수가 줄기 때문에 Mini-Batch Computation도 감소한다.
이러면 같은 이미지에서 나온 RoI끼리 correlation이 존재하기에 slow-convergence가 발생할 것이라는 우려가 있었지만 실제론 발견되지 않았고 SGD iteration이 적어 좋은 결과를 가져왔다.
Multi-Task Loss
Fast R-CNN은 두 가지 Output Layer로 나뉘게 된다.
- $K+1$개의 Category에 대한 Softmax를 이용한 Classification Discrete Probability Distribution
- $K$개의 Category(Object Classes)에 대한 Bounding Box Regression Offset
이제, 이 두 가지를 동시에 학습하기 위해서 Multi-Task Loss를 사용한다.
- $u$: ground-truth class (one-hot encoding), Index
- $v$: ground-truth bounding box regression target
- $p$: predicted class score
- $t^{u}$: predicted tuple
- $ u[\geq 1]$: $u$가 1 이상일 때 1의 값, 그 외에는 0인 값을 가지는 function이다.
- 이를 이용하면 background는 u=0으로 Labeling 되어 loss 계산에서 무시가 가능하다
Classification과 Bbox Regression을 동시에 해결해서 Multi-task loss 라고도 불린다.
Classification에서는 Cross Entropy를 사용하고 Bb Regression에서는 Smooth L1 함수를 이용한다.
아래는 R-CNN에서 사용한 Bounding Box Regression에 대한 설명이다.
Ground Truth와 Selective Search Predicted의 중심 간의 거리, 높이와 너비가 최소가 되어야 한다. 그렇게 모델이 만들어져야 한다.
Bounding Box Regression 으로 구해야 하는 것은 dx(p)와 dy(p), exp(dw(p))와 exp(dh(p)) 이다.
여기서 dx(p)와 dy(p)는 예측 좌표의 중심(px, py)에서 실제 좌표의 중심(gx,gy)으로 얼마나 이동시켜야 하는지에 대한 함수이다.
그리고 exp(dw(p))와 exp(dh(p))는 예측 Bounding Box의 너비(pw)와 높이(ph)를 얼마나 scaling 해야하는지에 대한 함수이다.
g에 대한 예측 값인 g^를 위와 같이 나타낼 수 있다.
dx(p) : 너비에 대해 곱해지는 weight 값
dy(p) : 높이에 대해 곱해지는 weight 값
g(ground truth) 와 예측값 g^의 차이가 최소가 되도록 해야 한다
$t_{i}^{u}$: 예측한 Object의 Bounding Box의 위치와 크기 tuple
$v_{i}$: Ground Truth, 실제 데이터에 있는 Object의 Bounding Box의 위치와 크기 tuple
Smooth L1 함수에서 x값에 따라 함수식이 달라진다. 여기서 x는 오차(Error)이다.
|x| < 1 일 때는 L2 Loss 유형의 식을, 그 이외의 경우에는 유형의 식을 따른다.
어떤 식을 따르냐에 따라 오차 함수의 의미가 달라진다.
- L2 Loss : 제곱을 사용하기 때문에 지나치게 오차가 큰 데이터에 매우 민감하게 작용한다. 따라서 오차가 큰 데이터가 많이 존재할 경우 L2를 사용하면 오차가 큰 데이터에 큰 패널티를 부여함으로써 학습 시 오차가 큰 데이터를 잘 학습하도록 해준다.
- L1 Loss : 절댓값을 사용하기 때문에 지나치게 오차가 큰 데이터에 민감하지 않다. 따라서 오차가 큰 데이터가 별로 존재하지 않을 때 사용하기에 적합하다.
- Smooth L1 Loss : 오차)가 −1 보다 크거나 보다 작을 때는 거의 맞췄다고 인정한다.
Outlier에 대해 Robust 해지기 위해 L1 Loss을 사용했고,
$\lambda$는 $L_{cls}$와 $L_{loc}$ 사이의 Balance를 조절하기 위해 균형을 맞춰주는 Hyperparameter이다.
Mini-batch Sampling
주어진 논문의 실험에서는 $R=128$, $N=2$를 이용해서 각 이미지당 $64$개의 RoI를 Sampling했다.
이때 Sampling된 RoI중 IoU가 0.5가 넘는 25%의 RoI만을 사용했다.
나머지 IoU가 0.5가 미만인 RoI들은 Background로 취급되어 $u[\geq 1]$에 의해 0으로 처리된다.
Data Augmentation의 경우 Training 하는 동안 50%의 확률로 좌우 대칭을 시행한다.
Back-propagation through RoI Pooling Layers
N=1 으로, One Image per mini-batch 으로 가정했다.
N > 1 이어도, Forward Propagation은 각 이미지에 대해 독립적으로 작용하므로 그냥 더하면 된다.
Fast R-CNN에서는 이미지를 한 번만 네트워크에 통과시킨 후 생성된 feature map을 사용해 각각의 RoI에 대한 특징을 추출한다.
이 특징 추출 과정에서 RoI pooling layer가 사용되며, 이는 각 RoI를 고정된 크기의 feature vector로 변환한다. RoI pooling 과정은 max pooling을 사용하여 각 RoI의 서브윈도우(sub-window)에서 가장 높은 활성화 값을 가지는 위치의 특징을 선택한다.
이제, 하나의 이미지에 대해 존재하는 r개의 RoI에 대해 독립적으로 '동시에' RoI Pooling을 적용한다.
아래의 Max Pooling 연산은 주어진 Pooling 영역 내에서 최대 Activation 값을 선택하는 과정이다.
$y_{rj} = \max_{i \in R(r,j)} x_i, \quad \text{and} \quad i^*(r,j) = \arg\max_{i \in R(r,j)} x_i$
이 경우 RoI pooling에서는 각 RoI 내의 서브-윈도우 \( R(r, j) \)를 정의하고, 이 서브-윈도우 내에서 최대값을 가지는 활성화 \( x_i \)를 찾는다. 이 최대값이 출력 \( y_{rj} \)가 된다.
이 과정에서 \( \arg\max \) 연산은 서브-윈도우 \( R(r, j) \) 내에서 최대 활성화 값을 주는 인덱스 \( i \)를 찾는데 사용된다. 이 인덱스는 역전파에서 중요한데, 오로지 최대값을 제공한 활성화만이 그라디언트를 전달받고 나머지 활성화 값들은 그라디언트가 0이 된다.
따라서 \( y_{rj} = \max \{ x_i : i \in R(r, j) \} \)라는 수식이 max pooling의 작업을 정확히 나타낸다. 그리고 \( i^*(r, j) = \arg\max_{i \in R(r, j)} x_i \)는 이 최대값을 제공한 인덱스를 나타내며, 이 인덱스를 통해 역전파 시 어떤 입력 활성화 값에 대해 그라디언트를 전달할지 결정한다.
$\frac{\partial L}{\partial x_i} = \sum_r \sum_j [i = i^*(r, j)] \frac{\partial L}{\partial y_{rj}}$
- $x_{i}$: RoI Pooling Layer로 들어오는 i번째 Activation 값
- $R(r, j)$: r번째 RoI에 대하여 j번째 Grid(Sub-Region)
- $y_{rj}$: r번째 RoI에 대하여 j번째 Grid(Sub-Region)의 Output 값 (Max Pooling)
Backpropagation시, 각 RoI에 대해 선택된 최대 활성화 값에 해당하는 입력 활성화 값 \( x_i \)는 오류 신호를 받아 업데이트가 이루어지는데, 이것은 max pooling에서 선택된 위치들만 업데이트된다는 것을 의미한다.
따라서, 손실 함수 \( L \)에 대한 \( x_i \)의 편미분 \( \partial L / \partial x_i \)는 오직 argmax 연산을 통해 선택된 \( x_i \) 값들에 대해서만 계산된다.
서로 다른 RoI에서 pooling을 진행했을 때 같은 $x_{23}$이 영향을 끼칠 수 있다.
이 말은 즉슨 하나의 $x_i$가 여러 output $y_{rj}$와 연관될 수 있다는 말이다.
따라서 backpropagation은 저런 값들의 합으로 생각을 하는 것이다.
즉 같은 $x_i$에 대응되는 r이 여러 개 있을 수 있으므로 $\Sigma_{r}$을 통해 $x_{i}$에 대응되는 모든 $(r, j)$에 대해 계산한다.
SGD hyper-parameters
2개의 FC Layer중 Softmax Classification과 Bounding Box Regression은 모두 zero-mean Gaussian distribution을 통해 initalize됐으며, 각각 standard-deviation을 0.01, 0.001으로 설정했다.
bias들은 모두 0으로 initialize 됐으며, per-Layer들은 각 Layer 마다 1(weights), 2(biases)의 learning rate를 사용하며
Global learning rate는 0.001로 설정했다. momentum 0.9, weight decay = 0.0005를 사용했다.
추가적인 설명들은 논문을 읽으면 될듯하다.
2.4 Scale Invariance
Scale(Size) invariance 하게 detection 하는 방법은 2가지가 있다.
- brute force: train, test시에 미리 정해놓은 size로 맞춰서 진행하는 것
- image pyramids: data augmentation의 형태로 여러 scale로 random 하게 진행한다. → multi-scale 접근법
3. Fast R-CNN Detection
각각 test RoI r에 대해 Class에 해당하는 p(Softmax Classification)값과 Bbox offset(Bounding Box Regression)이 output으로 나온다.
이를 이용해 클래스와는 독립적으로 NMS를 진행한다.
3.1 Truncated SVD for Faster Detection
SVD 유형
- FUll SVD
- Compact SVD
- 비대각 부분과 대각 원소가 0인 부분을 제거
- 대각 원소가 0: 행 간 의존성이 높을 경우 선형 종속
- Truncated SVD
- 대각 원소 가운데 상위 r개만 추출하여 차원 축소
Truncated SVD 행렬 분해 의미
- SVD는 차원 축소를 위한 행렬 분해를 통해 Latent Factor (잠재 요인)를 찾을 수 있는데, 이렇게 찾아진 Latent Factor는 많은 분야에 활용 (추천 엔진, 문서의 잠재 의미 분석 등)
- SVD로 차원 축소 행렬 분해된 후 다시 분해된 행렬을 이용하여 원복된 데이터 셋을 잡음(Noise)가 제거된 형태로 재구성될 수 있음 (원본 복구가 유일하게 불가능)
- 학습 속도 상승, 다중 - 공선성 문제 줄어듦 -> 모델 성능 상승
- Scikit - Learn에서는 Truncated SVD로 차원을 축소할 때 원본 데이터에 $U\sum$를 적용하여 차원 축소
- 행렬 A를 여러 개의 rank 1 Matrix의 합으로 분해하되, 각 Matrix마다 가중치 $\sigma$가 다르기에 $\sigma$가 큰 행렬만 살려도 A의 정보를 어느정도 보존 가능
Image Classification시 Feed Forward를 할 때, FC Layer에서 소요하는 시간이 Conv Layer에서 소요하는 시간 대비 상대적으로 짧다.
하지만 Object Detection을 할 때는 그렇지 않다. 처리해야 할 RoI가 많기 때문에 FC Layer 계층에서 소요하는 시간이 거의 절반을 차지한다.
이러한 Large FC Layer들은 Truncated SVD를 사용하여 accelerate 시켜 연산의 수를 줄여 속도가 엄청 빨라지도록 한다.
두 FC layer 사이의 weight matrix $W$가 $u*v$였다면 $uv$만큼 연산을 해야 했다.
truncated SVD를 사용하면 $t(u+v)$ 번만 하면 돼서 $t$가 $u, v$보다 작을 때 아주 큰 효과를 볼 수 있다.
행렬을 분해하는 방식에 따라 Parameter Count가 달라질 수 있다!
원본 행렬의 경우 분해를 하지 않았기 때문에 $uv$이고,
Full SVD를 적용할 경우 Parameter 개수는 $U$와 $V^T$의 독립적인 원소들의 수를 모두 합한 $u^2 + v^2$이다.
$\Sigma$의 대각선 원소들은 별도로 계산되지 않고 $U$와 $V^T$에 포함된 가중치로 고려된다.
1. Full SVD 파라미터 계산
- Full SVD에서 \( U \), \( \Sigma \), \( V^T \) 각각의 행렬은 독립적인 파라미터를 갖는다.
- \( U \)는 \( m \times m \) 크기, \( V^T \)는 \( n \times n \) 크기이며, 각 원소는 독립적이다.
- \( \Sigma \)는 \( m \times n \) 크기의 대각 행렬이지만, 실제 파라미터는 대각선 상의 non-zero 값들이다. 이 값들은 \( U \)와 \( V^T \)에 곱해져 결과 행렬 \( A \)를 구성하는 데 사용된다. 그러나 이 값들은 고유값 분해의 결과로서 데이터의 스케일을 조정하는 계수이며, \( U \)와 \( V^T \)의 행렬의 크기와 독립적인 파라미터 수에 영향을 주지 않는다.
- 결과적으로, Full SVD에서 파라미터의 총 수는 \( U \)와 \( V^T \)에 있는 원소들의 수를 합한 것이며, \( \Sigma \)는 별도로 계산하지 않는다. 그래서 파라미터의 수는 \( m^2 + n^2 \)이다.
2. Truncated SVD 파라미터 계산
- Truncated SVD에서는 상위 \( t \)개의 특이값만을 사용한다.
- \( U \)와 \( V^T \) 행렬은 각각 \( m \times t \)와 \( t \times n \) 크기로 축소된다.
- 여기서 \( t \)개의 특이값은 \( \Sigma_t \)에 포함되어 있으며, 이는 \( t \times t \) 크기의 대각 행렬이다. 이 값들은 \( U \)와 \( V^T \)에 곱해져 근사 행렬을 만드는 데 사용된다.
- Truncated SVD에서 \( \Sigma_t \)의 특이값들은 \( V^T \)와 결합되어 하나의 행렬 \( \Sigma_t V^T \)로 간주된다. 이 행렬은 \( t \times n \) 크기이며, 여기서 \( t \)는 결합된 결과에 포함되어 있다. 따라서 파라미터 수는 \( U \)에 있는 \( mt \)개와 \( V^T \)에 있는 \( tn \)개를 합한 \( t(m + n) \)이 된다.
이로 인해 Truncated SVD를 사용하면 원래 행렬 \( A \)의 근사를 더 적은 파라미터로 표현할 수 있으며, 계산 비용과 저장 공간을 절약할 수 있다.
Full SVD와 Truncated SVD의 차이는 Full SVD가 데이터의 완벽한 복원을 가능하게 하는 반면, Truncated SVD는 데이터의 가장 중요한 부분만을 유지하고 나머지는 제거함으로써 파라미터의 수를 줄이는 것이다.
결국 행렬을 어떻게 분해하느냐에 따라 파라미터의 개수가 달라질 수 있다.
Full SVD에서는 원본 행렬을 정확히 복원할 수 있는 모든 정보를 유지한다.
Truncated SVD에서는 정보의 일부를 손실하고 파라미터의 수를 줄인다.
따라서 SVD의 종류에 따라 파라미터의 수가 다르게 된다. Full SVD는 데이터를 정확하게 표현하는 데 사용되고, Truncated SVD는 데이터를 압축하는 데 사용된다.
하나의 FC의 weight matrix가 W였다면 이걸 위 형광펜 부분처럼 Non-linearity를 가진 두 개의 FC Layer로 나눈다.
Q4. R-CNN이나 SPPnet의 경우 FC Layer를 한 개 이상을 사용하는 것에 비해, Fast R-CNN은 2개의 FC Layer를 대체로 사용한다.
이때 Fast R-CNN의 2개의 FC Layer가 대체하는 R-CNN or SPPnet의 하나의 FC Layer는 무엇인가?
그리고 두 개의 FC Layer 사이의 Weight Matrix $W$가 Truncated SVD로 분해됐을 때 각 Matrix는 어디에 곱해지는가?
A.
R-CNN/SPPnet의 FC Layer와 Fast R-CNN의 FC Layer 비교:
R-CNN과 SPPnet은 보통 분류와 회귀를 수행하기 위해 하나 또는 여러 개의 큰 FC Layer를 사용한다. 이러한 FC Layer는 고차원의 feature vector를 처리하여 객체의 클래스를 예측하고, 객체의 위치를 더 정확하게 조정하는 bounding box regression 값을 계산한다.
Fast R-CNN은 이러한 역할을 효율적으로 수행하기 위해 일반적으로 두 개의 FC Layer를 사용한다. 여기서 첫 번째 FC Layer는 high-level feature를 더 잘 학습하기 위해 사용되며, 두 번째 FC Layer는 첫 번째 FC Layer로부터의 출력을 바탕으로 Softmax Classification과 bounding box regression을 수행한다.
즉, 가장 많은 Parameter를 포함하고 있는 첫 번째 대규모의 FC Layer를 두 개의 더 작은 FC Layer로 분해하여 parameter의 수를 줄이고 연산의 효율성을 증가시킨다.
Truncated SVD와 FC Layer 사이의 관계:
Fast R-CNN에서 두 개의 FC Layer 사이의 weight matrix \(W\)를 Truncated SVD를 통해 분해할 때, 이는 \(W \approx U \Sigma V^T\) 형태로 나타낼 수 있다.
- \(U\)와 \(V^T\)는 orthogonal matrices이며,
- \(\Sigma\)는 대각 행렬로, 가장 중요한 singular values를 포함한다.
분해된 행렬은 다음과 같이 적용된다:
\(\Sigma V^T\)는 RoI Pooling Layer와 첫 번째 FC Layer 사이의 Weight Matrix이다. 이는 기본적으로 데이터의 차원 축소와 feature 선택을 수행하며, 네트워크의 효율성을 높이는 역할을 한다.
\(U\)는 첫 번째 FC Layer와 두 번째 FC Layer 사이의 Weight Matrix이다. 이는 첫 번째 layer로부터의 정보를 사용하여 최종 출력을 생성하는 데 사용된다.
이러한 접근 방식은 모델의 매개변수 수를 줄이고, 연산 비용을 감소시키며, 전체적인 성능을 유지하거나 개선하는 데 도움을 준다.
즉Truncated SVD를 사용하는 이유는 네트워크의 과적합을 줄이고, 모델의 일반화 능력을 향상시키기 위한 것이라 볼 수 있다.
첫 번째 layer에선 bias 없이 $\Sigma *V_t$를 weight matrix로 가진다.
두 번째 layer에서는 activation function 없이 원래 $W$가 가지고 있던 bias를 가지며 $U$를 weight matrix로 가져서 두 FC Layer를 거치게 되면 결국 최종 식과 같아진다.
4. Main results
- VOC07, 2010, 2012에서 Sota mAP 경신
- 빠른 train, test 속도
- VGG16의 conv layer를 fine-tuning시 mAP 상승
4.1 experimental setup
3가지 pre-trained 모델 사용
- Caffenet (small)
- VGG_CNN_M_1024 (Medium)
- VGG16 (Large)
single-scale로 train, test 진행
4.4 Training and testing time
Truncated SVD를 사용해 훨씬 빨라졌다.
feature caching을 하지 않아 별도 저장공간이 필요 없다.
4.5 Which layers to fine-tune?
- FC layer만 fine tuning 하면 오히려 SPPnet(less deep network)에선 성능이 더 좋다.
- RCNN에서는 FC만 fine tuning 하는 게 좋지 않다.
- VGG16은 9번째 이전의 conv layer는 freeze 하고 그 이후 layer만 학습한다.
5. Design Evaluation
5.1 Does multi-task training help?
- Yes
5.2 Scale invariance: to brute force or finesse?
- multi-scale 사용 시 더 성능이 좋지만 single-scale과 크게 나지 않고 메모리나 시간이 더 걸려 그냥 scale 쓴다.
5.3 Do we need more training data?
- data가 많으면 많을수록 좋다.
5.4 Do SVMs outperform softmax?
- VGG16에 대해 svm보다 softmax사용 시 0.1 더 높다
Are more proposals always better?
- proposal이 너무 많으면 성능이 저하된다.
6. Contribution
- 뛰어난 성능
- End-to-end로 Single Stage Training을 진행 : Single Stage Detector는 아님 (Region Proposal로 Selective Search를 수행하기 때문)
- Back Propagation 기능 (모든 Computation을 Share하여 End-to-End Training을 진행)
- 저장공간이 필요가 없음 (R-CNN의 경우에 CNN에서 나온 Feature Map을 Disk에 집어 넣고 SVM을 진행할 때 불러오는 방식으로 진행)
Reference
https://woochan-autobiography.tistory.com/920
https://talktato.tistory.com/9