안녕하세요 pulluper 입니다. 😀
너무 늦었지만 오늘은 제대로 된 deep learning object detection 의 시작
ICCV2015에서 발표된 Fast R-CNN 을 리뷰 해 보도록 하겠습니다. [paper]
오래 된 논문이니만큼 성능보다는 아이디어나 처음 학습 방법 등
얻어갈 수 있는 부분을 보시길 추천드립니다.
저는 (RoI pooling, Loss) 들을 보시면 좋을 것 같다는 생각이 드네요.
그럼 시작하겠습니다.
일단 저자를 보니 심상치 않습니다.
이분은 Ross Girshick 이십니다. 2022년 1월기준 Facebook AI Research (FAIR) 에 계시고,
논문을 쓴 당시에는 Microsoft 에 소속되신 시기였습니다.
RCNN, Fast R-CNN, Faster RCNN, YOLO v1, RetinaNet 등 (이외에도 엄청 많음..)
object detection 의 다수에 논문에 참여를 하신 화려한 이력이 있으십니다.
2022년 1월 기준 23만의 말도안되는 citation 을 지니시고 있네요. 🙄🙄
Abstract
논문의 abstract(초록)에서는 연구 주제나 목표 핵심내용을 간결하게 설명해주고
독자의 흥미를 끌어야 하는 부분이라서 가장 중요하게 읽는 부분입니다. 😁
Abstract 에서는 말 그래로 빠른 Fast R-CNN 을 제안했고,
R-CNN 에 비해서는 training 시간이 VGG16기준 9배, test-time 은 무려 213배 빨라졌고
SPPnet 에 비해서는 training 3배, test-time 은 10 배 빨라졌다고 하는데요.
심지어 더 정확하다고 합니다.
이렇게 설명을 해 놓으니 빨리 읽고싶어 지지 않나요?
Introduction
이 시기는 convolution neural network 가 나와서
classification, object detection 등의 task 에서 기존의 방법론들보다
학습을 이용해서 성능이 높아지는 초기였습니다. :)
Introduction 에서는 다음과 같은 내용을 말하고 있습니다.
- deep conv 의 발전으로 classification object detection 이 개선중.
- object detection 은 classification 보다 더 어려운 문제이다.
- object detection 은 반드시 먼저 candidate 를 구하고, 이후 그 후보자 중에서 refine 을 하여 정확한 위치를 찾는다
- 이 논문에서 빠르고(0.3s/img - excluding proposal) 정확한 (VOC 2012 mAP 66%) 을 제안한다.
내용중 흥미로운 부분은 먼저 후보자 (candidate) 를 뽑고
이후에 refine 을 하는 2-stage 의 방법을 매우 강하게 말하고 있는 것입니다.
후에 다양한 알고리즘들이 나오면서 많이 놀랐을 것 같습니다. 🤩
R-CNN & SPPnet
이 부분에서는 기존의 알고리즘에 대한 단점을 짚으면서 문제 제기를 합니다.
1. training multi-stage pipeline.
convolution, SVM, box regressor 등을 다 따로 학습시키기 때문에 여러 단계에 걸쳐 학습
2. training is expensive in space and time.
학습시 여러개의 patch를 sharing computation 을 이용하지 않아 모두 저장하고 오래걸림.
3. object detection is slow.
이 또한 sharing computation 을 하지 않아 오래걸리는 것을 볼 수 있습니다.
sharing computation 을 간단하게 설명하면
아래의 왼쪽 그림처럼 여러개의 RoI(region of interest)
를 각각의 conv로 학습하는것을
오른쪽 그림처럼 전체 이미지를 학습하고,
한 이미지는 convolution weight를 공유하는 것을
Sharing computation 이라고 할 수 있습니다.
그리고 SPPnet 은 sharing computation은 하지만,
convolution 이 update 를 하지 않는다는 단점이 있습니다.
이를 정리하면 다음과 같습니다.
Multi-stage pipeline | Sharing computation | Update Convolution | |
R-CNN | O | X | O |
SPP-net | O | O | X |
Fast R-CNN | X | O | O |
결과적으로 Fast R-CNN 은
multi-stage pipeline을 사용하지 않고, single-stage training 방식을 사용했으며,
Sharing computation 을 이용하여 시간,공간,속도의 향상을 가져왔으며
Convolution 을 update 시키도록 하여 성능을 향상시켰습니다. 😎
이렇게 논문의 구성에서 자신들이 문제제기를 명확히 하고
해결방안을 제시한 것은 잘 쓴 논문이라는 생각이 듭니다.
Contributions
Contiributions 에서 위에 나왔던 내용들이 모두 나옵니다.
1. 성능이 좋다 (mAP가 높다)
2. multi-task loss 를 이용해서 single-stage 학습을 했다.
3. 모든 네트워크가 update 된다.
4. feature cashing 을 위한 disk 저장소가 필요없다.
Fast R-CNN architecture and training
이번 챕터에서는 전체적인 faster rcnn 의 구조와 학습 방법을 소개합니다.
아래 사진은 Fast RCNN의 구조인데요. Deep ConvNet 과 RoI projection 부분이 들어갑니다.
그리고 이후에 RoO pooling layer 를 지난 후 FCs 가 2개의 branch 로 나눠지는 구조입니다.
Fast-RCNN 부분중 가장 중요한 부분은 RoI pooling layer 라고 생각합니다.
내용을 보면 이미지 전체와 proposal set을 input으로 받는다고 되어 있습니다.
즉 위 사진에서의 DEEP CONVNET과 RoI projection을 통해서 나오는 2가지 입니다.
이미지가 들어가면 그것을 convolutional network 를 통해서 feature 를 뽑고 - (1)
selective search 를 이용해서 나오는 후보 projection 을 - (2)
두개의 input 으로 받습니다. 이후 과정을 진행합니다.
** The RoI pooling layer **
RoI pooling 이라는 것이 무엇일까요?
먼저 이해를 위해서 그냥 image 에 RoI pooling 을 적용한 사진을 보겠습니다.
다음 사진에는 의자(chair)가 5개 있는데, 이것들의 size 다 다릅니다.
이를 같은 (30 x 30) 의 크기로 maxpooling을 통해서 잘라서 모아주는 역할을 합니다.
즉, Image 가 [B, 3, 600, 600] 이라고 가정한다면, RoI pooling 이후에
[num_object=5, 3, 30, 30] 으로 feature 를 일정하게 뽑는것 이라고 이해 가능합니다.
아래 그림을 보시면 이번에는 feature 에서 적용한 것인데요, 처음에 feature 에서 두번째 region을 2 x 2로 변경하고 싶은 것 입니다. 즉 검정 박스의 feature map (7 x 5)를 (2 x 2)로 바꾸기 위해서 각 cell 들중 max값으로 pooling 합니다.
결과적으로 (7 x 5) 의 feature 는 (2 x 2) 로 줄어들게 됩니다.
그리고 roi pooling 은 SPPnet의 하나의 피라미드 level에 대한 spatial pyramid pooling 이라 볼 수도 있습니다.
RoI Pool 코드 예제는 다음과 같습니다.
Initializing from pre-trained networks
VGG16 을 변형하여서 Fast RCNN 을 만들었는데 변형된 부분은 다음과 같습니다. 😀
기본적으로 pre-trained 된 ImageNet network 를 사용하였고, 3가지의 변형이 있습니다.
- 첫번째는 마지막 max pooling 을 위에서 설명한 RoI pooling 을 사용한 점과 (H = W = 7 for VGG16)
- 두번째는 fc 의 마지막 softmax layer를 k + 1 class 에 대한 classifier 과 bonding box regressor 로 바꾼점이고
- 마지막으로 input 을 이미지의 list 와 RoI 의 list 를 받는다는 점 입니다.
Fine-tuning for detection
이 섹션에서는 어떻게 학습을 하는가에 대하여 말하고 있습니다. 이를 Fine-tuning 이라고 하였습니다.
SPP와 달리 Fast RCNN이 효율적인 이유는 큰 Receptive Field 의 RoI가 아닌
Hierarchical Sampling을 통해서 RoI 를 뽑기 때문이라 합니다 .
전체 R개의 RoI sampling 을 N개의 이미지에서 뽑아내는 방법입니다.
예를들어 N개의 이미지에서 R개의 RoI sampling 을 뽑을 수 있는데, R=128, N=2라면,
한 이미지에서 128/2 = 64 개의 RoI 를 뽑을 수 있고 이는 128개의 다른 image 에서
하나의 RoI 를 뽑는 방식보다 대략 64배 빠르다고 주장합니다.
그리고 softmax classifier 과 bounding-box regressor를 함께 최적화 하는 one-finetuning stage로 학습한다 합니다.
(이 때는 classifier, regressor 등을 여러 stage로 학습을 하였습니다.)
Multi-task Loss
이 섹션이 드디어 Fast RCNN 의 loss에 대하여 다룬 section 입니다.
RCNN 과는 다르게 update를 할 수 있어서 조금 달라졌고, Faster RCNN과 그 이후의 논문에도 영향을 미쳤기 때문에
한번쯤은 정리 해 두는것을 추천드립니다. 전체 loss function 은 다음과 같습니다.
여기서 L(p, u, t^u, v) 가 나타내는것이 전체 loss 입니다.
빨간 밑줄 (p, t^u)은 network 의 outputs 들이고, 파란밑줄(u, v)는 Ground Truth 를 나타냅니다.
그리고 (1) 식 은 Cross Entropy, (2) 는 Iverson bracket ([u>=1] [] 내부의 조건이 맞으면 1 그렇지 않으면 0)
(3) 은 soomth L1 loss 입니다.
여기서 주목해야 할 점은 selective search 알고리즘으로 추출한 k개의 제안(proposal) box 가 있다는 것입니다.
이를통해 다음 값들이 갖는 의미를 알 수 있습니다.
p : 각 제안 box 가 어떤 class 일지를 softmax 를 이용해서 0~1 사이로 만든 network output! - [k, class 갯수 + 1]
u : 각 제안 box 가 갖는 ground truth class (iou가 0.5 이상인 값을 1로 만든 class label) - [k]
t^u : 각 제안 box (P) 와 network output (G*) 를 다음과 같은 관계로 계산한 target 값! - [k, 4]
v : 각 제안 box (P) 와 ground truth box (G) 를 다음과 같은 관계로 계산한 target 값! - [k, 4]
정리하자면, Fast RCNN은 proposal box 의 class 와 간접적인 box 좌표의 값을 나타내는 target을
Cross Entropy Loss / Smooth L1 loss 로 표현하고 이값을 최적화 시키는 방향으로 학습을 합니다.
Mini-batch sampling
논문에서 가장 간지러운(?) 부분인 mini-batch sampling 의 부분입니다.
보통 image processing 에서 mini-batch 를 이용한다고 하면
batch 처리 즉 일괄처리를 위해서 N 개의 image와 그에 상응하는 B개(set) 의 처리를 뜻합니다.
여기서는 batch의 단위가 image가 아니라, RoI Sampling의 갯수입니다.
먼저 이미지가 들어가면 selective search 알고리즘에 의해 각 image 당 2000개의 proposal 을 뽑아냅니다.
그것이 RoI pooling 을 통해서 RoI(region of interest) 를 뽑아냅니다.
이때, N과 R에 의해서 N장의 image에서 R개의 RoI 를 뽑습니다.
N : image 의 갯수
R : RoI 의 갯수
N = 2, R = 128
R / N = 128 / 2 = 64
즉 64개의 RoI 를 1장의 image에서 sampling 합니다.
여기서 25%(16장) 은 GT box와의 IoU 가 0.5 이상인 [u >= 1]
그리고 75%(48장) 은 GT box와의 IoU가 [0.1, 0.5)인 [u == 0] 조건을 적용합니다.
이렇게 64개의 mini-batch를 구성하고 학습을 진행합니다.
The result of VOC datasets
마지막으로 voc dataset에 대한 성능을 보겠습니다.
논문의 발표를 기준으로 매우 빠르고, 그리고 성능까지 좋은 모습을 볼 수 있습니다.
각 dataset 에 따라 (68~70) 정도의 성능을 보입니다.
RCNN에 비해 성능이 모두 높은 것을 볼 수 있습니다.
마치며..
ICCV2015에서 발표된 Fast R-CNN 를 한번 보았습니다.
처음에 언급한것과 같이 RoI pooling의 idea, Loss등을 중점적으로 보시면 좋을 것 같습니다.
의견과 질문은 항상 환영합니다.
감사합니다. 😎😎😎😎😎😎
'Object Detection > RCNN Detection' 카테고리의 다른 글
[Object Detection] Faster R-CNN DETR PAPER처럼 성능높이기(AP-39.0) (1) | 2023.06.27 |
---|---|
[Object Detection] Faster R-CNN (NIPS2016) 진행과정 및 코드구현 (0) | 2022.06.01 |
[Object Detection] Faster R-CNN (NIPS2016) 엄밀한 리뷰 (1) | 2022.04.25 |
[pytorch-torchvision] RoI Pooling 이해하기 및 예제 구현 (0) | 2022.04.22 |
[Object Detection] R-CNN Follow-Up (0) | 2022.01.04 |
댓글