위의 이미지가 Fast R-CNN의 아이디어를 설명해주고 있습니다.
이제 구체적인 과정을 알아보겠습니다.
입력 이미지에서 Selective Search 를 이용해서 2000개의 RoI라고 불리는 영역을 추출합니다. 이는 R-CNN에서도 나왔으므로 생략하겠습니다.
VGG16 네트워크에 입력 이미지를 통과시키는데 이때 마지막 pooling 층을 제거하고 1층으로 된 [1]SPPnet를 사용합니다.
이 한 층의 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 형태의 텐서가 출력됩니다.
(K + 1) 길이의 fc레이어와 {(K + 1) * 4} 길이의 fc레이어로 총 두개의 출력층이 나옵니다.
이때 u는 positive sample(객체)일 때 해당 객체의 인덱스(k)가 되고 negative sample(배경)일 때 0이 되는 변수입니다.
는 크로스 엔트로피 손실 함수입니다.
Iverson bracket indicator function 이 나오는데 대괄호 안의 식을 충족하면 1을 반환하고 그렇지 않으면 0을 반환하는 함수입니다. 따라서 positive sample 일때에는 1이 반환되고 negative sample일 때에는 0이 반환되어서 뒤의 식을 수행하지 않고 0을 반환합니다.
함수는 위와 같고 함수는 다음과 같습니다.
하이퍼피라미터 입니다.
전체 이미지들 중 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는 순전파와 역전파시 계산과 메모리를 공유할 수 있습니다.
ImageNet으로 pre-trained 된 VGG16을 사용합니다.
그리고 마지막 pooling 층을 RoI pooling layer로 바꿉니다. 그 후 네트워크의 입력을 원본 이미지와 RoI를 입력받을 수 있게 변경합니다.
이제 마지막 softmax layer를 길이의 softmax layer로 바꿉니다. 또 만큼의 bounding-box regressor 를 네트워크의 끝에 위치시킵니다.
두 개의 fc layers(softmax-classification, bounding-box regression)을 평균을 0으로, 표준 편차는 각각 0.01, 0.001인 정규 분포로 초기화합니다.
Fine-tuning:
연구 결과에 따라 conv3 층까지 freeze(가중치 고정) 시키고 아까 만든 미니 배치로 학습을 시작합니다.
Detection:
이제 이미지를 입력시키고 나온 서로 겹치는 bounding-box들을 NMS로 제거해주면 끝입니다. 시각화는 softmax layer에서 확률이 높은 클래스와 그에 해당하는 bounding-box를 찾아서 시각화해줄 수도 있습니다.
참고한 글:
논문: Fast R-CNN
SPPNet:
전체적인 Fast R-CNN 논문 리뷰: