오늘의 논문:
https://arxiv.org/pdf/1504.08083.pdf
Fast R-CNN은 앞서 리뷰했던 R-CNN의 느린 속도를 개선한 알고리즘이다. 읽어보면 대부분의 디테일, 세팅 같은 것은 R-CNN에서 따와서 새로운 것이 별로 없다. 저자가 같아서 그런가.
논문을 요약하면서 최대한 그 흐름을 지켜볼려고 했다. 하지만 내 마음대로 개조한 부분도 있다.
0. 내 마음대로 하는 요약
전체적인 구조를 요약하자면
1. input으로 전체 이미지와 region proposal 값을 이용한다.
2. conv layer에서 마지막 pooling layer 대신, roi pooling layer를 사용해서 고정된 길이의 벡터를 추출한다.
3. fc 의 마지막 층에서는 classification 과 bbox regression 을 수행한다. 단 이때, 하나의 비용함수를 이용함으로써 single stage를 구현한다.
1. Introduction
object detection은 image classification 에 비해 더 복잡하다. object detection 은 물체의 정학한 위치를 찾아야 하기 때문이다. 이를 수행하기 위해서 (1) 많은 region proposal 을 추출과 (2) 앞의 proposal은 rough하기 때문에 refine하는 과정이 필요하다. 그렇기 때문에, object detection 은 더 challenging했고 multi-stage pipeline이여서 실행시간이 오래 걸렸다. 한편 본 논문에서는 single stage training algorithm을 이용했다. 즉 region proposal을 classify하는 동시에 공간적 정보를 refine 했다. 이를 통해서 모델을 더 깊은 구조로 설계해서 학습시킬 수 있었고, PASCAL VOC 2012 데이터 셋으로 66%의 mAP를 달성했다.
1.1 R-CNN and SPPnet
기존의 R-CNN과 SPPNet의 문제점은 다음과 같다.
- 1. multi stage 학습: R-CNN의 경우 먼저 log loss로 AlexNet을 fine-tuning 했다. 그 후에 softmax를 없애고 SVM을 다시 학습시켰고, 그 후에 bounding box를 refine했다.
-2. Training이 시간적으로, 물리적으로 expensive 했다(적절한 한국말을 못 찾겠다): R-CNN의 경우 모든 이미지에서 2000개의 region proposal을 추출해야 했기에 오래 걸렸을 뿐 아니라, 이를 디스크에 저장했기 때문에 물리적으로도 부담스러운 면이 있었다. 그래서 VGG16같은 깊은 백본을 이용해서 R-CNN을 돌리게 되면 5K의 이미지를 학습하는 데 2.5일이 걸렸었다.
-3. object detect에 오랜 시간이 걸렸다: 앞에서 지적한 2번은 학습면이고, 이 3번은 테스트 면이다. 2000개의 영역을 추출한 후에 모두 convolution layer에 들어가기 때문에 실시간으로 처리하는 것은 꿈도 못 꿨다. (라는 표현을 논문이 쓴 건 아니다)
특히, R-CNN이 느린 것은 연산을 공유하지 않기 때문이다. SPPNet은 이런 문제를 연산을 공유함으로써 개선하고자 했다. 그러나 SPPNet 역시 multi-stage pipeline이여서 근본적으로? 큰 해결책을 주지는 못했다.
(*연산을 공유했다는 것에 대해서: 지금까지 이해한 바로는 서로 다른 이미지의 region proposal이 한꺼번에 들어가니까 연산을 공유하지 못한다는 것 같다. 이 문제를 해결했다면서 나오는 것이 섹션 2.3 fine tuning for detection 에서 배치를 계층적으로 샘플링 했다는 부분이다. 이 부분에서 자세하게 보면 될 것 같다..)
1.2 Contributions
(1) R-CNN, SPPnet에 비해 높은 mAP (2) multi-task loss를 통해서 single-stage 학습 (3) 모든 신경망 층 업데이트 가능하게 함 (4) 디스크 저장소가 필요 없음
2. Fast R-CNN architecture and training
본 모델에서는 이미지 전체와 object proposal셋이 인풋으로 함께 들어간다. 그 후에
- 1. 전체 이미지로 conv, pooling layer를 거쳐서 특성맵을 추출한다.
- 2. feature map에서 ROI pooling layer로 고정길이 특성벡터를 추출한다.
- 3. 특성벡터를 FC로 거쳐가게 한다. 이때 마지막 FC 는 1. softmax와 2. bb regressor를 수행한다.
의 과정을 거친다.
이해를 돕는 사진 2장 첨부한다. 위의 사진이 논문에 첨부되어 있는 figure이다.
2.1 The ROI pooling layer
마지막 max pooling layer는 roi pooling layer로 교체한다. 이 layer를 통해선 고정된 크기의 특성 맵이(H*W라고 하자) 추출된다.
도식화하면 위와 같다. 왼쪽은 ROI고, 오른쪽은 pooling layer를 거친 고정된 길이의 특성맵(혹은 특성벡터)이다.
ROI는 region of interest로 우리가 selective search(혹은 무엇이든)을 통해서 추출한 region proposal이다.
직접 그린 그림의 퀄리티는 그닥인 편으로 보기 쉬운 이미지를 하나 첨부한다.
예를 들었을 때,
인풋 사진 속 ROI는 빨간 상자를 친 호랑이라고 생각하자. 그러면 ROI pooling layer를 거치기 전에 위의 16*16으로 특성맵이 도출될 것이다. 원본에서 conv layer를 거치고 난 후, input은 가로는 $\frac{1}{64}$, 세로는 $\frac{1}{32}$의 비율로줄었다. 이 비율을 기억해서 특성맵에서 우리의 ROI를 찾는다. 그럼 저 16 * 16 그리드 속의 빨간 테두리 정도가 될 것이다. 그럼이제 ROI에만 집중해보자
물론 특성맵이기 때문에 저렇게 정확하게 원본과 동일한 이미지로 나오지는 않을 것이다. 하지만 그런 부분은 넘기고 저기가 ROI라는 것만 명심하자. 평소에 우리가 pooling을 할 때 2 * 2 필터 사이즈로 인풋 전체를 훑게 된다. 하지만 대신, 이번에는 output의 사이즈를 정해두고 그에 맞게 필터 사이즈를 조절한다. 그러다보면 대충 $\frac{w}{W} * \frac{h}{H}$ 의 사이즈가 될 것이다. (만약에 나눠떨어지지 않는다면 버림한다) 이후 그 필터에 맞게 인풋을 매핑하고, 거기서 가장 큰 값으로 output 의 값을 채워나간다.
이 부분이 아마 가장 핵심적인 부분 같다.
2.2 Initializing from pre-trained networks
3가지 pre-trained 한 모델을 사용했는데 모두 5개의 pooling layer를 가지고 5-13개의 convolution layer를 가진다. 크게 3가지 변형으로 imagenet을 initilize했다. 이때의 변형은 Fast R-CNN에 맞게끔 모델을 변형해준 것으로 생각하면 된다. ( 구체적으로 쓰자면 1. 마지막 max pooling layer는 roi pooling layer로 변형했다. 이를 통해서 첫 fc layer의 노드를 H*W의 길이와 호환되도록 변형한 것이다. 2. 마지막 fc layer와 softmax는 fc layer에서 소프트맥스와 category specific bb regressor로 대체했다. 3. input을 총 두개를 받아들였다. 전체 이미지와 selective search한 이미지)
2.3 Finetuning for detection
R-CNN과 달리 모든 신경망의 가중치를 업데이트 하기로 했다. 그렇다면 왜 SPPNet 의 Spatial pyramid pooling layer에서 가중치를 업데이트 하지 못했는가? 서로 다른 이미지에서 ROI를 추출해서 학습 데이터로 썼기 때문에 SPP 층에서 역전파하는 것은 비효율적이었다. 따라서 본 Fast R-CNN 모델에서는 feature sharing을 가능하게 해서, 그 장점을 살리도록 모델을 훈련시켰다.
SGD 미니 배치를 계층적으로 샘플링함으로써 구현했다. 구체적으로, N개의 이미지를 샘플링하고 각 이미지에서 $\frac{R}{N}$ 개의 ROI를 샘플링한 것이다. 예를 들어서 2개의 이미지가 하나의 미니 배치를 이룬다면, 각 이미지당 64개의 ROI가 input으로 함께 들어간다는 뜻이다. 이렇게 하는 이유는, 같은 이미지의 ROI는 연산과 메모리를 공유하기 때문이다. 비록 같은 이미지의 ROI는 correlated될 가능성이 높지만, 경험적으로는 그런 문제가 드러나지는 않았다. (그래서 넘어간다) 더욱이 fine-tuning 스테이지 하나만 필요로 하고 softmax classifier랑 bb regressor를 한번에 돌림으로써 연산을 공유함으로써 속도를 개선했다.
*근데 계층적이라고 하는 이유는 잘 모르겠다. 알게 된 미래의 나야 수정 부탁해
multi-task loss
이런식으로 마지막 fc layer에서는 두 가지 task를 하게 된다. 한편 R-CNN에서는 class specific linear SVM과 class specific bounding box regressor를 따로 분리했기 때문에 end to end로 학습시킬 수 없었다. 즉 수정된 svm의 가중치들이 bb regressor에게 영향을 끼치지 못했다는 말이다.
fast R-CNN에서는 두 가지를 한꺼번에 하기 위해서 하나의 통일된 비용함수를 만들게 되고, 이가 곧 multi-task loss다. softmax 그리고 bb regressor를 동시에 학습시키기 때문에 multi task인 셈이다.
(* 참고로 저기서 하나의 bb를 나타내는 t는 (k+1)개의 class 만큼 존재한다. 나머지 1은 background 용이다 따라서 output이 총 (K+1) * 4 개가 된다.)
요로코롬 생겼다. 보면 짐작할지 모르겠지만! cls 는 classification의 손실이고 loc은 localiztion 의 손실이다. $\lambda$를 조절함으로써 적절히 두 task 모두를 고려한 비용을 계산하겠다는 것이다.
여기서 ${L}_{cls}$의 경우는 간단하다. ${L}_{cls}(\mathrm{p}, \mathrm{u}$ 는 해당 클래스일 확률 p와 정답 클래스인 u가 input이다. ${L}_{cls}(\mathrm{p}, \mathrm{u}$) $= -\log P_{u}$로 계산한다.
한편 두 번째 텀은 1. 두 가지 테스크의 손실 반영 비율을 정하는 람다 2. background일 경우 refine을 하지 않기 위한 bracket 3. loss 펑션 이렇게 크게 구분된다.
람다는 방금 썼듯이 두 task를 balancing하는 역할을 하며, 본 모델에서는 1로 사용했다고 한다.
한편 두 번째 텀에서 람다를 제하고, 그 다음에 나타나는(latex로 치기엔 너무 길다. 혹시 알지는 모르겠지만 snip어쩌구라고 화면 캡쳐하는 방식으로 latex 수식을 생성해주는 좋은 프로그램이 있다. 옛날에 학원알바 할 때 그걸 깔아서 했었는데 지금은 지우고 없다. 다시 까는 건 귀찮음이 몇 배는 되는 거 다들 공감할거라고 생각한다.) [$\mathrm{u} \geq 1$]이 있다. [] 이 대괄호를 우리는 iverson bracket(한국어론 아이스번 괄호)이라고 한다. Indicator Function이랑 조오금 비슷한 역할이다. u가 만약 1보다 크거나 같으면 1이고, 그렇지 않으면 0이 된다.
그렇다면 u는 언제 0인가? 입력 데이터의 정답 레이블이 background일 때이다. 그때는 bb를 굳이 refine할 필요가 없기 때문에 두 번째 텀은 고려하지 않음을 이렇게 수식으로 표현한 것이다. (이런 걸 보면 정말 사람들이 똑똑한 것 같고 공부하는 재미가 있다. 역시 난 수식이 필요해)
하여간에.. 자 마지막 loss 펑션을 볼 차례다.
smooth 함수를 그림으로 그려봤다. 화가 놀이가 좀 하고 싶다.
수식은 다음과 같다.
그냥 L2를 이용하지 이유는 무엇인가? smooth L1은 아웃라이어에 덜 예민하기 때문이다. 그 놈의 아웃라이어 L2는 기울기 폭발 방지를 위해서 처음에 lr을 고를 때 신중해야 하지만, smooth L1은 그럴 필요가 없다. 위에 그린 그림만 봐도 gradient가 별로 안 커보이지 않은가? 이런게 바로 잘 그린 그림이지.
한편 $\mathrm{v}_{i}$는 평균이 0이고 unit variance로 initalize했다고 한다.
** 그런데 $\mathrm{v}_{i}$ 이거는 정답값이 아닌가? 왜 initialize가 필요하지?
미래의 나야 부탁해 혹은 이 글을 읽으시는 친절한 독자님도.......
mini-batch sampling
앞에서 얘기했듯이 미니 배치 샘플링은 각 SGD iteraition에서 N=2, 이미지 당 64개의 ROI 총 128개로 했다.
이때 ground truth와 iou가 0.5이상인 경우 roi 의 25%를 foreground image로 사용했다. 그러니까 R-CNN에서 positive한 이미지에 해당하는 것이다. 한편 남은 (75%) remain ROI는 ground truth과 iou를 계산한 값이 구간 (0.1,0.5)에 속한 녀석을 높은 순서대로 잘라서 negative image로 구성했다. (그러니까 u= 0 인 경우)
한편 데이터 augmentation에 대한 언급도 나와있다. 학습 중에 0.5의 확률로 horizontally flipped 한 image를 사용했다. (0.5의 확률은 또 무슨 의미인지 잘 모르겠지만 아마도 0.5의 확률로 이 flipping을 시행했다는 것 같다) 그 외에 다른 data augmentation은 시행하지 않았다고 한다.
back-proopagation through ROI pooling layers
latex의 향연..latext 잘 쓰였는지 좀 작성할 때 미리 알 수 있으면 참 좋을텐데
이 장에서는 notation이 많으니 그거에 유의해서 잘 읽어보자..!
편의상 배치 당 이미지가 하나라고 가정하자. $x_{i}$는 ROI pooling layer의 i번째 activation 입력 값이다. $y_{rj}$는 r 번째 ROI의 j번째 output이다.
ROI pooling layer에서는 $y_{rj} = x_{i^{*} (r,j)}$ 이 식을 통해서 output $y_{rj}$를 계산한다.
이때, $i^{*}(r,j) = \text{argmax}_{i^{\prime}} x_{i^{\prime}}$ 이다.
보면 argmax 함수를 쓴다. 이게 왜 나왔는지 생각하면 이해하기 쉬울수도,.,!!
지금 우리가 있는 곳은 max pooling layer다. max pooling layer에서 argmax는 필터에 매핑된 영역에서 뽑는다! 매핑된 영역에서 최대값을 찾는다. 그러면 $x_{i}$ 프라임은 매핑 영역 내의 최대값이고, i프라임, 그리고 i 프라임이 속한 영역은 매핑된 영역일 것이다! 그게 곧 아래의 저것과 같다.
원문의 표현대로 설명하자면 index set of inputs in the sub-window over which the output unit $y_{rj}$ max pools.
그림을 이용하면 더 직관적이다!
모든 노테이션을 그림으로 정리하면 위와 같은 느낌이다. (다만 잘 안 보일 것 같은데 $x_{i}$는 검은색 한 칸을 의미한다.(3 *3 전체를 의미하는게 아니다!)
그리고 역전파는 아래와 같이 derivative 을 구함으로써 구할 수 있다.
아이스번 괄호는 앞에서도 했지만 간단하게 설명하면, 괄호 내의 수식을 만족하면 1 아니면 0이 되는 기능? 함수?다.
이 수식에 대해서 원문에서는 뭐라고 하냐면
In other words, for each mini-batch ROI r and for each pooling output unit $y_{rj}$, the partial derivative $ \frac{\partial{L}}{\partial{y_{rj}}}$ is accumulated if i is the argmax selected for $y_{rj}$ bt max pooling.
역전파의 경사는 전체 loss에 대해서 y를 편미분 한 것을 accumulate(수식 상으로는 sigma) 함으로써 구할 수 있다는 것이다.
** 한편 "In back-propagation, the partial derivatives $ \frac{\partial{L}}{\partial{y_{rj}}}$ are already computed by the backwards function of the alyer on top of the ROI pooling layer." 이라고 한다. 즉, 저 y에 대해서는 이미 gradient값이 주어졌으므로 x값을 구하기 편하다? 이런 맥락인 것 같다. 맞는지는 잘 모르겠다.
SGD hyper-parameters
softmax classifier와 bb regressor에 쓰인 fully-connected layer의 경우 각각 평균0, 표준오차 0.01을 따르는 가우시안 분포, 그리고 평균 0 표준편차 0.001을 따르는 가우시안 분포에서 initialize 했다. 편향은 0으로 initialize했다. global learning rate로는 0.001이 쓰였고, 가중치와 편향에는 각각 1과 2의 per-layer learning rate를 사용했다. 관성(momentum)은 0.9, 그리고 parameter decay는 0.0005를 사용했다.
VOC07과 VOC12을 학습할 때는 SGD를 30k mini batch 반복을 하고 또, 10k 반복을 할 때는 lr을 낮춰서 0.0001을 사용했다고 한다. 더 큰 데이터 셋을 학습할 때는 SGD를 더 반복했다고 하며 이는 후술한다.
2.4 Scale invariance
scale invariance라는 건 이미지의 크기에 영향을 받지 않고 detect 하는 것을 의미한다. scale invariant한 object detection을 하기 위해서는 크게 두 가지 방법이 있는데 (1) "brute force" 러닝과 (2) image pyramid를 사용하는 방법이 있다.
우선 brute force는 scale에 영향을 받지 않기 위해서 정해진 크기의 픽셀로 training과 testing의 인풋 사이즈를 고정시키는 방법이다. 이 경우 무조건 직접적으로 scale invariant하게 object detection 할 수 밖에 없다. 다른 사이즈를 본적이 없으니까.
** 그러나 이 이후 pyramid 부분은 통으로 이해를 못했다. SPPnet과 연관이 있는 거지 않을까?
3. Fast R-CNN detection
Fast R-CNN 신경망을 한 번 fine-tuned 하고 나면, detection할 때는 순전파를 보내는 것보다 조금 더 하면 된다(물론 proposal이 이미 존재한다는 가정 하). 신경망은 이미지와 R 개의 object proposal을 입력값으로 받는다. test 할 때는 R은 보통 2000의 근처로 잡는다.
각 ROI, r 에 대해서 순전파는 클래스 사후 확률 분포 p와 r의 bb offset이 예측된 set을 결과로 낸다. 그 후에 detection confidence를 p를 이용해서 r에 할당한다. 그 후엔 non-maximum suppression을 각 클래스에 사용한다(자세한 세팅은 R-CNN)을 따른다.
3.1 Truncated SVD for faster detection
기존의 R-CNN의 경우 영역을 추출하고 모든 영역에 대해서 CNN을 돌렸기 때문에, CNN에 소요되는 시간이 많았다. 하지만 이 Fast R-CNN에서는 CNN을 한 번만 시행하면 되기 때문에 CNN을 통해서 특성을 추출하는 것보다는 FC 층에서 더 많은 시간이 소요된다(전체 소요 시간 중 절반 이상이 여기서 사용된다고 한다). 따라서 FC layer에서 소요되는 시간을 절약하기 위해서truncated SVD를 사용했다(정확하게 대응하는 한국어 term은 모르겠지만, SVD는 특잇값 분해다. 고유값 분해와 다르다).
SVD 가 나온 김에 옛날에 했던(... 벌써 2년 전..) 고유값 분해도 다시 공부했다. 이게 메인이 아니므로, 본 포스팅에서 자세하게 설명하기 보다는 다시 공부한 흔적을 남겨놓는다.
하여간에 SVD의 핵심은 그거다. A라는 square matrix가 아닌 행렬을 대각화할 수 있다는 점이다.
truncated SVD는 원본 이미지(A라는 행렬)을 압축하면서도 최대한 원래 정보를 잃지 않는다는 점에서 약간 PCA와 닮아 있다고 할 수 있다.
$W = \approx U\sum_{t}V^{T}$
이 factorization을 rlwhsdp $u\dot v$였던 파라미터 수를 t(u+v)로 줄일 수 있게 된다. 만약 t가 min(u,v)보다 훨씬 작다면, 더욱 큰 효과를 볼 수 있을 것이다. truncated SVD를 이용해서 네트워크를 압축하기 위해서 W에 해당하는 the single fully connected layer를 2개의 fc layer로 분리했다. 2개 중 하나는 편향없는 가중치 행렬로 $\sum_{t} V^{T}$를 이용했고, 두번째로는 원래의 편향과 함께 U를 이용했다. 이 간단한 방법을 통해서 good speedup을 얻을 수 있었다고 한다.
4. Main results
사실 결과 파트게 제일 좋은데, 왜냐하면 한 번 읽어보면 되기 때문이다.
세 가지 main 결과로 정리할 수 있다.
- 1. VOC07, 2010, 2012의 mAP 값을 올림
- 2. R-CNN, SPPNet에 비교해서 빠른 training, testing
- 3. VGG16을 fine-tuning 함으로써 mAP를 올림
4.1 Experimental setup
세 가지 미리 학습된 모델을 사용했다. 하나는 R-CNN에 사용된 Imagenet 으로 이후 "S"로 부른다. 또 다른 하나는 VGG_CNN_M_1024는 "M"이라고 부르기로 한다. S와 같은 깊이지만 조금더 wider하기 때문이다. 마지막으로는 VGG16은 가장 큰 모델이기에 "L"이라고 부른다.
4.2 VOC 2010 and 2012 results
NUS_NIN_c2000과 Babylearning의 경우 당시에 publication이 없어서 정확하게 어떤 구조의 ConvNet를 사용했는지는 알 수 없었다. Network-in-Network의 변이? 중 하나였다. 다른 방법들은 모두 같은 VGG16 을 pre-trained 한 것을 이용했다. 보면 Fast R-CNN의 경우 가장 VOC12에서 높은 mAP 를 달성했다. 또한 다른 "느린" R-CNN 에 기반한 다른 방법보다 빠르다는 것 역시 알 수 있다.
한편 SegDeepM은 VOC12 train, validation과 segmentation annotation을 이용해서 훈련한 모델이다. R-CNN의 정확도를 semantic-segmentation방법의 $O_{2}P$로부터 R-CNN detections와 segmentation을 추리하기 위해서 마르코프 랜덤 필드(마르코프 네트워크라고도 한다)를 사용함으로써 올리기 위한 디자인이다. 더 큰 데이터 셋(07++12)를 이용했을 때 Fast R-CNN의 mAP는 SegDeepM의 성능을 크게 앞질렀다(68.4%).
(*마르코프는 들어봤지만 마르코프 네트워크, 랜덤 필드는 처음 들어보는지라 인터넷에 검색해봤다. 영상 복원에 자주 쓰이는 모델인 것 같다. 추후에 다룰 기회가 생기면 좋겠다! medium 글 읽고 싶은데 왜 다 돈 내야 하는 것들인지..)
4.3 VOC 2007 results
(하여간에 또 Fast R-CNN이 더 높은 mAP 를 달성했다는 내용이다)
4.4 Training and testing time
빠른 훈련, 테스트 시간은 Fast R-CNN의 다른 업적 중 하나이다. VGG16 pre-trained 모델을 사용했을 때, truncated SVD를 사용하지 않으면 R-CNN 보다 146배, 사용하면 213배 빠르다. SPPNet에 비해서도 truncated SVD를 사용하지 않고 7배, 사용하면 10배 정도 빠르다고 한다. 또한 Fast R-CNN은 수백 기가바이트의 디스크 저장소를 쓰지 않는다는 특징이 있다.
4.5 Truncated SVD
Truncated SVD를 사용함으로써 detection에 소요된느 시간을 30%줄일 수 있다. 비록 조금의 mAP 점수는 잃지만(0.3%).
위 사진을 통해서 보면 알 수 있듯이, SVD를 사용하면 전체 소요되는 시간 중 fc6과 fc7에서 소요되는 시간의 비율이 줄어들었다.
4.6 Which laters to fine-tune?
얕은 구조의 Sppnet에서는 오직 fc layer만 fine-tuning 해도 좋은 정확도를 얻을 수 있었다. 하지만 과연 이 결과가 깊은 네트워크 구조에도 동일하게 적용되는지 시험해보았다고 한다. 이를 위해서 VGG16의 13번 conv layer를 freeze 시켜서 오직 fc layer만 학습하도록 만들었다. 이렇게 freeze 함으로써 SPPnet의 학습을 모방했지만, mAP는 66.9%에서 61.4%로 감소했다. 즉 fc layer만 fine-tuning 하는 건 얕은 구조에서만 효과적이었던 방법이란 것이다. 따라서 이를 통해 확인되는 사실은, ROI pooling layer를 학습하는 것은 깊은 구조에서는 중요하다는 것이다.
하지만 그렇다고 해서 모든 합성곱 층이 전부 fine tuned 해야 하는 것은 아니다. 더 작은 네트워크 구조인 S와 M의 경우 conv1은 일반적이고, 과제와 독립적이기 때문에 이를 또 학습시킨다고 해서 mAP에 실질적인 효과는 없는 것으로 보였다. VGG16의 경우 conv3_1부터 학습시키는 것이 합리적이었다. conv2_1부터 업데이트하는 것은 트레이닝 시간이 느렸고, con1_1부터 업데이트 하는 것은 GPU 메모리를 over run(과다사용?) 했다. conv2_1부터 업데이트 하는 것은 실질적으로 mAP의 약 2%를 증가시켰기 때문에 가성비를 생각했을 때는 conv3_1부터 업데이트 하는 것이 합리적이다.
따라서 본 논문에서는 L의 경우 conv3_1부터 업데이트 한 한편 S와 M의 경우, 즉 구조가 L에 비해서 얕은 경우에는 conv2_1부터 업데이트 했다.
5. Design evaluation
PASCAL VOC07에 기반한 실험들
5.1 Does multi-task training help?
Multi task training은 연속적으로 훈련되는 과제의 파이프라인을 관리해도 않아서 편리하다는 장점이 있다. 또 동시에 과제들을 수행하면서 서로에게 영향을 끼치기 때문에 더욱 결과를 개선시킬 것이라는 기대도 가지게 한다. 그렇다면 실제로 multi-task training이 정확도를 개선하는지 살펴보자.
이를 위해 오직 classification loss만($L_{cls}$) 이용하는 베이스라인 네트워크를 훈련시켰다. 이 모델들은 bb regressor이 없다는 점을 기억하자. 이게 Table6에서 첫번째 행이다.
한편 두번 째 행은 multi task loss를 통해서 학습하지만($\lambda = 1$), bb regression은 학습하지 않은 모델이다.
세번째 행은 베이스라인 네트워크(classifcation loss만 이용한)을 이용하돼, 이를 학습한 이후에 다른 가중치들은 frozen 시키고 bb regression을 학습시킨 모델이다. (이 경우가 stage wise training + test-time bbox reg)
보면 마지막 행을 제외한 모든 행은 마지막 행에 비해 mAP가 낮은 것을 확인할 수 있다. 이는 모든 구조에서 동일하다.
따라서 multi-task training does help 라고 결론 내릴 수 있다.
5.2 Scale invariant: to brute force of finesse?
brute force 의 경우 single scale, image pyramid의 경우 multi scale.
single-scale detection의 성능은 multi-scale detection의 성능과 유사했다. 따라서 이를 통해서 깊은 ConvNet 은 직접적으로도 scale invariance를 학습할 수 있다는 점이다.
multi-scale은 mAP를 눈에 두드러질만큼 크게 향상시키지 않는다. 하지만 대신 시간이 많이 소요되지. 그래서 이런 tradeoff를 생각했을때, 특히 깊은 모델에서는 single scale을 사용했다고 한다.
5.3 Do we need more training data?
(당연한 이야기인 것 같은데)
데이터를 늘렸더니 더 좋은 mAP를 얻을 수 있었다.
5.4 Do SVMs outperform softmax?
그래프로도 충분해.
softmax의 경우 성능이 더 좋았다.
5.5 Are more proposals always better?
sparse object proposal이 Fast R-CNN의 성능을 향상시킨다는 사실!
proposal 의 수가 증가하면 mAP는 증가하기도 하지만 또 동시에 살짝식 감소한다. 따라서 그다지 정확도를 개선하는데 도움을 주지 못한다.
6. Conclusion
세상 겸손한 결론
we present detailed experiments that we hope provide new insights.
가장 뭔가 자신 있어 보이는 건:
Of particular note, spare opject proposals appear to improve detector quality. This issue was too costly to probe in the past, but becomes practical with Fast R-CNN.
7. 사족
갈수록 읽는 게 뭔가 편해진다...금방 잘 읽네...ㅎㅎ 대신 의욕도 그만큼 떨어짐....이제 모든 스터디가 거의 문을 닫다시피 하니....... 글을 쓸 욕구가 안 생긴다....귀찮아.....그래도 열심히..해야지.....난 아직 커야하니까................파이팅.........ㅎ,,,ㅎ,,,,,,,,,,,
latex가 많아서 다 제대로 적혔을지 그게 걱정이다.
까먹고 reference 안 쓸 뻔
[reference]
ROI에 대한 이해를 도와준 medium https://towardsdatascience.com/understanding-region-of-interest-part-2-roi-align-and-roi-warp-f795196fc193
고유값 이해, SVD 이해를 도와준 다크 프로그래머님 블로그 https://darkpgmr.tistory.com/105?category=460967
전반적인 틀 이해를 도와준 herbwood님 블로그 https://herbwood.tistory.com/8
'딥러닝 > CV 논문' 카테고리의 다른 글
[Classification] ViT: Vision Transformer (0) | 2021.07.29 |
---|---|
[NLP] Tansformer (0) | 2021.07.28 |
[Classification] GoogleNet (0) | 2021.07.19 |
[Object Detection] R-CNN (3) | 2021.06.05 |
[Classification] Alexnet (1) | 2021.05.06 |
댓글