카테고리 없음

RCNN Image Classification 첫단계 Selective Search에 관해서

coding art 2022. 2. 5. 15:30
728x90

Step-by-Step R-CNN Implementation From Scratch in Python

https://towardsdatascience.com/step-by-step-r-cnn-implementation-from-scratch-in-python-e97101ccde55#:~:text=R-CNN%20stands%20for%20Regions%20with%20CNN.%20In%20R-CNN,we%20need%20to%20just%20classify%20first%202000%20regions.

 

R-CNN 은 그 내용이 길고 복잡하므로 여기서는 일차적으로 선택적 검색 즉 Selective Search  단계 까지만 우선 알아보기로 하겠다.

 

객체 인식은 이미지에 포함되어 있는 객체들을 찾는 작업으로서 확률적으로 인식률을 계산한다.

 

반면에 물체 감지와 로컬화는 그 이미지에서 그 물체를 인식 후 어디에 있는지 찾아내는 작업이다. 객체 감지는 이미지에서 물체의 좌표 위치까지 찾아야 하므로  단순한 객체 인식 보다 해결해야 할일이 더 많은 복잡한 문제이다.

 

2014년에 Ross Girshick, Jeff Donahue, Trevor Darrell 및 Jitendra Malik가 이 문제 해결을 위해서 R-CNN 알고리듬을 소개하였다. R-CNN은 Regions with CNN을 의미한다. R-CNN에서는 수많은 영역에 대해 classification 작업을 실행하는 대신 선택적 검색(Selective Search)을 통해 2000개 수준의 영역 제안을 도출하고 이에 대해 분류를 실행한다. 따라서 수많은 영역을 분류하는 대신 제안된 2000개 영역만 분류하면 되는 것이다.

 

R-CNN 은 다음과 같은 단계를 밟게 된다.

   1. 이미지를 Selective Search 를 통해 2000개 수준의 영역 제안(region proposal)을 도출한다. (Selective Search는

     이미 OpenCV에 해당 명령어가 있다.)

   2. 각각의 제안된 영역별로 GTD(Ground Truth Data)에 대한 IOU(Intersection over Union) 를 계산한다. 이 작업도

      Selective Search 과정에서 내부적으로 계산된다.

   3. 각 영역 제안별로 Transfer Learning 에 의해서 CNN 및 Fully Connected 네트워크를 적용하여 각 영역 제안들에

      대한 클라스 확률값을 계산한다. 

grounf truth data 란?

이미지 내에 포함된 객체들의 완전한 데이터를 뜻한다. 만약 ground truth data가 부정확하면 이를 근거로 계산되는 IOU 를 비롯하여 이미지 분석을 위한 파생 데이터들의 정밀도가 떨어지게 된다.

 

 

참조: Selective search for object detection(C++ & Python)

https://learnopencv.com/selective-search-for-object-detection-cpp-python/

 

선택적 검색: Selective Search

 

객체 인식 알고리즘은 이미지에 어떤 물체가 있는지 식별한다. 이미지 전체를 입력으로 사용하고 해당 이미지에 포함되어 있는 객체의 클래스 레이블 및 클래스 확률을 출력한다. 예를 들어, 클래스 레이블은 "개"일 수 있고 연관된 클래스 확률은 97%일 수 있을 것이다.

반면에 객체 감지 알고리즘은 이미지에 어떤 객체가 포함되어 있는지 알려줄 뿐만 아니라 경계 상자(x, y, 너비, 높이)를 출력하여 이미지 내부의 객체 위치를 나타낸다.

모든 객체 감지 알고리즘의 핵심은 객체 인식 알고리즘이다. 이미지 패치에서 개를 식별하는 객체 인식 모델을 학습했다고 가정하자. 따라서 이 모델은 이미지에 개가 포함되어 있는지 여부만을 알려주지만, 그 객체가 어디에 위치하고 있는지 알려주지는 않는다.

객체를 로컬화하려면 이미지의 하위 영역(패치)을 선택한 다음 이러한 이미지 패치에 객체 인식 알고리즘을 적용해야 한다. 객체의 위치는 객체 인식 알고리즘에 의해 반환되는 결과 중 클래스 확률이 가장 높은 이미지 패치의 위치로 지정된다.

 

더 작은 하위 영역(패치)을 생성하는 가장 간단한 방법은 슬라이딩 창 접근 기법이다. 그러나 슬라이딩 윈도우 기법에는 몇 가지 제한 사항이 있는바 이러한 제한은 "영역 제안" 알고리즘이라고 하는 일종의 알고리즘에 의해 극복할 수 있다. 선택적 검색(Selective Search)은 가장 널리 사용되는 영역 제안 알고리즘 중 하나이다.

 

