[Image Object Detection] R-CNN 리뷰
Contents based한 추천 알고리즘 설계 방법에는 크게 정형 데이터와 비정형 데이터를 이용하는 방법이 있다. 최근 관심있게 보고 있는 것이 비정형 데이터인데, 비정형 데이터의 대표격인 Image feature를 이용한 CB 방식을 공부중이다. 이미지 쪽은 학생 시절 Image Search를 가라(?)로 구현해 본 이후 한번도 들여다 본 적이 없기에 이번 기회에 제대로 공부해야 할 필요성을 느꼈다. 그 중에서도 Object detection에 대해 천천히 논문 리뷰를 진행하면서 이미지에 대한 공부를 진행할 요량이다. 개인적으로 빠른 공부에 가장 좋은 것은 SOTA 방식의 접근법을 역추적하며 히스토리에 대해 공부하는 방법이라고 생각한다. 그래서 첫 번째 리뷰할 논문은 R-CNN에 관한 논문으로 선정하였다.
(본 포스팅은 논문에 대한 매우 개인적인 소감과 공부내용을 적은 것이며, 다른 참고 페이지 URL은 게시물 하단에 기재하였음.)
Rich feature hierarchies for accurate object detection and semantic segmentation
이미지 내에서 Object를 Detection 하는 문제는 컴퓨터 비전에서 아주 오래된 문제다. 전통적으로 사용되던 방법은 sliding window 방법으로 이미지를 쓸어내리며 스캔을 한 뒤, 각 영역에서 물체를 검출하는 방법이 있다. 혹은 SIFT, SURF, HOG와 같은 descriptor, 키포인트(흔히 HOG-like feature라고 부른다)를 추출하여 magnitude를 이용해 bounding box에 활용하는 방법도 있고, 이 외에도 분야마다 다른 수 많은 방법이 존재한다. 이를 관통하는 핵심은, 영역을 나누어 greedy하게 추출하거나 특징점을 기반으로 추출한다는 것이다. 한때의 SOTA, DPM(Deformable Part Models) 이라고 불리는 방법이 이런 아이디어들을 기반으로 한다.
Object detection은 image classification과 분리할 수 없는 관계이다. detection된 물체가 무엇인지 아는 문제, 그리고 object를 검출하는 문제 자체에서도 classification이 사용되기 때문이다. static한 상황에서의 이미지의 경우에는 정확도만 있으면 되지만 영상 이미지의 경우는 실시간 처리때문에 속도가 매우 중요하다. 그래서 대부분의 object detection은 ‘더 정확하게’도 중요하지만 ‘더 빠르게’에 어느정도 초점이 맞춰져 있었다. 하지만 최근의 연구를 보면 더 정확하고 빠르게가 제대로 진행되고 있는 느낌이다.
본 포스팅 시리즈(Image object detection paper review)는 이전 방식의 object detection이 아닌 근래의 접근법인 Region Proposal 기반 detection 방법과 YOLO 모델에 대해 알아볼 것이다. 이 방법들을 사용하면, 더 정확하고 빠른 이미지 detection과 segmentation이 가능하다.
R-CNN
CNN 모델을 단순한 분류기 이상으로 활용한 것이다. ImageNet에서 스타가 된 이후로 CNN은 이미지 분류기 모델에서 굳건히 SOTA의 지위를 유지한 모델이다. Object detection에 CNN이 사용되기 시작한 것은 그만큼 이미지 분류와 detection(혹은 segmentation)은 밀접한 연관이 있기 때문이다.
R-CNN(Regions with Convolutional Neural Networks)은 처음으로 CNN과 같은 딥러닝 기반 이미지 분류기를 feature extractor로 사용하여 object detection, segmentaion에 높은 성능을 보인 예시이다. 최초의 R-CNN 논문에서의 문제 정의는 다음과 같다.
1) Localizing objects with DNN
2) Training a high-capacity model with small quantity of annotated detection data
이 문제 정의를 보면 저자가 해결하고자 했던 문제를 알 수 있다. 아마도 완전히 새로운 방식을 만들어 낸다기 보다는 뉴럴넷 구조의 detection feature extractor를 만들어 내려고 했던 것 같다. 문득 학교에서 Computer vision 수업을 들었을 때가 떠올랐다. 비전 영역에서도 딥러닝이 활발히 활용되고는 있지만, 아직까지 패러다임을 바꾸는 정도의 연구가 진행되지는 않았다는 교수님의 말씀. 단지 교수님의 사견일지도 모르지만, 어느정도는 나도 동의하는 바이다.
이제 본격적으로 R-CNN의 아이디어를 살펴보자. R-CNN의 기본적인 아이디어는 컴퓨터 비전에서의 이전 방법과 유사하다고 할 수 있다. 방법은 크게 3단계로 나뉜다.
1) Region proposal algorithm
대상의 class를 구분하지 않고 이미지로부터 region을 추출해내는 과정이다. 어떤 알고리즘을 사용하던지 상관 없고, 이미지로부터 후보 region을 제대로 발라내기만 하면 된다. 논문에서 사용한 방식은 Selective search 방법이다. Selective search 방법은 비슷한 질감이나 색, 강도를 가진 인접한 픽셀들을 연결하여 바운딩 박스를 구성하는 방법이다(참고 : http://www.cs.cornell.edu/courses/cs7670/2014sp/slides/VisionSeminar14.pdf). 이 방법으로 생성한 바운딩 박스의 output을 다시 CNN 레이어의 인풋으로 활용하게 되고, input으로 변환하는 과정에서 압축(warp)을 하게 된다.
2) CNN : feature vector extract
앞 단계에서 생성한 region을 압축한 input으로, pre-trained 된 CNN 모듈에 통과시켜 새로운 피처를 생성한다. 당연하게도 도메인의 특성에 맞는 dataset을 거쳐 튜닝 과정을 거치는 것이 좋다. 논문에서는 AlexNet, VggNet을 기반으로 튜닝 과정을 거친 CNN 모델을 사용하였다. 그리고 기존의 CNN Classifier에서 최종 softmax(혹은 다른 분류기) 분류기 부분을 제외한 output을 결과물 feature로 사용한다. 이해를 위한 예를 들자면, Kaggle이나 국내 데이터 분석 대회용 데이터 파일들을 보면 정체를 알 수 없는 image feature들이 존재하는 경우가 있는데 대부분은 이 feature를 나타낸다는 것이 그 예이다. 이 결과물을 논문에서는 fixed-length feature vector라고 부른다.
3) Classify Algorithm
Fixed-length feature vector를 input으로 하는 분류기를 마지막으로 달아준다. 요약하자면 Region proposal 단계에서 생성된 object를 CNN 레이어에 통과시켜 fixed-length feature vector로 변환한다. 그리고 이 input값을 바탕으로 객체인지 아닌지, 맞다면 어떤 객체인지를 분류하는 것이다. 이 단계를 나눠 놓은 이유는 도메인 목적에 맞는 분류기를 설정하고, 유효한 영역인지에 대해서만 판별하기 위해서이다. 즉, 3가지 단계의 모듈이 각각 명확한 목적성을 가지고 나눠져 있는 것이다. 다만 논문에서는 각 class별로 객체가 맞는지, 틀린지의 여부만을 판단하는 SVM linear classifier를 사용하였다.
4) Bounding Box 개선 문제
이 단계는 결과물을 더 완벽하게 하기 위해, region proposal 단계에서 더욱 타이트한 bounding box를 만들자는 단계이다. 필수적인 단계는 아니지만 만약 수행한다면 성능을 꽤 높여줄 수 있는 방법이라고 논문에서는 언급한다. 이 방법은 단순히 regression을 사용하는 것이기 때문에 다음의 이미지와 같이 간단하게 요약될 수 있다(출처 : https://www.quora.com/Convolutional-Neural-Networks-What-are-bounding-box-regressors-doing-in-Fast-RCNN).
R-CNN을 위한 트레이닝 데이터셋에서, bounding box를 나타내는 annotaion 정보가 아래와 같다고 하자. 그러면 이 결과를 정답으로 활용하여, selective search의 좌표값과 CNN의 output을 데이터로 사용하는 regressor를 만든다는 것이다.
1 200 200 314 300 (class index, x_pos, y_pos, x2_pos, y2_pos)
5) 요약
지금까지의 과정을 그림으로 나타내면 다음과 같다.
논문의 나머지 내용은 실험에 대한 자랑이나 결과 정도이다. 이쯤에서 R-CNN을 코딩해볼까 생각했지만 사실상 deprecated 된 알고리즘이라고 볼 수 있고, 동일 방법의 뛰어난 개선안(Fast R-CNN, Faster R-CNN)들이 있기 때문에 생략하기로 하였다. 후행 연구의 SOTA까지 리뷰를 마친다면 해볼 필요가 있을 것 같다.
참고 URL
- 루닛 테크블로그 : https://blog.lunit.io/2017/06/01/r-cnns-tutorial/
- 블로그 : https://junn.in/archives/2517
- R-CNN paper : https://arxiv.org/pdf/1311.2524.pdf