DeepFisheye 네트워크를 개선하는 작업을 하고 있었고 그 일환으로 hand detect를 하는 네트워크를 만들어야 했다. 이를 위해서 이미지에서 hand 부분을 segment 하는 만들려고 시도 했다. 굉장히 naive 하게 네트워크를 만들어서 시도해 보았는데 문제가 있었다.
DeepFisheye 네트워크는 가상 이미지 데이터로 학습을 시키고 이를 실제 이미지들에 대해서 동작 하도록 만들어야 한다. 그런데 가상 이미지에 대해서 학습은 잘 되는데 실제 이미지에서 네트워크가 잘 동작을 하지 못했다. 어떻게 보면 overfit 을 하는 것이다. 처음에는 가상 이미지와 실제 이미지 사이의 갭이 너무 커서 그렇다고 생각을 했다. 그러다가 ‘네트워크가 너무 쉽게 overfit 하게 되는 구조는 아닐까?’ 라는 생각이 들었고 관점을 네트워크 구조로 옮겨 보았다. 이어서 object detection/segmentation 관련 논문들을 찾아 보았고 이 논문들에서 이야기를 하는 구조를 응용하니, 성능이 매우 개선 되는 것을 관찰 하였다. 더 자세히는 Region-based CNN (R-CNN) 에 대해서 살펴 보았다.
이 기회에 R-CNN에 대해서 공부를 더 해보자는 생각이 들었고 R-CNN의 시작이 되는 논문부터, Mask R-CNN 논문까지 읽어보고 간단히 정리를 해보자 생각 했다.
이 글에서 다루는 내용들은 다음과 같다. 단, Evaluation에 대한 부분은 거의 다루지 는다.
R-CNN이 풀려고 하는 문제는 object detection 이다. 이는 이미지 상에서 물체의 bounding box 를 찾고, 그 물체가 어떤 물체인지 맞추는 것이다. 일반적으로 CNN들은 전체 이미지에서 feature를 뽑아 냈다. 하지만 R-CNN은 이름에서도 알 수 있듯이, 이미지의 일부에서만 feature 를 뽑아낸다.
ref: https://arxiv.org/pdf/1311.2524.pdf
R-CNN의 프로세스는 다음과 같다. 먼저 물체가 있을 법한 영역들을 찾아낸다 (potential regions). 그리고 그 영역들을 crop 한 후에 특정 사이즈로 변환을 하고, CNN을 통해서 feature를 뽑는다. 그리고 그 feature를 가지고 class를 맞춘다. R-CNN에서는 classification을 위해서 SVM을 사용 했다.
그러면 potientail regions는 어떻게 찾아낼까? 이는 selective search 라는 방법을 사용 하는데, 이는 data-driven 방식이 아닌 low level image feature 들을 사용하는 알고리즘이다. 이후 네트워크들에서 잘 쓰이지 않기 때문에 여기에서 자세히 다루지는 않는다.
Fast R-CNN은 다음과 같은 세 가지의 R-CNN의 문제를 해결 하고자 한다.