간단한 그 원리는 비슷한 속성의 픽셀들을 segmentation 하여 합치는 것이다. 속성으로는 색상, 재질, 크기, 형상호환성 등이 있으며 이들을 종합하여 처리한다.

 

 

슬라이딩 창 접근 방식에서는 이미지 위에서 상자 또는 창을 밀어서 패치를 선택하고 객체 인식 모델을 사용하여 창으로 덮인 각 이미지 패치를 분류한다. 전체 이미지에서 개체에 대한 지나칠 정도로 철저하게 이루어지는 검색이다. 이는 객체 인식 모델이 일반적으로 특정 척도(또는 척도 범위)에서 학습되지만 슬라이딩 창 기법에서는 이미지내에서의 가능한 모든 위치를 검색해야 할 뿐만 아니라 다양한 축척으로도 검색해야 하므로, 결과적으로 컴퓨팅 부담이 있을 수밖에 없는 수만 개의 이미지 패치에 대한 classification 작업이 이루어져야 한다.

문제는 여기서 끝나지 않는다. 슬라이딩 윈도우 방식은 얼굴이나 보행자와 같은 고정된 종횡비 객체에는 적합할 수도 있다. 하지만 이미지는 3D 객체의 2D 투영이다. 종횡비 및 모양과 같은 사물의 특징은 이미지를 촬영하는 각도에 따라 크게 달라짐에 유의해야 한다. 여러 종횡비를 검색할 때 컴퓨팅 비용이 매우 많이 들기 때문에 슬라이딩 창 접근 방식이 불리할 수도 있다.

 

참조: Object Detection using Region-based Convolutional Neural Networks(R-CNN)

https://iq.opengenus.org/object-detection-using-r-cnn/

 

아래에서 Colab 을 사용하여 OpenCV 의 Selective Search 코드 사례를 살펴보자. 구글 마운트에 의해 NDRIVE 를 부르고 tables.jpg 이미지 파일을 불러 들여 출력하자. 이 이미지는 여기서 화면 캡춰 후 그림판에 붙여서 jpg 로 저장 후 NDRIVE에 준비한 폴더 여기서는 RNNfolder에 드래그 하면 된다.

Selective Search 를 위한 클라스 명령  cv2.ximgproc.segmentation.createSelectiveSearch() 를 불러서 사용한다.

※ 아래 이미지의 푸른색은 OpenCV 에서 BGR 로 처리했기때문이며 원래의 색상을 회복하여면 RGB 로 convert  처리를 실행해야 함에 유의하자. 

im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)

 

 

 

첨부된 아래 이미지를 다운받아 tables.jpg 로 rename  하여 사용하자.

image_02.jpg
0.02MB

Search  작업의 속도에 관해서 Fast 와 Quality 가 있으며 약간의 속도 차이가 느껴진다. 아울러서 ss.process() 명령에 의해 가능한 영역 제안 수가 결정됨에 유의하자.

 

 

위 그림은 영역제안수가 10 인 경우이다. 실용적인 목적을 위해서는 200 정도 되어야 이미지상의 객체들에 대해서 bounding box 가 여러번 중첩된 형상을 볼 수 있다. 이러한 영역 제안들은 Ground Truth Data 로 사용될 수 있지만 그 수가 지나치게 칺으면 컴퓨팅 부담 증가로 인해 실용성이 상실된다.

 

 

 

첨부된 Colab  코드를 다운받아 numShowRects 값을 변경하면서 실행해 보자.

Selective.ipynb
0.28MB

 

※ Colab 에서는 코드 실행이 잘되지만 아나콘다에서는 설치된  opencv 종류에 따라서 에러가 발생할 수 있다.

opencv_python 을 지우는 대신 opencv-contib-python 만 설치하여 실행보도록 하자.

 

Selective Search 가 R-CNN 첫단계라고 언급했지만 다시 그 앞 단계인 Superpixel Algorithm 이 있다. 

 

Under Construction ...

 

참조: 아드리안의 블로그-이미지 피라미드와 슬라이딩 윈도우

https://pyimagesearch.com/2020/06/22/turning-any-cnn-image-classifier-into-an-object-detector-with-keras-tensorflow-and-opencv/

 

 

참조: Ground Truth Algorithms

https://towardsdatascience.com/image-processing-for-python-adjusting-to-the-ground-truth-d0275e4f253e