[Yongggg's] Fast R-CNN & Faster R-CNN
안녕하세요! 오늘은 R-CNN의 문제점을 보완하여 나온 Fast R-CNN, 그리고 Faster R-CNN에 대해 설명해보겠습니다. R-CNN에 대한 자세한 설명은 제 블로그 Machine & Deep Learning 카테고리에 있으니 참고 부탁드립니다!
또, 해당 내용과 그림들은 고려대학교 김승룡 교수님의 고급컴퓨터비전 강의와 원래 논문을 참고했음을 미리 밝힙니다.
Fast R-CNN
1. 목적
- R-CNN 과정에서, Selective Search 후에 나온 RoI(Region of Interest) 마다 CNN 연산을 했기에 속도가 매우 느렸다는 점을 개선했다.
- R-CNN의 모델을 한 번에 학습하지 못하는 Multi-Stage라는 단점을 해결했다.
2. 개념
- 1-1의 문제를 전체의 이미지를 한 번에 CNN 연산을 함으로써 속도를 개선한다.
- CNN 연산 후의 Feature를 통해 Classification, Bounding Box Regression까지 하나의 모델에서 학습함으로써 1-2의 문제를 해결했다.
3. 원리
Fast R-CNN의 pipeline은 [그림 1]과 같다.
3.1 RoI Pooling layer
[그림 1]에서 나온 RoI pooling layer에 대해 자세히 알아보도록 하겠다.
먼저, [그림 2]처럼 RoI 영역들은 Integer point로 Snapping 된다.
다음으로, [그림 3]처럼 임의의 사이즈의 영역을 고정된 사이즈의 Representation으로 변환한다. (여기에서는 고정된 사이즈를 2 $ \times $ 2 의 Pixels로 나타냈다.)
- [그림 3]에서 3 $ \times $ 4 크기의 RoI를 2 $ \times $ 2 사이즈로 만들어 낼때, 3/2 =1.5 -> 2 (반올림), 4/2 =2로 사이즈를 지정한다. 이 계산은 구현자가 임의로 정할 수 있다.
4. 정리
위의 설명들을 바탕으로 [그림 1]의 Fast R-CNN의 수행과정을 정리해보겠다.
- 먼저, 원본 Image에서 Selective Search를 바탕으로 RoI를 찾는다.
- 동시에 원본 Image를 CNN에 태워 feature map을 추출한다.
- Selective Search로 찾은 RoI를 2번의 feature map 크기에 맞춰 feature map에 Projection 시킨다.
- Projection 된 RoI에 대하여 RoI Pooling 과정을 거치게 한 후, 고정크기의 feature vector를 얻는다. (이 featur vector를 FC Layer에 통과시켜 두 개의 Brunch의 입력이 된다.)
- feature vector를 입력으로 softmax 함수를 통과시켜 RoI에 대해 Object Classification을 한다.
- Bounding Box Regression을 통해 Selective Search로 찾은 box의 위치를 조정한다.
Faster R-CNN
1. 목적
- [그림 4]를 보면, Fast R-CNN은 다른 OD Model들 보다 Training time 과 Test time의 시간을 현저하게 단축 시켰다. 하지만, Test time에서 Region Proposal을 수행할 때 걸리는 시간은 다른 모델들과 비슷하게 2초 정도를 차지하는 것을 확인할 수 있다. Selective Search 알고리즘은 CPU를 사용하기 때문에 이런 문제점이 발생했다. Faster R-CNN은 이 문제점을 해결했다.
- 이전의 OD task를 수행하는 모델들은 Multi stage Training을 수행했다. 이전의 Fast R-CNN 또한, RoI를 추출할 때, Selective Search 알고리즘을 사용했다는 점은 Multi stage Training 이라고 봤다. Faster R-CNN은 이 문제 또한 해결했다.
2. 개념
Faster R-CNN에서는 RPN(Region Proposal Network)를 사용하여 이 문제를 해결함으로써, 모든 계산이 End-to-End로 끝나는 Single Stage Training을 구현하였고 이미지를 따로 저장한 뒤에 연산을 해야하는 번거로움 또한 없앴다.
3. 원리
[그림 5]를 보자. Region Proposal Network 부분만을 제외하면, 위의 Fast R-CNN과 동일한 구조임을 확인할 수 있다.
3.1 RPN (Region Proposal Network)
[그림 5]의 Region Proposal Network 부분을 알아보겠다.
( 이 부분의 설명은 제이스핀(J.Spin) 님의 블로그의 내용을 가져왔습니다. )
먼저, Pretrained CNN을 거쳐 나온 Feature Map의 Channel Dimension은 ZFNet 기준 256-d, VGG-16 기준 512-d가 나오게된다. 이 Feature Map을 k개의 Anchor box를 통해 영역을 정하고 Classification Layer와 Bounding Box Regression을 거쳐 물체가 있는 곳과 물체가 있는지 없는지에 대해 학습하게된다.
여기서 Classification Layer는 [그림 6]에서 나온 것처럼, 물체가 있는지 없는지에 대해서만 확인하는 역할을 하기 때문에 Class 개수는 2개(있음, 없음)를 판단하는 Layer가 된다.
3.1.1 Anchor Targeting
Input Image Size를 800 $ \times $ 800 $ \times $ 3 이라고 가정하자.
이 Image가 VGG-16 Net에 들어가게되면 50 $ \times $ 50 $ \times $ 512의 feature map이 생성된다.
이 feature map에 Sliding window 방법으로 각 중심 좌표를 중심으로 k=9개의 Anchor Box들을 만들어 놓는다.
여기서 Anchor box는 3개의 Scale(8, 16, 32)과 3개의 ratio(0.5, 1, 2)를 사용하여 총 9개가 만들어진다. 만들어진 Anchor Box의 모습은 [그림 7]과 같다.
800 $ \times $ 800 Image에서 50 $ \times $ 50 크기의 feature map을 생성했으므로 subsampling ratio=16으로 둔다. (800/50) [그림 8]과 같이 sliding window 방식으로 16 $ \times $ 16 안의 중심 픽셀 (파란색 점)을 중심으로 Anchor Box를 9개를 쳐서 50 $ \times $ 50 $ \times $ 0=22,500개의 Anchor Box를 미리 만든다.
[그림 9]를 보면, 800 $ \times $ 800 사이즈의 Anchor Box의 중심 좌표와 pixel 중심이 (400, 400)일 때, 9개의 Anchor Box의 모습이다.
이렇게 만든 22,500개의 Anchor Box를 기준으로 그 안에 물체가 있는지 없는지에 대해 학습을 진행할 것이다.
-> 이 Task를 하기 위해서는 이미지와 Ground Truth Box가 들어왔을 때, 각 Anchor마다 이 Anchor가 물체를 감싸고 있는지, Background를 감싸고 있는지에 대한 Label이 필요할 것이다.
따라서 GT Label은 만들어진 22,500개의 Anchor들과 Ground Truth Box의 IoU를 모두 계산하여 IoU 값이 0.7보다 크다면 1 (Positive), IoU가 0.3보다 작으면 0 (Negative)으로 두고 나머지는 -1로 두어 신경쓰지 않도록 한다.
(IoU는 이전의 R-CNN에서 설명한 것을 참고해주시면 감사하겠습니다!)
이렇게 설정한다면, Positive의 Anchor의 개수가 많지 않을 수 있기 때문에 Ground Truth Box마다 IoU가 가장 높은 Anchor 1개를 뽑아 이 Anchor도 1 (Positive)로 Labeling 한다.
3.1.2 Prediction
50 $ \times $ 50 $ \times $ 512 크기의 feature map을 Conv layer에 한 번 태운후에,
Bbox Regression Layer(50 $ \times $ 50 $ \times $ 512 -> 50 $ \times $ 50 $ \times $ 36) 와
(36은 Anchor Box의 개수 (9개) $ \times $ Bounding Box 좌표 개수 (4개)를 뜻한다.)
Classification Layer(50 $ \times $ 50 $ \times $ 512 -> 50 $ \times $ 50 $ \times $ 18)을 만든다.
(18은 Anchor Box의 개수 (9개) $ \times $ Class의 개수 (2개)를 뜻한다.)
따라서 [그림 10]의 Regression Layer의 output은 (22500, 4), Classification Layer의 output은 (22500, 2)가 된다.
이렇게 Prediction을 마치면, 3.1.1에서 사용한 Ground Truth Label과 3.1.2의 예측값이 함께 Loss function에 들어가 RPN을 학습할 수 있도록 한다.
동시에, 3.1.2에서 나온 Prediction 값 두 개(Bbox Regression, Classification)는 NMS를 거쳐 특정 개수의 RoI로 Sampling된 후, Fast-RCNN에 쓰이게 된다.
3.1.3 Loss Function for RPN
(이 또한 J.Spin님이 설명을 너무 잘 해놓으셔서 설명을 따왔습니다.)
22,500개의 Anchor 중에서 i번째 Anchor에 대하여 Ground Truth(GT)와 Prediction 값을 비교하여 RPN의 Class(물체가 있는지 없는지)와 Box(Box의 위치)를 학습한다.
[수식 1]에서 $ L_{cls} $ : Classification은 Log Loss를 사용,
$ L_{reg} $ : Box Regression에서는 Smooth L1 Loss를 사용했다.
GT Label 이 0이라면 Background로 간주하는 것이기 때문에 뒷 항에 0이 곱해진다. 때문에 Bbox reg는 학습되지 않는다. 또, Balancing Weight 인 $ \lambda $와 $ N_{cls} $, $N_{reg} $를 통해 두 항을 Normalize한다.
4. 정리
위의 3.1.2에서 NMS까지 마친 RoI들은 그대로 Fast R-CNN에서 사용했던 Network와 동일한 Network를 거쳐 OD를 수행하게 된다.
[그림 11]은 R-CNN, Fast R-CNN, Faster R-CNN의 pipline을 그림으로 나타낸 것이다.
이렇게 Fast R-CNN과 Faster R-CNN에 알아보았습니다. OD 부문에서 최초의 one-stage 과정으로 넘어오는 논문이었습니다. 글의 오류사항이나 문제들은 댓글로 남겨주시면 감사하겠습니다!