해결된 질문
21.04.07 20:03 작성
·
254
0
안녕하세요! RPN이 전개되는 과정에 있어서 이해가 안되서 질문드립니다.. 우선 제가 이해한 선에서 RPN 내부 과정을 순차적으로 말씀드리면 다음과 같습니다.
1. 원본이미지를 VGG와 같은 Feature Extractor를 통과시켜 서로 다른 사이즈인 여러개의 피처 맵이 추출 -> 2. 각 피처 맵에 대해서 3 by 3 컨볼루션을 수행하는데, 이 때 3 by 3 컨볼루션의 한 칸 당 9개의 Anchor Box들이 새겨져 있음 -> 3. 3 by 3 컨볼루션을 수행한 후 Feature Map들 사이즈는 더 줄어듦(여전히 Feature Map의 한 칸 당 9개의 Anchor Box들이 새겨져 있음) -> 4. 갑자기 1 by 1 컨볼루션을 수행해서 이진 분류는 2 by 9 아웃풋, 회귀는 4 by 9 아웃풋..? 그리고 이진분류, 회귀..? 이 부분이 이해가 가질 않습니다..
1 by 1 컨볼루션을 수행하는 이유가 서로 다른 Feature Map들의 사이즈를 통일시켜주기 위함은 알고 있습니다. 그런데 왜 아웃풋이 위와 같이 되는지(2는 백그라운드다 아니다, 4는 박스 4개의 좌표인 것은 압니다.. 그런데 왜 갑자기 1 by 1 컨볼루션만을 수행했는데 아웃풋이 2랑 4가 나오는지 모르겠습니다..), 또 여러개의 Anchor Box들과 Ground Truth 박스와 비교하는 분류, 회귀 문제를 어디 단계에서 수행해야 하는지 모르겠습니다.. 너무 헷갈리네용..
답변 3
1
2021. 04. 09. 18:59
사실 이진 분류이기 때문에 2x9가 아니라 9만 있으면 됩니다만, 어쩠든 2x9 인 경우
[[0, 1], [1,0],,,,]과 같이 2개의 결과[0, 1] 또는 [1, 0]이 9개의 anchor box에 할당되면 됩니다.
1
2021. 04. 08. 22:25
안녕하십니까,
RPN의 핵심은 anchor box를 학습 시키는 것입니다. 개별 anchor box가 Object인지 아닌지, 위치는 어떻게 되는지를 대략적으로(?) 학습을 하는 것입니다.
일반적으로 CNN은 Feature Extractor + Dense 로 구성된 classification layer를 가지고 있습니다. 하지만 이렇게 anchor box를 학습 시킬 때는 보통 Feature Extractor + Fully convolutional layer(일반적으로는 이를 Object detection model에서 head라고도 부릅니다)로 구성합니다.
RPN은 anchor를 Positive anchor인지 Negative anchor인지를 학습 합니다. 그런데 이게 Dense가 아니라 Conv Layer로 최종 학습합니다(일반적으로 Dense를 사용하면 Parameter 수가 크게 증가하게 되고 빠르게 inference하기 어렵습니다). 그래서 filter수를 anchor 수만큼 할당하는 것입니다. 이게 왜 3x3을 한 뒤에 1x1 네트웍을 구성했는지는 모델 설계자만이 알 수 있습니다만, 이걸 5x5 한 뒤에 3x3 으로 만들어도 Loss함수와 Ground Truth 클래스와 bbox 정보만 있다면 RPN으로 만들 수 있는것이 Deep learning의 장점입니다.
하지만 RPN 최초 설계자는 보다 쉽게 결과 anchor box별로 결과 값을 도출하기 위해 3x3으로 512 channel을 적용 후에 1x1으로 anchor 수만큼 filter를 적용해서 RPN 모델을 만들었습니다. 1X1 으로 만들어야 anchor 별로 학습된 클래스와 bbox 좌표값(좌표값의 경우 anchor 수 x 4만큼의 filter수 Conv적용)을 쉽게 뽑아낼 수 있기 때문입니다. 딥러닝 모델의 특성은 Ground Truth 정보와 Loss함수만 있다면 어떻게든 모델을 만들어 냅니다. (다만 엉뚱한 모델은 성능이 떨어질 뿐입니다)
학습시에는 Ground Truth 클래스와 좌표값을 입력이 되고 이렇게 입력된 학습 데이트를 기반으로 anchor 별로 Positive/Negative anchor로 매핑되면서 학습을 수행하고 학습 중 positive anchor는 positive anchor가 될 확률을 높이고, negative anchor는 negative anchor가 될 수 있게 Loss 함수를 통해 적절하게 학습이 됩니다.
위의 내용을 기반으로 추가 질문에 대해서 답변 드리면,
1. 그런데 왜 갑자기 1 by 1 컨볼루션만을 수행했는데 아웃풋이 2랑 4가 나오는지 모르겠습니다..),
=> output이 2랑 4가 나와야 loss 계산이 되기 때문입니다. 그래서 1x1 conv를 2와 4가 나올수 있게 filter수를 anchor수 기반으로 맞추는 것입니다.
2. 또 여러개의 Anchor Box들과 Ground Truth 박스와 비교하는 분류, 회귀 문제를 어디 단계에서 수행해야 하는지 모르겠습니다.. 너무 헷갈리네용..
=> RPN은 1차적으로 Object 여부를 판별할 수 있도록 anchor box를 학습 시키고, 다시 Faster RCNN의 메인 네트웍으로 이번엔 Ground Truth 박스와 비교하는 분류, 회귀 문제를 최종 학습 시켜서 최종 예측하는 것입니다.
감사합니다.
0
2021. 04. 09. 15:09
선생님 정성 답변 감사드립니다! 질문했던 내용의 대부분이 이해가 되는 것 같네요! 아마 뭔가 찝찝한 부분은 계속 학습하고 실습도 해보면서 느껴야 할 것 같습니다..!
그런데 갑자기 한 가지 궁금한 점이 생겼는데요! RPN 내부에서 9개의 Anchor Box들에 대해 오브젝트 여부를 판단해주는 이진분류 문제를 해결할 때 2 by 9 아웃풋으로 나온다고 하셨잖아요? 그러면 2 by 9 아웃풋이 9개의 각각 Anchor Box에 대해서 벡터값이 어떻게 출력이 되는건가요? 예를 들면.. 1번째 Anchor Box가 오브젝트를 담고 있다고 분류되었다면 [ [1,0] ], 오브젝트를 담고 있지 않다고 분류되었다면 [ [0,1] ] 이런식으로 나오게 되나요??(그래서 9개의 Anchor Box에 대해 모든 분류 결과 벡터를 나타내게 되면 [ [1,0], [0, 1], [1, 0], ... ] ] 이런식으로 되나요??) # 작성할 때 열벡터가 아닌 행벡터로 작성한 점 이해 부탁드립니다 :)
2021. 04. 09. 20:05
빠른 답변 감사드립니다! ㅎ