CNN 발전 과정(4) - two-stage Detector(R-CNN계열) -> object detection
지금까지 봐왔던 학습 이미지인 CIFAR10, ImageNET 등의 데이터셋은 학습하기 편하도록 이미지가 가공된 것이다.
하지만 실제 환경에서는 이러한 데이터셋들을 많이 구하기에도 어렵고, 사용하는 환경에서는 한 이미지에 분류하고자하는 물체가 하나만 존재하지 않고, 여러 개의 물체들 즉 객체들이 존재한다.
그래서 이미지에서 '여러 객체들이 각각 무엇인지' 알아내는 원래의 Classification에 각각의 객체가 해당 이미지에서 '어느 위치에 있는지'를 알아내는 Localization이 나오게 되었다.
-> 나중에 Localization을 기반으로 센서퓨전을 통해 그 객체와의 거리를 얻어낼 수도 있다.
Classification : 주어진 이미지 안의 물체가 '무엇인지' 알아내는 것
Localization : 주어진 이미지 안의 물체가 '어느 위치에 있는지' 알아내는것
-> Bounding Box로 위치를 나타냄
Bounding box : 이미지 내에서 물체의 위치를 사각형으로 감싼 형태의 도형
- Bounding box 좌표 표현 방식 2가지
- (min_x, min_y, max_x, max_y) : 전체 이미지의 좌측 상단을 원점으로 정의 하고, 바운딩 박스의 좌상단 좌표와 우하단 좌표 두가지 좌표로 표현하는 방식
- (center_x, center_y, width, height) : 바운딩 박스 중심점(x,y)좌표와 사각형의 너비와 높이를 이용해서 사각형을표현하는 방식
아래 그림과 같이 Single Object의 경우 아래와 같이 해결하면 되지만
Multi-object인 경우 몇 개의 object가 있는지 모르기때문에
1. 몇개의 Bounding box를 찾아야하는지 모른다
2. 같은 이미지에 클래스(정답) 스코어가 애매해진다.
3. 정답의 바운딩 박스와 찾은 바운딩 박스를 비교해 보고 크기를 조정해줘야하는데 모델이 찾아내는 분류 객체 순서가 사용자가 미리 라벨링해 놓은 순서랑 같은지도 알 수 없어서 비교가 힘들다
이와 같은 문제들을 해결하기 위해 "Region Proposal "이 나오게 되었다.
Region Proposal(지역 제안) : 이미지 전체(내)에서 object(객체)가 존재할 만한 후보 영역을 여러 개 찾아 내는 것 -> 원본 이미지에서 진행
-> class와 무관한 detector로 class는 신경 쓰지 않고, 그냥 object가 있을 것 같다 싶으면 모두 잡아내는 방법(class-agnostic)
-> 하나의 Region Proposal에 대해서 분류와 Bounding box 작업을 한다.
-> 즉, Localizaion(객체의 위치를 정확히 예측)이나 Classification을 하기 위한 초기 필수 단계가 Regional Proposal이다.
Region Proposal 하는 방법 두가지
- Sliding window : 이미지에서 모든 영역을 다양한 크기의 window로 sliding하면서(미끄러지면서) 탐색하는 것
-> 다양한 크기의 많은 부분에 대해 물체 존재 여부를 확인해야하기 때문에 속도가 매우 느리다.
-> 너무 많은 컴퓨팅 파워를 필요로 한다.
=> 그래서 나온 것이 Selective Search이다.
- Selective Search : 인접한 region(지역 : 이미지에서는 픽셀)과의 비슷한 질감, 색, 강도 등의 유사성을 측정하여 해당 픽셀들을 통합해나가서 다양한 크기의 window를 생성하는 방법
- 방법
- 색상, 질감, 영역 크기 등의 분포에 따라 Over-Segmentataion(과도한 분할)을 수행
- 이후 그리디(greedy) 알고리즘에 따라서 유사도가 높은 것들을 하나의 Segmentation으로 합쳐준다.
- 2번 과정을 계속 반복하여 최종 후보 영역을 도출
- 방법
-> 위와 같이 이미지 내에서 모든 regional proposal을 뽑아낸 후 유사한 bounding box끼리 통합해서 자잘한 region을 줄이는 방식(NMS : Non Maximum suppression) 으로까지 이어짐
-> 마치 같은 특성의 픽셀들끼리 땅따먹기를 통해 구역 넓혀가는 것과 유사
Region Proposal 단점
- 실제 Object Detection에서 Region Proposal은 CNN과 별도로 이루어 지기때문에 Selective search를 사용하면 end-to-end로 학습이 불가능하다.
-> end-to-end 학습: 모델이 입력에서 출력까지 모든 과정을 하나의 신경망(딥러닝 모델)으로 학습하는 방식 - 실시간 적용에 어려움이 있다.
- CPU에 의해 알고리즘이 실행되어서 굉장히 느리다 더불어 연산량이 무진장 많다.
객체 검출(Object Detection) : 이미지에서 객체를 찾아 위치(Bounding Box)를 지정하고, 해당 객체를 분류(Classification)하는 작업
-> 여러 물체에 대한 Classification + Localization
-> 컴퓨터 비전 분야의 핵심 기술 중 하나로, 자율주행, 의료 영상 분석, 보안 시스템 등에 활용
Object Detection 모델 분류
- two(2)-stage detector : [물체가 있을 만한 영역 탐색(Region Proposal)]과 [각각의 Region Proposal 영역에 대해서 Classification(분류) + Bounding box]를 하는 총 두 단계로 나누어서 진행되는 것(R-CNN계열)
-> 객체의 후보 영역(Region Proposal)을 먼저 찾고, 분류 및 박스 조정 수행
-> Detection의 정확도가 높지만 속도가 느리다.
- 2-stage detector 종류
- R-CNN(2014)
- Fast R-CNN
- Faster R-CNN
- Mask R-CNN(Instance Segmentation 포함)
- 2-stage detector 종류
- one(1)-stage detector : Region Proposal 과 각각의 Region Proposal영역에 대한 Classification + Bounding box 가 동시에 이루어지는 것 (YOLO, SSD 계열)
-> CNN 기반으로 객체 위치를 바로 예측. 속도는 빠르지만 Detection의 정확도가 떨어진다.
-> 최근에는 Detection 정확도 또한 높아졌다.
- 1-stage detector 종류
- YOLO(You Only Look Once) 시리즈
- SSD(Single Shot Multibox Detector)시리즈
- RetinaNet
- 1-stage detector 종류
R-CNN -> 모든 과정 CPU로 이루어짐 (병렬X)
: 이미지 내에 존재하는 다수의 객체 클래스를 분류할 수 있게 해준 R-CNN계열 모델의 첫번째 모델
-> 임의의 영역을 잘라서 크기를 조정해주고 CNN을 거쳐 Feature vector를 추출하고 그것으로 SVM과 Bounding Box Regression을 수행하는 모델
R-CNN의 단계
- Selective search를 통해 약 2000개의 Region Proposal(후보 영역 생성)를 뽑아낸다.
- 그 후 뽑아진 모든 region들을 동일한 크기로 Warping(이미지 크기를 찌그러뜨리는 기법)한 후 각각의 region들을 CNN에 넣어 feature vector를 추출 -> Cache memory에 feature vector를 저장
-> 모든 region들을 동일한 크기로 하는 이유는? CNN 층을 진행하는데 있어서는 이미지의 크기가 상관이 없지만 CNN을 거치고, 이미지를 펼쳐 FC Layer에 넣을 경우 문제가 되기 때문
-> 예를 들어 FC Layer의 입력층의 노드 개수가 10개인데 3x3 이미지(1채널)이면 오류 발생 / 10(노드 개수) - 9(이미지의 FC) = 1 - feature vector를 Bounding Box Regression에 넣어 물체가 어떤 위치에 존재하는지 더 정확하게 예측
->Bounding Box Regression : 객체 위치(Bounding Box)를 보정하는 추가적인 회귀 모델 사용
-> Localization의 성능을 높이기 위해 사용하는 방법 - 동시에 feature Vector들을 SVM에 넣어 해당 벡터가 어떤 클래스에 해당하는 것인지 분류한다.
-> CNN에서 추출한 특징을 SVM(Support Vector Machine)을 사용하여 객체 분류 수행
-> SVM은 Binary Classifierfh 이진 분류만 가능하지만 한개를 제외한 나머지를 하나의 클래스로 묶어 분류하는 작업을 여러번 해줌으로써 다중 class 분류도 가능하다.
왜 Classifier로 Softmax를 쓰지 않고, SVM을 사용했을까? CNN fine- tuning을 위한 학습 데이터가 시기상 많지 않아서 softmax를 적용하면 오히려 성능이 낮아져서 SVM을 사용
-> 그 당시에는 SVM이 더 발전된 시기여서 그랬다고 보는 것이 적절하다.
R-CNN의 한계
- 2000개의 Region Proposals를 모두 CNN에 넣어 연산을 하기 때문에 학습과 평가에 많은 시간이 걸린다.
- CNN Feature Extractor 이후로 SVM과 bbox reg(Bounding Box Regression)로 분리되기 때문에 End- to - End 학습이 안됨 -> multi-stage pipelines
=> 총 3가지 모델 사용 - 실제 Object Detection에서 Region Proposal이 CNN과 별도로 이루어지기때문에 Selective search를 사용하면 end-to-end로 학습이 불가능하다.
-> end-to-end 학습: 모델이 입력에서 출력까지 모든 과정을 하나의 신경망(딥러닝 모델)으로 학습하는 방식 - Selective Search부터 모두 CPU에서 학습이 수행되어 속도가 매우 느리다.
Fast R-CNN -> Region proposal 이후로 모든 과정 GPU로 이루어짐
: CNN을 거친 FC Layer 전의 Feature map에 2000개의 Region proposal 영역을 입혀 주고(원래 이미지에서 CNN을 거쳤으니 변한 것에 맞게 재조정해서), 각 박스들의 max pooling을 진행해서 만든 같은 크기의 vector를 통해 Softmax과 Bbox reg를 진행하는 모델
나오게 된 배경
- R-CNN에서의 한계점을 극복하고자 나오게됨
- ROI(Region of Interest: 관심 영역)마다 CNN 연산을 함으로써 속도저하
-> 2000개의 Region Proposals들을 모두 CNN 연산 - CNN Feature Extractor 이후로 SVM과 bbox reg(Bounding Box Regression)로 분리됨으로써 모델을 한번에 학습시키지 못함
- ROI(Region of Interest: 관심 영역)마다 CNN 연산을 함으로써 속도저하
-> RoI pooling 과 Softmax를 사용함으로싸 CNN 특징 추출부터 classification, bounding box regression까지 하나의 모델에서 학습할 수 있게 됨
-> 정확도가 더 좋아지고, R-CNN에 비해 속도가 엄청 빨라졌다.
Fast R-CNN 수행 과정
- Selective Search를 통해 RoI를 찾는다.
- 전체 이미지를 CNN에 통과시켜 feature map을 추출한다
-> R-CNN과 다른점 : 2천 번의 CNN 연산을 1번으로 줄였다.
- 전체 이미지를 CNN에 통과시켜 feature map을 추출한다
- Selective Search로 찾았었던 RoI를 feature map 크기에 맞춰서 projection(주입) 시킨다.
- projection시킨 RoI에 대해 RoI Pooling을 진행하여 고정된 크기의 feature vector를 얻는다.
-> max pooling 진행 - feature vector는 FC layer를 통과한 뒤 , 두 갈래로 나뉘게 된다.
- 하나는 softmax를 통과하여 RoI에 대해 Object Classification을 한다.
- bounding box regression을 통해 selective search로 찾은 box의 위치를 조정한다.
-> 물론 이 과정에서 노란 박스가 처음에는 잘 안맞기 때문에 파란박스로 재조정해줘야한다.
Fast R-CNN 의 한계점
- CNN 1회 사용(GPU 사용), ROI Pooling, softmax, ROI Projection을 통해 R-CNN보다는 빠른 성능을 갖게 되었지만, 여전히 Region Proposal에서 CPU를 사용하기 때문에 속도가 느리다
Faster R-CNN(2016) -> 모든 과정이 GPU로 이루어짐
[Faster R-CNN = RPN + Fast R-CNN]
: Fast R-CNN의 단점을 개선한 모델로, RPN(Region Proposal Network)를 통해 Region Proposal 작업을 GPU 장치에서 수행하도록 하여 학습 속도를 높였다.
-> Selective search 과정까지도 딥러닝으로 처리를 하여 GPU로 처리할 수 있도록 하였다.
-> end to end는 아니다 왜냐하면 object Proposal을 찾는 딥러닝 모델과 (Bbox Regression + classification) 모델로 분리 되어있기 때문
나오게된 배경 -> Selective search이 너무 오래 걸리는 문제
Fast R-CNN을 통해서 Classification과 bounding box regression을 CNN을 통해서 한번에 처리하게 되었지만 여전히 region proposal인 Selective search(->CPU 사용) 알고리즘을 CNN 외부에서 연산하므로 ROI 생성 단계가 병목이다.
-> 그래서 Faster R-CNN에서는 Selective Search를 사용 안하고, RPN(->GPU 사용)을 통해서 Object Proposal을 하고 그 찾은 구역들을 Fast R-CNN 구조 틀에 보내어 Classification과 Bbox reg를 수행했다.
-> 병목(Bottleneck)이란 ? 마치 옛날 콜라병의 입구 구조 처럼 어떤 시스템에서 전체 성능을 제한하는 가장 느린 부분을 의미하며 이 부분이 전체 시스템 속도를 결정하게 된다.
=> 즉, 특정 과정이 너무 느려서 다른 과정들이 빠르게 처리되더라도 전체 성능이 향상되지 않는 문제
Faster R-CNN 수행 과정
- CNN을 통해 이미지에서 feature vector를 추출
- RPN을 통해 feature map 에서 물체가 있을 법한 위치를 표시한다.
- 해당 위치들을 중심으로 라벨 분류와 bbox regression을 진행한다.
(classification 부분은 Fast R-CNN 모델과 동일한 구조를 사용)
RPN(Region Proposal Network) -> Feature map에서 진행
- 기존 Selective Search 대신 CNN 기반의 Region Proposal 생성
- RPN의 Input : 이전 CNN 모델에서 뽑아낸 Feature map
- Anchor Boxes를 활용하여 다양한 크기의 객체를 탐색
- Bounding Box 좌표를 조정하여 최적화
RPN 과정
1. 9개 모양의 anchor box를 처음부터 feature map에서 slinding window 방식으로 이미지를 훝으며 객체가 있는 영역을 찾아낸다.
-> Sliding window 방식처럼 각 픽셀 마다 k 개의 anchor Box를 설정하는것
-> 각 픽셀에 anchor(닻)을 내린 형태로 보면 될 것 같다.
2. GT(Ground Truth) 박스와 찾아낸 박스들 간의 IOU(Intersection Over Union) 계산
-> 실제 객체 박스의 위치와 예측된 Anchor Box 간의 IOU 값을 계산하여 최적의 박스를 선택
-> IOU > 0.7 이면 1 / IOU <0.3 이면 -1 / 그 외의 IOU는 버림
3. NMS(Non-Maximum Suppression) : GT 박스와의 제일 일치율이 높은 최적의 박스와 다른 박스들 간의 IOU를 계산해서 일정 기준 값을 넘으면 다른 박스들을 제거하는 기술
- NMS(Non-Maximum Suppression) 과정
- Box들의 score(Confidence)를 기준으로 정렬
- score가 가장 높은 box 부터 시작해서 다른 모든 box들과 IoU를 계산해서 0.7 이상이면 같은 객체를 detect한 box라고 생각할 수 있기 때문에 해당 box는 지운다.
- 최종적으로 각 object 별로 score가 가장 높은 box 하나씩만 남게됨
R-CNN 계열 비교 및 정리
anchor box가 배치되는 원리가 뭘까 어떤 근거로 어떻게 배치가 되는 것일까?
-> 일단은 Feature map의 한 픽셀 자체가 원래 이미지의 여러개의 픽셀들을 담고 있는 형태이기 때문에 Feature map에서의 각 픽셀에 anchor box를 설치한다.
https://ganghee-lee.tistory.com/35 -> R-CNN
https://www.youtube.com/watch?v=W6EVlzVP0TM&t=1s -> Joonseok Lee유튜브 강의
https://ganghee-lee.tistory.com/37 -> Faster R-CNN