일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Optimization algorithms
- MMdetection
- 백준 효율적인 해킹
- jupyter 명령어 모드 단축키
- augmentation 이후 이미지 확인
- 프로그래머스 72410번
- 프로그래머스 42885번
- 백준 1325번
- jupyter 셀 추가 단축키
- 가상환경 확인
- 프로그래머스 43164번
- 프로그래머스 67257번
- gradient descent optimization
- DeepLabv3+
- 프로그래머스 67256번
- 카카오 보석 쇼핑
- zip 압축해제 명령어
- 프로그래머스 42839번
- Kullback-Leibler Divergence
- 프로그래머스 42883번
- YOLO detection
- os 확인 명령어
- 백준 3190번
- 프로그래머스 보석 쇼핑
- pytorch 이미지 확인
- object detection
- vscode sftp
- 원격서버 로컬 동기화
- 프로그래머스 67258번
- 가상환경 제거
- Today
- Total
소소한 블로그
[논문리뷰] Faster R-CNN 이해 본문
오늘은 Faster R-CNN에 대해 간단히 리뷰해보려 합니다.
논문링크↓
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
원래는 Mask R-CNN 논문 이해 및 구현이 올해 첫 목표였는데요,
일단 Faster R-CNN 구현을 먼저 진행해보면 어떨까 고민하고 있습니다.
지난 Fast R-CNN 게시물을 보고 싶으시면 아래를 참고하시길 바랍니다.
2021.03.31 - [이론/이미지인식] - Fast R-CNN 이해
Fast R-CNN 이해
오늘 밖에 나갔는데 날씨도 따뜻하고 벚꽃도 많이 폈더라고요. 봄 옷 꺼내서 세탁을 왕창 했습니다. 본론으로... ㅎㅎ 지난 주에는 R-CNN 논문을 읽고 간략한 리뷰를 해봤습니다. 오늘은 R-CNN에 이
cake.tistory.com
Faster R-CNN은 R-CNN, Fast R-CNN과 마찬가지로 Object Detection model입니다.
Fast R-CNN이 R-CNN의 상위버전이라면, Faster R-CNN은 Fast R-CNN의 상위버전입니다.
지난 리뷰를 돌아보면 R-CNN에서는 모든 region proposal의 convolution 과정으로 인해
training, test 시간이 오래 걸린다는 문제점이 있었는데,
Fast R-CNN에서는 이를 해결했습니다.
하지만 Fast R-CNN에서는 region proposal에서 여전히 많은 시간이 소요된다는 문제점이 있었는데요,
Faster R-CNN이 바로 이 문제점을 해결했습니다.
본론으로 들어가기 전에 이 논문에서는 object detection을 크게 2단계로 나누고 있다는 것을 알아두시면 좋습니다.
하나는 region proposal 단계이고,
다른 하나는 이를 바탕으로 bounding-box의 클래스를 판단하고 위치를 regression하는 detection 단계입니다.
이런 관점은 R-CNN과 Fast R-CNN과 비슷하니 낯설지는 않으실 듯 합니다.
이런 방법을 Two-stage(proposal + detection) 이라고 부르는 듯 하네요.
Faster R-CNN은 region proposal 하는 단계에서 detection 단계에서 쓰이는 convolutional features를 공유하게 함으로써, region proposal 하는 시간을 크게 감소시켰습니다.
이러한 region proposal 방법을 RPN이라고 정의하고 있습니다.
이제 본론으로 들어가봅시다!
[기존 region based CNN의 문제점 및 해결책]
앞서 언급했듯이 Fast R-CNN과 같은 region based CNN을 쓰는 모델은
region proposal 단계에서 시간이 많이 소요됩니다.
region proposal 하는 방법에는 Selective search나 EdgeBoxes등이 있습니다.
(자세한 내용은 여기서 다루지 않겠습니다.)
region proposal은 CPU연산이고 region-based CNN은 GPU 연산이기 때문에
둘의 시간소요를 비교하면 안된다고 생각할 수 있습니다.
그렇다고해서 region proposal을 GPU 자원을 쓸 수 있게 다시 구현하게 된다면,
여기서 쓰이는 sharining computation(region proposal과 detection사이의 sharing)을 하지 못한다고 하네요.
논문의 저자들은 region-based detector에서 쓰는 convolutional feature maps가
region proposal을 하는데에도 쓰일 수 있다는 것을 알아냈습니다.
따라서 이 논문에서는 기본 region proposal 방법을 활용하지 않고
RPN이라는 새로운 network를 소개하고 있습니다.
convolution network를 쓰기 때문에 기존의 방법보다 시간측면에서 성능이 좋습니다.
또한 정확도 측면에서도 더 성능이 좋다고 합니다.
convolutional features의 위에다가 몇개의 convolutional layers를 추가하여 RPN을 구현했습니다.
______________
[RPN 이란]
앞서 언급했듯이 RPN은 region proposal을 뽑아내는 network입니다.
region proposal은 직사각형모양인데 물체에 따라 다양한 비율을(가로:세로) 가져야 할 것입니다.
이를 위해 RPN은 아래에서 보듯이
여러 크기와 여러 비율을 가지는 "anchor" boxes(그림에서 파란색 박스)를 이용합니다.
image에다가 conv feature map을 뽑아낸 뒤, 해당 map에서 window가 sliding 합니다.
(이것을 filter라고도 합니다.)
그리고 하나의 filter가 여러개의 anchor boxes로 변화하게 됩니다
사실 여러 사이즈의 region proposal을 제안하기 위해
이미지 자체의 크기를 줄이면서 학습시키는 방법도 있고
filter의 사이즈를 다양하게 변경하면서 학습시키는 방법도 있습니다.(아래 사진 참고)
이 두개의 방법이 아닌 다양한 비율을 가지는 anchor box를 이용하여 학습시키면
스피드 측면에서 이점이 있다고 하네요.
Faster R-CNN은 오직 한개의 image와 한개의 filter(feature map에서 sliding window)를 사용합니다.
대신 하나의 filter에서 여러개의 anchor box를 쓰는 것이죠.
그러면 RPN에서 다양한 비율을 가지는 proposal을 생성하는 방법을 알아봤고,
RPN이 전체적으로 어떤 과정인지 알아야 겠죠.
RPN의 구조는 아래와 같습니다.
위의 사진에서 보듯이 각 sliding window는 작은 차원의 feature로 변하게 됩니다. (그림에서는 256-d)
그 후 이 feature은 2가지 분기로 나뉘게 됩니다.
하나는 각 proposal들이 물체인지 아닌지 점수를 매기는 부분(왼쪽)이며
다른 하나는 각 proposal들의 위치를 regression하는 부분(오른쪽)입니다.
여기서 k는 하나의 sliding window에서 나오는 anchor box의 개수입니다.
논문에서는 k를 9로 설정했습니다.
3개의 크기와 3개의 비율(가로:세로를 각 1:1, 2:1, 1:2)로 anchor box의 9개의 크기를 정했습니다.
Convolutional feature map이 W*H라면 전체 이미지에서 anchor box의 개수는 W*H*k가 됩니다.
따라서 RPN의 결과로 여러 사이즈의 region proposal box와 이 box가 object일 확률을 return합니다.
______________
[Faster R-CNN 구조]
Faster R-CNN은 2가지 모듈로 나눠져 있습니다.
첫번째는 region proposal을 구하는 fully convolutional network
두번째는 앞서 추출한 region proposal을 사용하여 object detection을 하는 Fast R-CNN detector 모듈
이 두개는 아래 사진 처럼 하나의 network로 되어 있습니다.
______________
[Loss Function]
RPN을 훈련시키기 위해서 RPN의 loss function이 당연히 정의되어 있어야겠죠?
위의 글을 상기시키면 일단 RPN에서는 anchor box가 물체가 아닌지 맞는지
binary class label을 추측해야 합니다.
binary class가 true인 경우는
(1) ground-truth box와의 IoU가 제일 높은 anchor box인 경우
(2) ground-truth box와의 IoU가 0.7이상인 anchor box인 경우
입니다.
따라서 하나의 ground-truth box에 대해 여러 anchor box의 binary class가 true일 수 있습니다.
그리고 위에서 (1)조건이 있는 이유는 경우에 따라 (2)조건을 성립하는 anchor box가 없을 수 있기 때문입니다.
그리고 binary class가 false인 경우는
ground-truth box와의 IoU가 0.3미만인 경우입니다.
따라서 binary class가 true도 아니고 false도 아닐 수 있습니다. 이 경우는 훈련에 영향을 끼치지 않습니다.
loss 식은 아래와 같습니다.
우변의 첫번째 항은 2개의 class(물체인지 아닌지)에 대한 classification loss이고,
우변의 두번째 항은 regression loss입니다.
regression loss는 해당 anchor box가 truth일 때만 더해집니다.
(true면 pi*가 1이 되고 false면 pi*가 0)
classification loss는 log loss이고, regression loss는 robust loss입니다.
변수의 정의는 아래와 같습니다.
i := anchor box의 index
pi := i번째 anchor box가 object일 확률
ti := bound box의 추측값 (4개의 벡터로 이뤄져 있음)
또한 *가 붙은 것은 ground-truth이고 붙지 않은 것은 추측값입니다.
RPN을 훈련 시킬때는 하나의 이미지에서 256개의 anchors를 무작위로 고르는데,
여기서 positive anchor과 negative anchor의 비율을 1:1로 맞췄다고 합니다.
만약 하나의 이미지에서 positive anchor의 개수가 128보다 작다면
negative anchor의 개수도 positive anchor 개수에 맞춰 뽑습니다.
______________
[RPN과 Fast R-CNN을 연결하는 방법]
Faster R-CNN에서는 detection network로 Fast R-CNN을 선택했습니다.
논문에서는 Faster R-CNN에서 RPN과 Fast R-CNN을 어떻게 연결했는지 소개하는데
이에 앞서 RPN과 Fast R-CNN을 연결할 수 있는 후보 선택지 3가지를 소개합니다.
1) Alternating training
이 학습 방법은 먼저 RPN만 학습시키고 그 다음 Fast R-CNN의 detection 부분을 fine-tuning하는 방법입니다.
실질적으로 Faster R-CNN에서 썼던 방법입니다.
2) Approximate joint training
이 방법은 RPN loss와 Fast R-CNN loss를 하나로 합쳐 RPN과 Fast R-CNN을 한꺼번에 학습시키는 것입니다.
이는 구현하기는 쉬울 지 몰라도 proposal box에 대한 coordinate에 대한 derivate값을 무시한다고 하네요.
(왜 무시하는지는 여기서 다루지 않겠습니다.)
첫번째 방법을 썼을 때 이 방법을 썼을 때보다 학습시간이 25-50%로 줄게 된다고 하네요.
3) Non-approximate joint training
두번째 방법이 RPN의 bounding boxes의 coordinate의 derivate를 무시한다고 했는데요,
이 방법에서는 "RoI warping" layer를 사용하여 이 문제점을 해결할 수 있다고 합니다.
논문에서도 이것을 설명하는건 이 논문의 범위를 벗어난다고 설명을 생략했으니,
여기에서도 다루지 않겠습니다.
그래서 결론만 언급하자면 Faster R-CNN은 alternating training을 씁니다.
이 training 과정은 크게 4가지로 나뉩니다.
1) ImageNet에서 사전학습된 network로 파라미터들을 초기화 한후 RPN 학습
2) 위에서 학습시킨 RPN을 이용해 Fast R-CNN의 detection network 학습
(이때 detection network 또한 ImageNet에서 사전학습된 모델입니다.)
3) 위에서 학습시킨 detection network와 shared convolutional layer는 고정시키고,
오직 RPN에 대한 layer들만 fine-tuning
4) 위에서 학습시킨 RPN과 convolution layer는 고정시키고, Fast R-CNN에 대한 layer만 fine-tuning
자세한 내용은 구현을 하면서 알아봐야 할 듯 합니다.
______________
[기타]
몇 RPN proposal들은 다른 것들과 overlap될 수 있습니다.
이런 redundancy를 줄이기 위해 Faster R-CNN에서도 non-maximum suppression(NMS)를 썼다고 하네요.
또한 논문에서는 Faster R-CNN이 Translation-Invariant Anchors 성질을 가지고 있다고 소개합니다.
처음에 translation-invariant가 무슨 뜻인지 감이 안잡혀 구글링해보니
대략 입력이 바뀌어도 출력은 동일하다는 뜻인듯 하더군요.
여기에서는 이미지상에서 어떤 물체를 옮겨도
옮긴 후 위치에서 옮기기 전과 동일하게 proposal을 뽑아내는 성질을 의미합니다.
그런데 Faster R-CNN은 이런 성질을 지니고 있다고 합니다.
이 부분에서 MultiBox와 비교하며 설명하고 있습니다.
MultiBox의 경우는 k-means를 사용하여 anchor box를 800개(<-> Faster R-CNN의 경우 9개) 뽑아냅니다.
(여기서는 제 의견.. k-means라는 것은 주변 노드들의 영향을 받는 것이니
MultiBox는 translation-invariant anchor성질이 없다는 것 같고,
반면 Faster R-CNN은 sliding window로 anchor box를 뽑아내기 때문에
Faster R-CNN은 translation-invariant anchor 성질을 가진다는 듯 합니다.
어디까지나 저의 의견입니다!)
그리고 MultiBox에서 proposal을 추출하는데 필요한 파라미터 수보다
Faster R-CNN에서 필요한 파라미터 수가 더 작기 때문에
작은 dataset에서 overfitting의 위험을 줄일 수 있다고 소개하고 있습니다.
(사실 논문을 읽으면서 왜 translation-invariant인지에 대한 설명은 부족하다고 느꼈습니다.
이런 이유를 설명하기보다는 그냥 MultiBox와의 비교를 소개한다는 느낌을 받았어요.
Faster R-CNN은 detection에서 쓰이는 convolutional features를 region proposal에서도 활용함으로써
기존 proposal 단계에서 걸리는 시간을 크게 줄였다는 측면에서 의의가 있습니다.
개인적을 이번 논문의 서술방식은 뭔가 저에게는 맞지 않았어요.
앞에서 설명했던 것을 뒤에서도 몇번 더 반복해서 설명하는 느낌이라
음... 저한테는 설명이 왔다갔다 하는 느낌이랄까요?
그리고 뭔가 각 챕터의 순서도 저에게는 꼬인것 같은 느낌.
그래서 블로그에 적어진 설명 순서도 논문의 순서와는 다를 거에요.
저는 차근차근 순차적으로 넘어가는 설명방식을 좋아하는 것 같아요.
하지만 Faster R-CNN에서의 RPN방법은 참신한 것은 분명합니다.
이전 R-CNN, Fast R-CNN에 대한 게시물 내용은 짧았던 것 같은데,
이번 논문은 비교적 설명이 길어진 것 같아요.
왜냐하면 이 Faster R-CNN 구현을 해보고 싶은 마음때문이죠ㅎㅎ
글을 시작하기에 앞서 Mask R-CNN을 다뤄보기전에
Faster R-CNN을 구현해보고 싶다고 했는데
음 아마도 다음 게시물은 Faster R-CNN 구현이 되지 않을까 싶어요..!
그럼 이만~
'이론 > 이미지인식' 카테고리의 다른 글
[논문리뷰] FaceNet에 대한 이해 (1) | 2022.02.09 |
---|---|
[논문리뷰] DeepLabv3+의 이해 (0) | 2021.11.27 |
[논문리뷰] YOLO Object Detection의 이해 (0) | 2021.09.27 |
[논문리뷰] Fast R-CNN 이해 (0) | 2021.03.31 |
[논문리뷰] R-CNN 이해 (0) | 2021.03.23 |