Faster R-CNN 논문 리뷰
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks을 정리한 글입니다!
Introduction
- Faster R-CNN 논문은 Fast R-CNN을 보완한 논문입니다
- 기존에 사용되던 Region Proposal 방법인 Selective Search는 CPU에서 계산
- CNN 외부에서 진행
- GPU의 이점을 최대한 활용하고 CNN 내부에서 진행하기 위해
Region Proposal Network(RPN)
을 도입- RPN은 각 위치의 object bounds와 objectness score를 동시에 예측하는 fully convolutional network입니다
Architecture
- 2개의 Network
- Region Proposal Network
- 위에서 나오는 proposed regions을 사용해 object 감지하는 Detector
Input
- \[Height \times Width \times Depth\]
- RGB Color를 갖는 이미지
Feature Extraction
- pretraind model을 사용해 Feature Map 생성
- input : 이미지
- output : object의 Feature Maps
Region Proposal Network
- input : Feature Extraction에서 뽑은 Feature Maps
- output layer
- classification layer : Object 유무
- reg layer : Object Proposal
- Feature Maps 위에 \(n \times n\) spartial window(보통 \(3\times 3\))를 슬라이드
- sliding-window가 찍은 지점마다 여러 Region Proposal(Anchor) 예측
- Anchor
- sliding window의 각 위치에서 Bounding Box의 후보로 사용되는 상자
- \(k\)로 표현
- 3개의 크기(128, 256, 512), 3개의 비율(2:1, 1:1, 1:2) = 9개의 조합
- Classification layer
- 모든 anchor마다 foreground, background 분류
- Anchor가 ground truth box와 IoU가 가장 크고 0.7 이상이면 foreground, 적으면 background
- ground truth box : 실제 box의 좌표
- IoU : Intersection over Union
- foreground는 positive anchor
- background는 non-positive anchor
- Regression layer
- Bounding box regression
- \(t\)는 4개의 좌표값을 가지고 있으며 ground-truth \(t^*\)도 4개의 좌표값을 가지고 있습니다
Region of Interest Pooling
- RPN을 지나면 서로 다른 크기의 proposed region이 나옵니다. 서로 다른 크기의 region을 동일한 크기로 맞추기 위해 RoI Pooling을 사용합니다
- Fixed-size resize
- RoI Pooling 대신 object detection을 구현할 떄 많이 쓰이는 방법으로, feature map을 crop시킨 후, 고정된 크기로 보간해 resize
- 그 이후 \(2 \times 2\) kernel을 사용해 \(7\times 7 \times depth\)로 max pooling
Training
Loss Function
- \(i\) : anchor의 index
- \(p_{i}\) : anchor \(i\)가 객체인지 배경인지 예측값
- \(p_{i}^{*}\) : ground-truth label, 1은 객체(positive)를 뜻하며 0은 배경(negative)
- \(L_{cls}\) : 객체인지 배경인지의 log loss
- \(N_{cls}\) : normalization 값, mini-batch값
- \(t_{i}\) : 4개의 bounding box 좌표
- \(t_{i}^{*}\) : ground-truth box
- \(L_{reg}\) : 객체가 있을 경우 loss function. smmoth l1 loss 사용
- \(N_{reg}\) : normalization, anchor locations의 갯수
- \(\lambda\) : 기본값 10
Training RPN
- 한 이미지에서 random으로 mini-batch만큼 anchors를 샘플링
- 이 때, positive anchor와 non-positive anchor를 1:1 비율로 사용
- 보통 negative anchors가 더 많기 때문에 비율을 조정하지 않으면 학습이 한쪽으로 편향됨
- 하지만 positive anchor가 128개보다 적으면 zero-padding을 시켜주거나 아예 positive가 없으면 IoU값이 높은 값을 사용
- weight는 랜덤하게 초기화
- ImageNet classification으로 fine-tuning
- Learning Rate : 0.001(60k mini batch), 0.0001(20k mini batch)
- Momentum : 0.9
- Weidght decay : 0.0005
Results
R-CNN | Fast R-CNN | Faster R-CNN | |
---|---|---|---|
Test time per Image (with proposal) | 50s | 2s | 0.2s |
상대적 Speed | 1x | 25x | 250x |
mAP (VOC 2007) | 66.0 | 66.9 | 69.9 |
Experiments
- Table 2. RPN을 사용했을 때 mAP가 조금 더 좋음
- Table 8 : 3 scales, 3 ratios를 사용할 때 성능이 가장 좋았음
- Table 9 : lambda값이 10일 때 성능이 가장 좋았음
Conclusion
- Our method enables a unified, deep-learning-based object detection system to run at near real-time frame rates
각종 방법론
Reference
카일스쿨 유튜브 채널을 만들었습니다. 데이터 분석, 커리어에 대한 내용을 공유드릴 예정입니다.
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 의견이 있으시면 댓글 남겨주셔요.