2-Stage Detector
2-Stage Detector란?
Object Detection = Localization + Classification
→ 두 가지의 task를 분리하여 2 stage로 따로 수행
- Stage 1: 이미지 내에서 object가 있다고 판단되는 위치 찾기 (Region proposal)
- Stage 2: 각 위치에 있는 object의 종류 판단 (Classification)
![](https://velog.velcdn.com/images/pluto_0905/post/06676843-9313-4980-9089-8ca2896e3531/image.png)
2-Stage Detector의 발전 흐름
![](https://velog.velcdn.com/images/pluto_0905/post/cbd9f16c-3774-4109-b76b-4fe9ef900136/image.png)
R-CNN
- 2-stage detector의 최초 모델
- Region proposals + CNN
![](https://velog.velcdn.com/images/pluto_0905/post/9a5abb31-41cf-4f88-b3c4-a97c34dc7ccd/image.png)
Sliding Window
고정된 크기의 window를 이미지 내에서 sliding하면서 객체의 위치를 찾아내는 방법
- 계산 비용이 높고 속도가 매우 느림
- 고정된 크기의 window
![](https://velog.velcdn.com/images/pluto_0905/post/703f9bbe-ab9b-45a2-8562-380ea8dd69e1/image.png)
Selective Search
- 초기에 매우 작은 픽셀 단위의 region을 잡고, 유사성이 높은 region들을 점차적으로 병합해나가는 방법
- 색상, 질감, 경계 등을 기준으로 유사성이 높은 region을 병합
- Sliding window의 두 가지 단점 해결(계산 resource, 고정된 크기의 window)
![](https://velog.velcdn.com/images/pluto_0905/post/17b50d56-8676-4b90-b96c-39a534ce6f0c/image.png)
R-CNN Pipeline
-
Input image에서 selective search를 통해 약 2000개의 RoI(Region of Interest) 생성
-
각 RoI 영역을 모두 동일한 크기로 warping
- 이후에 통과할 CNN의 마지막 fc layer의 input size가 고정되어 있기 때문
- 조정된 RoI를 각각 CNN에 넣어서 feature 추출 (2000x4096)
- Region마다 4096-d의 feature vector로 추출
- Pretrained AlexNet 사용
![](https://velog.velcdn.com/images/pluto_0905/post/a52c8c2f-bed6-4822-99bc-0e4033db5ff9/image.png)
4-1. 추출된 feature vector를 SVM에 넣어서 각 RoI(region of interest)의 object에 대한 classification (2000x(C+1))
- C+1: class 개수(C) + background(1)
![](https://velog.velcdn.com/images/pluto_0905/post/a49e17d3-4212-42d9-bd59-f550dc387b05/image.png)
4-2. 추출된 feature vector를 regression을 통해 각 RoI의 bounding box 위치 조정 ● Selective search의 부정확한 bounding box 위치 조정
![](https://velog.velcdn.com/images/pluto_0905/post/f2d7d8dd-3f51-4430-92a5-394cd48bb1ff/image.png)
Fast R-CNN
R-CNN의 단점
- 약 2000개의 RoI 각각에 대해 CNN 연산 → 연산량이 많고 속도가 매우 느림
- 모든 RoI를 동일한 사이즈로 맞추기 위해 이미지를 crop/resize하는 과정 필요 → 성능 저하
- Stage2의 모델(CNN, SVM, bbox reg) 모두 따로 학습
Fast R-CNN
- 단일 CNN을 통해 연산량 감소
- RoI projection 모듈을 통해 CNN 연산을 줄이고 속도를 개선한 모델
- RoI pooling 모듈을 통해 이미지 사이즈 강제 조정하는 과정 제거
![](https://velog.velcdn.com/images/pluto_0905/post/5b687bfd-b9cc-4440-b884-6f5c9b08cfd6/image.png)
RoI Projection의 등장 배경
- R-CNN에서는 2000개의 RoI를 뽑고, 이후 CNN에 통과 (2000번의 CNN 연산)
- → CNN을 한번만 통과하여, feature vector를 얻을 수 있을까?
- Feature map을 한번만 추출하고, 그 위에서 RoI 위치에 맞는 feature vector를 추출하자!
- CNN 연산 2000번 → 1번
![](https://velog.velcdn.com/images/pluto_0905/post/d26787f5-153b-4ba6-896c-8f1874b51eb2/image.png)
RoI Projection이란?
- CNN 연산 이후, feature map의 사이즈가 변할 수 있음
- 사이즈가 변한 feature map에 RoI를 투영하는 과정
![](https://velog.velcdn.com/images/pluto_0905/post/834bcc45-8295-4542-8fae-6931917e8247/image.png)
RoI Pooling
RoI Pooling의 등장 배경
- CNN을 먼저 통과하기 때문에 RoI를 crop/resize하는 과정 없음
- Fc layer의 input으로 들어가기 전에 feature vector 크기를 조정해야 함
![](https://velog.velcdn.com/images/pluto_0905/post/acd1f701-1533-46f5-8b08-d55ea56922d0/image.png)
RoI Pooling
어떤 크기의 feature map이 들어와도 동일한 사이즈로 pooling하고자 하는 방법
- RoI를 지정된 size(WxH)에 맞추기 위해 그리드 설정 (66→22 / 46→22)
- 설정된 각 그리드에서 max 값을 가져와서 최종적으로 같은 size로 통일
![](https://velog.velcdn.com/images/pluto_0905/post/986ca247-63ef-4ef9-9798-30d37a5587c7/image.png)
Fast R-CNN Pipeline
1-1. Input image에서 selective search를 통해 약 2000개의 roi 생성
1-2. 단일 CNN 연산으로 전체 feature map 생성
2. RoI projection, RoI pooling으로 각 RoI에 맞는 고정된 사이즈의 feature vector 생성
3. 추출된 feature vector에 대해 linear, softmax 연산 수행
- 이후, 각 RoI의 object에 대한 classification과 Bounding box regression 수행
![](https://velog.velcdn.com/images/pluto_0905/post/85b03e14-c981-4c01-8233-103fa87af279/image.png)
Faster R-CNN
R-CNN, Fast R-CNN의 단점
- 픽셀 단위부터 영역을 병합하는 selective search는 GPU와 CPU 연산이 모두 필요하며 매우 느림
- GPU에서만 연산하는 network와 분리되어 end-to-end 학습이 불가능
Faster R-CNN
- Selective search를 제거하고 Region Proposal Network(RPN) 모듈을 사용하여 연산을 더 가속화한 모델
- 전체 프레임워크가 한번에 연산되는 end-to-end 모델
![](https://velog.velcdn.com/images/pluto_0905/post/a7bee801-218d-494b-9662-a45395591b9b/image.png)
Region Proposal Network (RPN) 이란?
- GPU에서만 연산하여 RoI를 찾는 network를 만들자!
- 미리 지정된 크기의 anchor box를 이용하여 roi search
![](https://velog.velcdn.com/images/pluto_0905/post/419a20ed-b624-4a11-a536-7d2d45653a26/image.png)
Region Proposal Network (RPN) 동작 과정
- CNN을 통해 얻은 feature map을 input으로 받아서 intermediate layer 생성
- 33256 또는 33512 convolution 사용
- Intermediate layer의 feature map을 입력받아 classification
- 1118 convolution: 2(object 여부) x 9(anchor의 개수)
- Intermediate layer의 feature map을 입력받아 bounding box regression
- 1136 convolution: 4(bbox의 좌표) * 9(anchor 개수)
![](https://velog.velcdn.com/images/pluto_0905/post/bb657399-fa71-439f-82ed-fd0cf493ad9a/image.png)
Non-maximum Suppression (NMS)
RPN으로 생성된 RoI 중에서 유사한 bounding box들을 제거하기 위해 사용
![](https://velog.velcdn.com/images/pluto_0905/post/ef397ebb-6be3-459d-be77-8a72c7578d52/image.png)
Faster R-CNN Pipeline
- CNN을 통해 전체 feature map 추출
- 생성된 feature map을 RPN, NMS 연산 후 RoI 생성
- RoI projection, RoI pooling을 통해 모든 RoI를 동일한 사이즈로 변환
- Softmax + bounding box regression 동시에 수행 (multi-task 학습)
![](https://velog.velcdn.com/images/pluto_0905/post/a3e9b466-7909-4cb6-a9ef-c73ab74a8f53/image.png)
![](https://velog.velcdn.com/images/pluto_0905/post/9ecad54b-0880-4172-82b0-fedc91223120/image.png)