목차
- overall
- fine-tuning
- R-CNN
- Fast R-CNN
- Faster R-CNN
1. overall
R-CNN, Fast R-CNN, Faster R-CNN의 전체적인 모습이다. 함께 살펴보도록 하자!
2. fine-tuning
기존에 학습되어있는 모델은 1000개의 클래스를 분류하는 모델이라고 치고,
우리는 21개의 클래스만 필요하다고 해보자
이때 맨 아래 그림처럼 마지막 output fc layer삭제하고, 원하는 형태의 layer로 바꿔준 뒤, 내 데이터로 파라미터를 학습하는 것!
3. R-CNN
•두가지 핵심 아이디어 (2-stage Detector)
- region proposals로 object 위치를 알아내고, 이를 CNN에 입력하여 class를 분류
- Larger data set으로 학습된 pre-trained CNN을 fine-tuning
이전엔 Overfeat Model이 존재했다고 함 - 그러나 bbox가 정확하지 않고 연산량이 많아 현재는 사용x
•과정
- 입력 이미지
- Cpu상에서 Selective Search 알고리즘을 적용하여 bounding box(region proposal) 2000(~2K)개를 추출
- 추출된 bounding box(ROI)를 warp(resize)하여 CNN에 입력한 뒤, fine tuning 되어 있는 pre-trained CNN을 사용하여 bounding box의 4096차원의 특징 벡터를 추출
- 추출된 특징 벡터를 SVM을 이용하여 class를 분류
- bounding box regression을 적용하여 bounding box의 위치를 조정
•3개의 모듈 (region proposal, CNN, SVM classifier)로 구성
(1) region proposal : selective search 기법을 사용, 이미지에서 object 위치 추출 (= 주어진 이미지에서 물체가 있을법한 위치를 찾는 것)
다음과 같은 프로세스로 이루어집니다.
1. 이미지의 초기 세그먼트를 정하여, 수많은 region 영역을 생성
2. greedy 알고리즘을 이용하여 각 region을 기준으로 주변의 유사한 영역을 결합
3. 결합되어 커진 region을 최종 region proposal로 제안
- 이미지에 selective search를 적용하면 2000개의 region proposal이 생성되는데, 이들을 CNN의 입력 사이즈(227x227)로 warp(resize) 하여 CNN에 입력합니다. 논문에서는 warp 과정에서 object 주변 16 픽셀도 포함하여 성능을 높였다고 합니다.
- R-CNN 이후 Region Proposal 과정 역시 뉴럴 네트워크가 수행하도록 발전
- 현재 s.s는 사용하지 않음
(2) CNN
- pre-trained된 모델을 가져와 특정 dataset으로 fine-tune 진행
아래 그림은 fine-tuning을 적용한 후와 적용하지 않았을 때의 성능입니다.
1~3 행은 fine-tuning을 적용하지 않았고, 4~6행은 fine-tuning을 적용한 것입니다.
성능이 높아진 것을 확인할 수 있습니다.
CNN은 5개의 convulutional layer와 2개의 FC layer를 가진 AlexNet 형태를 사용했습니다. R-CNN은 soft-max layer 대신에 SVM을 사용하기 때문에 2개의 FC layer가 존재합니다.
ILSVRC 2012 데이터 셋으로 미리 학습된 pre-trained CNN 모델을 사용했으며, Object detection을 적용할 dataset으로 fine-tunning 했습니다. (파인튜닝이란, 기존에 학습이 된 레이어에 내 데이터를 추가로 학습시켜 파라미터를 업데이트 하는 것을 의미)
정리하자면, 미리 이미지 넷으로 학습된 CNN을 가져와서, Object Detection용 데이터 셋으로 fine tuning 한 뒤, selective search 결과로 뽑힌 이미지들로부터 특징 벡터를 추출하는 과정이다!
(3) SVM Classifier
R-CNN에서는 SVM으로 분류된 bounding box에 bounding box regression을 적용해 주었습니다.
- bounding box regression이란?
만약 동일한 물체에 여러 개의 박스가 쳐져 있다면, 가장 스코어가 높은 박스만 남기고 나머지는 제거하는 Non-Maximum Supperssion를진행한다. 즉, ground-truth box와 IoU(Intersection over Union)가 가장 높은 bounding box를 선택하는 것이다.
그리고 bounding box regression를 진행하는데, 이는 SVM을 통해 분류된 bounding box를 ground-truth box와 비슷하게 조정해주는 역할을 합니다.
(* 왜 Classifier로 Softmax를 쓰지 않고 SVM을 사용했을까? :실험결과 오히려 성능이 낮아져서 SVM을 사용)
R-CNN의 문제점
하나의 이미지에 2000개의 region이 존재할 때, R-CNN은 각각의 region마다 이미지를 cropping 한 뒤 CNN 연산을 수행하여 2000번의 CNN 연산을 진행하게 됩니다. 따라서 연산량이 많아지고 detection 속도가 느리다는 단점이 있습니다.
4. Fast R-CNN
핵심 아이디어
- ROI pooling
- CNN 특징 추출, 분류, bbox regression까지 하나의 모델에서 학습
- VGG16 이용
과정
4-2. bounding box regression을 통해 selective search로 찾은 box의 위치 조정
ROI Pooling
Fast R-CNN에서 먼저 입력 이미지는 CNN을 통과하여 피쳐맵을 추출합니다.
추출된 피쳐맵을 미리 정해놓은 H x W 크기에 맞게끔 그리드를 설정합니다.
그리고 각각의 칸 별로 가장 큰 값을 추출하는 max pooling을 실시하면 결과값은 항상 H x W 크기의 피쳐 맵이 되고, 이를 쫙 펼쳐서 feature vector를 추출하게 됩니다
이렇게 RoI pooling을 이용함으로써 얻는 이득??
"원래 이미지를 CNN에 통과시킨 후 나온 feature map에 이전에 생성한 RoI를 projection시키고 이 RoI를 FC layer input 크기에 맞게 고정된 크기로 변형할 수가 있다"
따라서 더이상 2000번의 CNN연산이 필요하지 않고 1번의 CNN연산으로 속도를 대폭 높일 수 있었다.
또한 동일 data가 각자 softmax(classification), bbox regressor(localization)으로 들어가기에 연산을 공유한다.
이는 이제 모델이 end-to-end로 한 번에 학습시킬 수 있다는 뜻이다.
multi task loss
classificaiton loss와 bounding box regression을 적절하게 엮어주는 것
이때 Multi Task Loss를 적용
p는 softmax를 통해서 얻어낸 K+1 (K개의 object + 1개의 배경, 아무 물체도 아님을 나타내는 클래스)개의 확률 값입니다.
u는 해당 RoI의 ground truth 라벨 값입니다 => p와 u를 가지고 classification loss 구함.
bounding box regression을 적용하면 이 RoI가 사람일 경우 박스를 이렇게 조절해라, 고양이일 경우 이렇게 조절하라는 값인 tk를 리턴한다. (= K + 1개 클래스에 대해서 각각 x, y, w, h 값을 조정하는 값)
t^u는 loss function에서 위 t^k값들 가운데 ground truth 라벨에 해당하는 값이다.
v는 ground truth bounding box 조절 값에 해당
보통 기존 Loss에 새로운 Loss를 추가할 때에는 위 식처럼 덧셈으로 연결한 뒤, 새로운 Loss의 영향력을 조절하기 위해 가중치 λ를 붙여준다.
Lcls는 따로 SVM을 학습시키지 않고 Classification을 하기 위한 Softmax 함수이며, Lloc는 Localization을 위한 L1 Loss 함수이다.
λ는 1로 고정시켰고, [u≥1]은 'Classification 결과가 Background (u=0)이면 Lloc를 죽이고, 그렇지 않으면 살린다'는 의미이다.
우리가 Bounding Box를 치고자 하는 대상은 Background가 아닌 Object이기 때문이다. R-CNN과 SPPNet에서 사용한 L2 대신 L1을 사용한 이유는 덜 민감한 함수이기 때문에 Fine Tuning이 쉬워지기 때문이다.
=>multi-task loss를 사용하여 모델을 개별적으로 학습시킬 필요 없이 한 번에 학습됨!
구조
네트워크의 마지막 fc layer를 2개의 fc layer로 대체합니다.
첫 번째 fc layer는 K개의 class와 배경을 포함한 (K+1)개의 output unit을 가지는 Classifier이며, 두 번째 fc layer는 각 class별로 bounding box의 좌표를 조정하여 (K+1) * 4개의 output unit을 가지는 bounding box regressor
conv layer3까지의 가중치값은 고정(freeze)시켜주고, 이후 layer(conv layer4~ fc layer3)까지의 가중치값이 학습될 수 있도록 fine tuning해줍니다. 논문의 저자는 fc layer만 fine tuning했을 때보다 conv layer까지 포함시켜 학습시켰을 때 더 좋은 성능을 보였다고 합니다.
결론
(1) region proposal 연산 - 2000번 연산 -> 1번 CNN연산
그러나, R-CNN에서와 마찬가지로 RoI를 생성하는 Selective search알고리즘은 CNN외부에서 진행되므로 이 부분이 속도의 bottleneck => faster R 등장
5. Faster R-CNN
핵심 : bottleneck이던 Resion proposal 작업을 GPU에서 수행하도록 함 (GPU에서 수행 = CNN 내부에서 수행)
전체 프로세스를 살펴보면 입력 이미지를 CNN에 통과시켜 Feature Map을 얻습니다. 그리고 해당 Feature Map을 Region Proposal Network(RPN)의 입력으로 사용하여 초록색 Box 영역을 뽑아내게 됩니다. 그렇게 뽑아낸 영역을 기존 Feature Map에 RoI porjection하여 해당 영역을 RoI Pooling을 수행하고, FC Layer를 통해 Classification과 Regression을 수행하게 됩니다.
Fast R-CNN과 다른점은 영역을 제안하는데 RPN이라는 CNN 기반의 네트워크를 사용하여
1) GPU에서 동작할 수 있어 빠르다. 2) 전체 네트워크내에 포함되어 End-to-End 구조이다 라는 장점이 있습니다
RPN
물체가 있을 법한 위치를 예측한다!
1) 원본 이미지를 pre-trained된 VGG 모델에 입력하여 feature map을 얻습니다.
2) 위에서 얻은 feature map에 대하여 3x3 conv 연산 256개를 적용하여 depth를 256으로 맞춰준다. 이때 feature map의 크기가 유지될 수 있도록 padding을 1로 설정합니다.
3) class score를 매기기 위해서 feature map에 대하여 1x1 conv 연산 2개를 적용합니다. 이 때 출력하는 feature map의 channel 수가 2x9가 되도록 설정합니다. RPN에서는 후보 영역이 어떤 class에 해당하는지까지 구체적인 분류를 하지 않고 객체가 포함되어 있는지 여부만을 분류합니다. 또한 anchor box를 각 grid cell마다 9개가 되도록 설정했습니다. 따라서 channel 수는 2(object 여부) x 9(anchor box 9개)가 됩니다. 1x1, 3개 2x1 3개, 1x2 3개를 해당 논문에선 사용하였음
4) bounding box regressor를 얻기 위해 feature map에 대하여 1x1 conv 연산을 적용합니다. 이 때 출력하는 feature map의 channel 수가 4(4개의 모서리)x9(anchor box 9개)가 되도록 설정합니다.
이제 앞서 얻은 값들로 RoI를 계산해야합니다. 먼저 Non-Maximum-Suppression을 적용하여 부적절한 개체를 제거하고, Classification을 통해서 얻은 물체일 확률 값들을 정렬한 다음, 높은 순으로 K개의 앵커만 추려냅니다. 그 다음 K개의 앵커들에 각각 Bounding box regression을 적용하여 RoI을 구해줍니다.
이렇게 찾은 RoI를 다시 첫 번째 피쳐맵에 project 한 다음 RoI Pooling을 적용하고, 이를 다시 Classification에 적용하면 물체의 종류도 알아낼 수 있습니다.
RPN은 앞서서 Classification과 Bouding Box Regression을 수행하였는데요, loss function은 fast-RCNN과 마찬가지로 이 두 가지 테스크에서 얻은 로스를 엮은 형태를 취하고 있습니다.(= multi task loss)
* 1x1 convolution 이란?
input 차원이 nxnx4라고 할때 1x1 convolution 2개를 이용하면 결국 input nxn짜리 4개에 대해 convolution 2개랑 아래와 같은 연산을 하는 것이다.
따라서 1x1 convolution은 fully connected layer와 같다고 한다.
multi task loss
Training
RPN과 Fast R-CNN을 번갈아가며 학습하는 Alternating Training 방법 사용
1. pretrained 모델을 불러온 다음, RPN을 학습시킨다. 이때 vgg 역시 같이 학습됨
2. 1 단계에서 학습시킨 RPN에서 기본 CNN을 제외한 Region Proposal 레이어만 가져온다. 이를 활용하여 Fast RCNN을 학습시킨다.
이 때 처음 피쳐맵을 추출하는 CNN까지 fine tune 시킨다.
3. 앞서 학습시킨 Fast RCNN과 RPN을 불러온 다음, 다른 웨이트들은 고정하고 RPN에 해당하는 레이어들만 fine tune 시킨다. 여기서부터 RPN과 Fast RCNN이 컨볼루션 웨이트를 공유하게 된다.
4. 학습시킨 RPN(3)번 과정)을 활용하여 추출한 region proposals를 활용하여 Fast R-CNN을 학습(fine tune)시킵니다. 이 때도 다른 웨이트들은 고정한다.
쉽게 생각하면 RPN과 Fast R-CNN을 번갈아가며 학습시키면서 공유된 convolutional layer를 사용한다고 보면 됩니다. 하지만 실제 학습 절차가 상당히 복잡하여 이후 두 네트워크를 병합하여 학습시키는 Approximate Joint Training 방법으로 대체된다고 합니다.
'AI 논문 공부' 카테고리의 다른 글
You Only Look Once:Unified, Real-Time Object Detection (YOLO) 논문 리뷰 (0) | 2023.02.14 |
---|---|
FPN : Feature Pyramid Net 논문 리뷰 (0) | 2023.02.06 |
Deformable Convolutional Network (DCN) 논문 리뷰 (0) | 2023.01.13 |
resnet 논문 리뷰 (1) | 2023.01.07 |
GoogleNet 논문 리뷰 (0) | 2022.12.30 |