작성
·
343
0
4:34를 보면서 질문드리고 있는데 이해하고 있는 부분이 맞는지 모르겠습니다
첫번째 300* 300* 3의 이미지가 첫번째 conv를 통과하여 생성된 38*38*512의 feature map에서 3*3 4(anchor box개수)*(pascal data set이라면 20 + 1+ 4: 바운딩박스 좌표)를 해서 마지막 detection 단으로 보내서 학습을 하는 것 까지 이해를 하겠는데, 3*3 과 같은 컨볼루션을 통해 바운딩박스가 학습되는 원리를 모르겠습니다.
여기서 2가지 conv연산이 들어가는데 그 중 하나는 앵커박스를 통하여 바운딩박스를 학습하고 다른 하나는 컨볼루션 연산을 통해서 feature map의 사이즈를 줄이는(정보를 압축?) 하는 쪽으로 하는게 맞는지요..
글 주변이 없어서 죄송합니다.
답변 1
0
안녕하십니까,
음, 어떤 부분이 어떻게 이해가 안되는지 적어주시면 더 좋을 것 같습니다만, 일단 제가 추측해 보건데..
먼저, Object detection 모델은 이미지 classification과 다르게 Object detection 모델은 보통 최종 예측 단계에서 Dense layer를 이용하지 않고 Conv Layer를 이용해서 학습하는 방식으로 발전해 왔습니다.
예측을 object 좌표와 class 명을 하기 때문에 이렇게 Conv layer를 사용하면 효과적으로 학습하고 결과를 도출할 수가 있습니다.
SSD는 VGG등의 Backbone을 통해서 만들어진 feature map과 이 feature map을 다시 축약한 여러개의 feature map들을 만들게 됩니다. 여러개의 Feature map은 3x3 Conv와 Stride를 적절히 적용하여 크기가 작은 feature map들을(좀 더 큰 object들을 Detect할 수 있도록) 여러개 만들게 됩니다.
이렇게 만들어진 개별 feature map들을 3x3 Conv 연산을 적용 그러니까 서로 다른 크기의 feature map들에 3x3 conv를 적용하여 예측을 수행하게 됩니다.
강의에서는 이들 feature map들에 3x3 Conv를 적용해서 bbox의 좌표와 object class를 학습한다고 말씀드렸는데, 이걸 상세히 설명드리면 좀 내용이 깁니다. 먼저 feature map 별로 anchor box에 따른class의 종류 갯수와 좌표 갯수로 Channel 수를 정해서 3x3 Conv 연산을 합니다. 그러니까 3x3 Conv의 채널에 box별 class의 종류와 좌표를 학습할 수 있도록 하는 것입니다.
글로 적기에는 좀 이해가 안되실 수 있어서, Github에서 SSD를 구현한 사례를 첨부합니다. 318 라인 부터 보시면 될 것 같습니다.
https://github.com/pierluigiferrari/ssd_keras/blob/master/models/keras_ssd300.py
먼저 VGG를 통과한 Feature map을 3x3 Conv와 Stride를 적용해서 축약적인 feature map들을 다 만든 다음에 개별 feature map들에 예측을 3x3 Conv를 다시 적용합니다.
감사합니다.
질문의 설명이 부족함에도 불구하고 너무 잘 설명해주셔서 놀랍고 감사할따름입니다..!! 다시 정리하자면 3*3 컨볼루션을 적용을 box별 class의 종류와 좌표로 학습하여 채널로 만든다는 말씀이십니까?