01. R-CNN
➰ R-CNN의 작동원리
1️⃣ Input 이미지를 가지고 CPU상에서 selective search를 진행하여 물체가 존재할 것 같은 지역(ROI)을 2000개 정도 뽑아낸다.
2️⃣ 이렇게 뽑아낸 ROI(Refions Of Interest)들은 각각 다른 크기와 위치를 가진다. 때문에 이를 corp & warp 하여 CNN에 들어가기 좋은 정사각 형태로 만든다.
3️⃣ 각각의 ROI들을 ConvNet으로 돌려 feature vector를 추출한다.
4️⃣ 추출된 feature vector들을 SVMs을 이용하여 어떤 클래스에 해당되는지, 그리고 Regressor를 이용하여 정확한 물체의 위치가 어딘지 bounding box를 조절한다.
✔️ 위의 단계를 조금 더 구체적으로 보자면,
1) 모델을 처음부터 training시키는것 보다는 위의 모델처럼 미리 학습되어있는 모델을 가져와서 사용하는 것이 더 낫다.
2) 기존에 학습되어있는 모델은 1000개의 클래스를 분류하는 모델이었는데, 지금 우리에게는 21개(20개의 object와 1개의 background)의 클래스가 필요하다고 가정해보자. 이때 위의 그림에서처럼 기존 모델의 마지막 fully connectec layer(파란색 표시)를 제거하고 우리가 원하는 형태로 바꿔주면 된다. (4096*1000에서 4096 *21로 바꿈)
3) 그다음으로는 feature를 추출하는데, 먼저 region proposal들을 추출한 다음, 각각의 region들을 CNN에 input으로 들어가기 좋게 crop + wrap 시킨다. (기본적으로 CNN의 input으로는 동일한 높이 *너비를 가지는 이미지를 넣어야 하기 때문) 그다음 CNN에 넣어 돌리면 되는데, 이때 feature들을 디스크에 저장하기 때문에 디스크의 사이즈가 꽤 커야 한다.(~ 200GB)
4) 클래스 당 1개의 binary SVMs을 이용해서 분류한다. 즉 각 클래스에 대해 독립적으로 훈련된 이진 SVM을 사용한다. (고양이 클래스에 대한 분류기/ 강아지 클래스 분류기 등) 예를 들어, 위의 그림에서 고양이를 분류하는 SVMs을 가지고 각 feature마다 '이건 고양이가 맞다/아니다'를 분류해내는것이다. 고양이 분류가 끝나면 강아지(클래스)에 대해서도 SVMs을 적용하여 '이건 강아지야/ 아니야'를 분류해낸다.
5) 마지막으로, region proposal이 항상 정확할 수 없기 때문에 각 feature들에 regression을 이용해서 region proposal의 정확도를 높여주는 작업이 필요하다. 위의 그림을 보면, 첫번째 그림은 고양이가 있는 위치를 잘 맞게 proposal 했다. 두 번째 그림을 보면 고양이가 있는 위치보다 조금 더 왼쪽까지 region proposal 되어 있기 때문에 해당되는 bounding box를 조정해서 고양이가 있는 위치에 잘 맞게 조정해주는 작업이라고 생각하면 된다. 이렇게 조정해주면 mAP(mean Average Precision)이 3~4% 정도 증가되는 효과를 얻을 수 있다.
➰R-CNN의 문제점
1️⃣Test time이 매우 느리다. 모든 ROI를 CNN에 넣어야 하기 때문에 2000번의 CNN연산이 필요하다. 때문에 training과 testing 과정에서 많은 시간이 필요하다.
2️⃣SVMs과 Regressor가 오프라인으로 training되어 CNN이 이에 즉각적으로 업데이트가 안된다. 즉, 전체 아키텍처에서 SVM, Regressor 모듈이 CNN과 분리되어 있다(CNN은 feature만 추출하고 고정되므로 SVM과 Bounding Box Regression는 따로 동작한다). CNN은 고정되어 있기 때문에 SVM과 Bounding Box Regression까지 forwarding 한 뒤, CNN feature extractor를 업데이트 할 수 없다.(다시 말해 end-to-end 방식으로 학습할 수 없다.) 때문에 정확도가 낮다.
3️⃣ 다단계의 training pipeline을 가져 복잡하다.
02. Fast R-CNN
R-CNN의 한계점을 보완하기 위해 Fast R-CNN이 등장하게 되었다. Fast R-CNN의 기본적인 아이디어는 CNN을 돌리는것과 region을 추출하는 순서를 바꾸자! 는 것이다. 이렇게 순서를 바꾸게 되면, 고해상도의 Conv feature map이 생성되는 효과를 얻을 수 있다.
1️⃣ input 이미지에 대해 ConvNet을 돌린다.
2️⃣ 생성된 feature map을 가지고 region proposal method를 통해 ROI를 추출한다.
3️⃣ 추출 된 ROI를 ROI pooling기법을 이용하여 각각의 region들에 대해 feature에 대한 정보를 추출한다.
4️⃣ fully connected layer로 넘어간다.
5️⃣ 마지막으로 classification과 regression을 진행한다. R-CNN에서는 여러 개의 클래스가 존재하는 상황에서 각각의 클래스에 대해 binary SVMs을 사용했지만, Fast R-CNN은 기본적인 CNN network를 이용해서 Softmax layer를 거쳐 각 클래스에 대한 확률 값을 구한다는 점에서 차이가 있다.
➰ROI pooling
Fast R-CNN에서 가장 중요한 개념인 ROI pooling에 대해 알아보자. 기본적으로 분류를 위해 fully connected layer를 이용해야 하고, fully connected layer의 input으로는 고정된 크기의 벡터가 들어가야 한다. 항상 고정된 크기의 feature vecter를 뽑기 위해 각 ROI영역에 Max pooling을 적용하는 것을 ROI pooling이라고 한다. 예를 들어 오른쪽과 같이 2 *2의 고정된 feature vector를 추출하는 경우, 왼쪽과 같은 ROI feature map이 2 *2로 적절히 나누어지도록 설정한다. 이때 activation 영역이 최대한 같은 비율로 나눠질 수 있도록 한다. 그다음 나누어진 각 영역마다 max pooling을 적용(즉, 각 영역 중 가장 큰 값만 뽑아내는 것)하는 것이다.
❔그렇다면, Fast R-CNN이 기존의 R-CNN의 한계점을 어떻게 해결하는가?
☑️R-CNN의 문제점1) 각 region들이 CNN의 forward pass를 거쳐야 하기 때문에 test time시 느리다.
〰️해결) region proposal을 선택하기 전에 convolution을 돌림으로서 computation을 share 하여 매우 빠르게 동작 가능!
☑️R-CNN의 문제점2) training시, classifier와 regression이 오프라인으로 training 되어 CNN이 이에 즉각적으로 업데이트할 수 없으며, training의 pipeline이 복잡하다.
〰️해결) 전체 시스템을 end-to-end로 한꺼번에 training시킨다.
03. Faster R-CNN
R-CNN과 Fast R-CNN 모두 CPU에서 region proposal을 진행하기 때문에 속도가 매우 느리다(기본적으로 selective search가 CPU상에서 돌아가도록 라이브러리가 설계되어있기 때문). Faster R-CNN은 이러한 점을 보완하기 위해 region proposal을 위한 모든 연산을 GPU상에서 진행하는 RPN(Region Proposal Network)를 제안한다 (Faster R-CNN의 핵심 아이디어!). RPN은 region proposal을 진행하는 network로, feature map을 보고 어느 곳에 물체가 있을법한지 예측하며, selective search의 시간적인 단점을 해결하는방법이다. 학습이 이루어 진 다음 GPU상에서 한번의 forwarding만 수행하면 바로 어느곳에 물체가 있을법한지 예측할 수 있기 때문에 훨씬 빠르게 작동한다. 그다음 Fast R-CNN에서 사용하는 detection network의 구조를 그대로 사용해서 각 물체와 그 물체가 존재할법한 위치에 대해 classification과 regression을 진행한다. 쉽게 말해, Faster R-CNN은 기존의 Fast R-CNN에서의 selective search를 RPN으로 바꿔서 모든 과정을 end-to-end로 학습하는 것이라고 생각하면 된다.
다시 정리하자면,
1️⃣ input 이미지를 VGG기반의 network로 feature를 추출한다.
2️⃣ 그렇게 얻은 feature map에 RPN을 적용하여 물체가 있을법한 위치를 찾는다.
3️⃣ 그렇게 RPN이 알려준 위치정보를 가지고 detector(즉, 여기서 classifier / regressor)는 기존의 Fast R-CNN의 구조를 따르면서 RPN network가 알려준 위치를 중심으로 classification과 regression을 진행한다.
4️⃣ 이렇게 되면 물체가 있을법한 위치를 구하는 과정을 GPU에서 수행할 수 있기 때문에 속도가 빨라질 뿐만 아니라 feature map을 공유한다는 점에서 성능 향상, end-to-end방식(output부터 input까지 back propagation을 통해 gradient를 계산)으로 학습 가능하다는 장점이 있다.
➰RPN(Region Proposal Networks)은 어떤 방식으로 작동하는가?
RPN 네트워크는 feature map을 입력으로 받아 물체가 있을법한 위치를 예측한다. 이때 다양한 형태와 크기를 가지는 사물을 잘 예측할 수 있도록 K개의 서로 다른 앵커 박스(anchor box)를 이용한다.
1️⃣ feature map에 슬라이딩 윈도(sliding window)를 이용해 각 위치에 대한 intermediate feature를 뽑고,
2️⃣ 그것을 가지고 regression과 calssification을 수행한다. 단, RPN은 단순히 물체가 있을법한 위치를 proposal 하는 목적으로 사용되기 때문에 전체 클래스의 결과가 아닌, 물체가 있는지/없는지 에 대한 여부만 출력한다.(예를들어, 이건 사람이고 저건 고양이야! 가 아니라 이 위치에는 물체가 있어/없어의 형태로 분류 진행)
📌 R-CNN / Fast R-CNN / Faster R-CNN 장단점 분석
🖇참고문헌
-https://www.youtube.com/watch?v=nDPWywWRIRo
-https://www.youtube.com/watch?v=jqNCdjOB15s