열심히 정리해본 딥러닝: Fast R-CNN

임성완·2021년 12월 25일
0
post-thumbnail

"Fast R-CNN"

- R-CNN 패밀리 중 하나 (R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN)

- R-CNN 보다 향상된 속도와 정확도, 하지만 여전히 일부 과정에서 GPU를 이용한 병렬처리는 불가능

- 하지만 Faster R-CNN을 알기 전에 먼저 짚고 넘어가야하는 객체 감지 논문


위의 이미지가 Fast R-CNN의 아이디어를 설명해주고 있습니다.

이제 구체적인 과정을 알아보겠습니다.

입력 이미지에서 Selective Search 를 이용해서 2000개의 RoI라고 불리는 영역을 추출합니다. 이는 R-CNN에서도 나왔으므로 생략하겠습니다.

2. CNN layers

VGG16 네트워크에 입력 이미지를 통과시키는데 이때 마지막 pooling 층을 제거하고 1층으로 된 [1]SPPnet를 사용합니다.

  • [1]SPPnet:

    위 이미지의 예시를 그대로 설명하면 256개의 층으로 구성된 feature maps를 (n * m * 256) 3개의 층에 걸쳐서 16등분 하고 이를 global max pooling(한 구역(n, m ~ n + i, m + j)에서 가장 큰 값을 층마다 구해서 이것을 벡터로 만든 것(1 * 1 * 층 수)을 위치에 4등분, 원본을 global max pooling 한것도 그대로 옆으로 이어 붙이면 총 21 * 256 의 벡터가 만들어집니다. 이때 16등분, 4등분, 1등분(원본) 을 했으므로 이 SPPnet의 계층 수는 3입니다.

이 한 층의 SPPnet을 RoI Pooling layer 라고 부르겠습니다.
이 층을 지나기 전에 먼저 Selective Search로 획득한 RoI를 입력 이미지와 feature map의 비율을 구하고 그 비율에 맞춰서 RoI의 크기를 변경합니다. 그 후 비율에 맞춰서 위치를 조정한 뒤 feature map을 RoI의 조정된 크기에 맞춰서 자르고 그 부분을 RoI Pooling layer에 통과시킵니다.

이때 subwindow(그리드 각각의 크기)의 크기는 ceiling(w / W) * ceiling(h / H)가 됩니다.(ceiling: 올림, floor: 내림)
그리고 stride(겹침, subwindow를 움직일 때 겹치는 크기(0일 경우 겹치지 않게 이동합니다)는 floor(w / W), floor(h / H)가 됩니다.
따라서 RoI의 크기가 6 * 8이라고 할 때 subwindow의 가로, 세로의 길이는 ceiling(6 / 7) = 1, ceiling(8 / 7) = 2이고 stride 는 튜플로(가로, 세로) 지정할 수 있으므로 각각 floor(6 / 7) = 0, floor(8 / 7) = 1 이 됩니다.

window size와 stride를 맞추면 실제로 출력이 나오는지 그림판으로 실험해보았습니다.

세로를 기준으로 해보았는데 7개로 출력이 잘 나옵니다.
또한 가로의 경우 1칸이 남는데 이는 아래 그림과 같이 마지막 그리드에 추가합니다.

그리고 기본적인 SPPnet과는 달리 global max pooling한 벡터를 이어붙이는 것이 아닌 위치에 맞게 이어붙여서 3차원 텐서의 형태로 만듭니다. 따라서 7 * 7 * 512 형태의 텐서가 출력됩니다.

3. Training

3.1. Multi-task Loss

p=(p0,...,pK)p=(p_0,...,p_K) (K + 1) 길이의 fc레이어와 tk=(txk,tyk,twk,thk)t^k=(t^{k}_{x},t^{k}_{y},t^{k}_{w},t^{k}_{h}) {(K + 1) * 4} 길이의 fc레이어로 총 두개의 출력층이 나옵니다.

이때 u는 positive sample(객체)일 때 해당 객체의 인덱스(k)가 되고 negative sample(배경)일 때 0이 되는 변수입니다.
Lcls(p,u)=logpuL_{cls}(p,u)=-log\,{p_u}
LclsL_{cls} 는 크로스 엔트로피 손실 함수입니다.


Iverson bracket indicator function 이 나오는데 대괄호 안의 식을 충족하면 1을 반환하고 그렇지 않으면 0을 반환하는 함수입니다. 따라서 positive sample 일때에는 1이 반환되고 negative sample일 때에는 0이 반환되어서 뒤의 식을 수행하지 않고 0을 반환합니다.

LlocL_{loc} 함수는 위와 같고 smoothL1smooth_{L_1} 함수는 다음과 같습니다.

하이퍼피라미터 λ=1\lambda = 1 입니다.

3.2. Hierarchical Sampling

전체 이미지들 중 N=2개의 이미지를 추출하고 각각 RoI 64장을 추출하는데 이 때 25%는 ground truth 와 positive sample(IoU가 0.5 이상)로 구성하고 75%는 negative sample(IoU가 0.1 ~ 0.5)로 구성하고 각각 두 이미지의 추출된 RoI(64개)를 합해서 128개의 하나의 mini-batch로 묶습니다. 같은 이미지에서 추출된 RoI는 순전파와 역전파시 계산과 메모리를 공유할 수 있습니다.

3.3. Initializing Network

ImageNet으로 pre-trained 된 VGG16을 사용합니다.
그리고 마지막 pooling 층을 RoI pooling layer로 바꿉니다. 그 후 네트워크의 입력을 원본 이미지와 RoI를 입력받을 수 있게 변경합니다.
이제 마지막 softmax layer를 (K+1)(K + 1) 길이의 softmax layer로 바꿉니다. 또 (K+1)(K + 1) 만큼의 bounding-box regressor 를 네트워크의 끝에 위치시킵니다.
두 개의 fc layers(softmax-classification, bounding-box regression)을 평균을 0으로, 표준 편차는 각각 0.01, 0.001인 정규 분포로 초기화합니다.

4. Fine-tuning & Detection

Fine-tuning:
연구 결과에 따라 conv3 층까지 freeze(가중치 고정) 시키고 아까 만든 미니 배치로 학습을 시작합니다.
Detection:
이제 이미지를 입력시키고 나온 서로 겹치는 bounding-box들을 NMS로 제거해주면 끝입니다. 시각화는 softmax layer에서 확률이 높은 클래스와 그에 해당하는 bounding-box를 찾아서 시각화해줄 수도 있습니다.

참고한 글:
논문: Fast R-CNN
SPPNet:

전체적인 Fast R-CNN 논문 리뷰:

profile
미래를 꿈꾸는 고등학생 개발자입니다

0개의 댓글