Faster RCNN = RPN + Fast RCNN
Selective Search 를 통해 ROI 를 만드는 부분을 RPN 으로 구성한 모델이다. 따라서 비로소 딥러닝만으로 Object Detection 을 구성하는 것이 가능해졌다.
📚 목차
Faster RCNN
2-1. RPN
Region Proposal Network 를 통해 Object가 있을만한 위치를 찾아준다. (기존 2000개인 proposal 을 800개로 줄이면서도 성능 향상)
2-2. 찾은 region proposal 을 feature map에 ROI pooling 수행하여 고정된 크기의 feature map 을 얻는다.
따라서 SS를 딥러닝 네트워크로 변경했다는 점이 눈에 띤다.
✅ Region Proposal Network 구현 이슈
데이터로 주어질 피쳐는 픽셀 값, target 은 GT bounding box인데 이를 어떻게 region proposal 할 것인가? -> Anchor Box!
앵커박스란 박스를 촘촘하게 채운 네모박스들을 뜻한다. 여기에 데이터를 넣은 후 학습을 시키는 방식을 RPN 이라고 하고, 도드라지는 앵커박스를 기반으로 학습한다.
(추가) 앵커의 도입이유 ➡️ 딥러닝이라고 하더라도 GT 박스에 대한 정보를 가지고만 Predict 하기엔 성능이 너무 떨어진다. 결국엔 어떤 정보를 추가로 더 주어 이를 기반으로한 예측이 필요하며, 그것이 지난번까지 도입된 SS였다. (RCNN, Fast RCNN) 그러나 SS의 경우 딥러닝 네트워크에 포함되지 않는 별개의 알고리즘으로 효율성이 떨어진다. 그래서 앵커 박스를 도입해서, 후보 박스를 만들고, 앵커도 학습시키고 (RPN) 그 중 선택하는 알고리즘 도한 훈련시켜 Object Detection 을 수행하는 것이다.
앵커는 총 9개의 Anchor box, 3개의 서로 다른 크기, 3개의 서로 다른 ratio 로 구성된다.
결국 앵커박스는 만들어진 피처맵에 적용되는 것이며, 포인트를 기준으로 하나의 포인트에 위의 9개의 앵박스를 만들게 된다. 아래의 그림을 참고하자.
피처맵에서 가로 50, 세로 38의 포인트가 나올 때 50 X 38 = 1900개의 앵커박스 포인트(그리드)가 만들어지게 되고, 앵커박스는 여기에 X9 = 17100개가 만들어진다. 각 포인트에서 9개의 앵커박스를 만든다는 것! 결국 앵커박스끼리의 영역또한 겹치게 되므로
앵커박스 구성 -> 특정 한 점에서의 앵커박스 -> 모든 그리드 셀에서 앵커박스 적용한 사진이다.
이전 Fast RCNN 의 경우 피처맵에 SS에서 구한 ROI 영역을 매핑시켰다. 그러나 Faster RCNN 의 경우, RPN 을 적용하게 된다. RPN 은 피처맵을 입력받아 앵커에 대한 clas score, bounding box reggresion 2개를 반환한다.
RPN역시 영역을 추천하는 네트워크인데, 어떻게 가능할까?
2-1. 1 X 1 conv 연산으로 오브젝트인지, 아닌지 이진분류를 하게된다. (class score)
2-2. 1 X 1 conv 연산으로 영역추천을 하게된다. (bounding box regression)
결국 1 X 1 conv 연산을 한다는 것은 매 그리드 포인트를 움직이며 매 픽셀에서 앵커박스 연산을 한다는 것이다.
# rpn 연산구현, base 는 입력 네트워크
def rpn(base, num_anchors):
x = Convolution2D(512, (3,3), padding ='same', activation = 'relu', kernel_initializer = 'normal', name = 'rpn_conv1')(base_layers)
x_class = Convolution2D(num_anchors, (1, 1), activation = 'sigmoid', kernel_initializer = 'uniform', name = 'rpn_out_class')(x)
x_regr = Convolution2D(num_anchors = 4, (1, 1), activation= 'linear', kernel_initializer= 'zero', name = 'rpn_out_regress')(x)
return [x_class, x_regr, base_layers]
✅ (참고) RPN Bounding Box Regression
이번엔 Anchor Box와 센터 좌표, Predicted Ground Truth 를 사용한다.
수정 예측값 4가지 (GT의 예측좌표로써 GT의 중심좌표 x, y 와 너비, 높이를 예측한다.)
Target
차이 4가지를 Target 으로 한다.
논문표기
논문표기일 경우 역시나 x,y,w,h 의 차이를 구하는 것이 목표이나 아까 전과 밝혔듯이
예측좌표 - anchor 좌표 (x,y,w,h)와
Ground truch 좌표 - anchor 좌표 (x, y,w, h) 를 같게 하는 것이다.
✅ (참고) Positive Anchor Box, Negative Anchor Box (Anchor target layer)
RPN이 학습하는데 사용할 수 있는 Anchor 을 확정짓도록 Anchor target layer 에서는 데이터를 positive, negative 로 나눈다. 이를 위해 앵커와 GT 의 바운딩박스와 겹치는 IOU값에 따라 positive, negative anchor box 로 또다시 분류한다.
✅ RPN Loss
: 앵커 i가 오브젝트일 확률
: 앵커 i의 GT 여부(positive 1, negative 0)
: 앵커 i와 예측좌표 차이 (x, y, w, h)
: 앵커 i와 GT좌표 차이 (x, y, w, h)
Ncls 는 미니배치에 따른 정규화(256), Nbox 는 박스개수 정규화값(최대 2400) 을 의미하고, 람다는 밸런싱 하이퍼파라미터이다.
따라서 첫번째 term 은 앵커가 오브젝트일 '예측'과 '실제여부'의 차이를 바탕으로 Loss 를 측정(sigmoid)하는 것이다. 두번째 term 은 앵커와 예측, 앵커와 GT 사이 거리를 최소화하는 식으로 훈련하는 것이다. (L1 loss) 이때 곱해지는 p는 결국 positive anchor 에서에만 regression loss 를 측정하겠다는 의도이다.
먼저 학습 후 freeze 시키는 방식으로 조금은 복잡하게 학습된다.
< 성능 지표 >