Learn

[컴퓨터비전] Fast-RCNN

부루기 2024. 6. 13. 12:11
728x90

서론

  1. 이 포스트는 R-CNN을 어느정도 알고 있다고 가정하고 작성된 내용입니다.
  2. 이전 R-CNN은 총 3개의 문제점이 있다.
    1. two-stage 문제
    2. 학습에 공간이랑 시간이 많이 들어간다
    3. 객체 탐지 자체가 느리다.
  3. 여기서 c번의 문제를 Spatial Pyramid Pooling이라는 것을 통해서 정해진 사진의 크기에 상관없이 구분을 할 수 있도록 해준다.
  4. 따라서 이 포스트에서는 SPPNet, Fast-RCNN에 대해서 정리해보고자 한다.

본론

  1. 크게 달라진 점은 2개이다. ROI pooling, Multi-task Loss
  2. Fast-RCNN이 R-CNN과 제일 큰 차이점이라면 원본 사진에서 feature map을 만들 때, 한번에 한다는 것이다.
    1. 이것에 관해서 꽤 헷갈렸는데, Conv와 Selective Search의 순서가 바뀌었다고 생각하면 된다.
    2. R-CNN은 원본 데이터 → Selective Search에서 나온 Bbox를 가지고 Conv를 진행한 뒤, feature을 거쳐서 분류하는 과정을 거쳤다면,
    3. Fast-RCNN은 원본 데이터 → 한번에 Conv를 거쳐서 feature map을 만든다. → 여기서 Selective Search를 해서 Bbox를 뽑는다 → Bbox가 각기 다른데 어떻게 Fc에 넣을껀가?? → 이를 SPPNet의 개념을 사용해서 전부 같은 크기의 특징 벡터로 수렴할 수 있다는 것이다.
  3. 어떻게 각기 다른 Bbox를 같은 fc로 줄이는 가?
    1. feature map의 크기에 상관없이 1616, 44, 1*1으로 max pooling을 진행한다. 이러면 총 20개의 fc가 나오는 걸 알수 있다.
    2. SPPNet에서 이 같은 방법을 사용했고 Fasst-RCNN은 이를 차용해서 ROI pooling이라고 사용한다.
  4. 학습에서도 차이점이 있다. R-CNN은 classification과 Bbox regression을 구분해서 학습했으나, Fast-RCNN은 이를 하나로 묶어 사용한다.
    1. 따라서 Loss는 다음과 같다.
      1. $L(p_i​,t_i​)=\frac{1}{N_{cls}}​∑_i​L_{cls}​(p_i​,p_i^∗​)+λ\frac{1}{N_{reg}}​∑_i​[p_i^∗​≥1]L_{reg}​(t_i​,t_i^∗​)$
      2. $p_i$: 예측된 클래스 확률 (소프트맥스 출력).
      3. $p_i^*$: 실제 클래스 레이블 (정수, 0 ~ K, 여기서 K는 클래스 수).
      4. $t_i$: 예측된 바운딩 박스 좌표.
      5. $t_i^*$: 실제 바운딩 박스 좌표.
      6. $N_{cls}$: 분류 손실을 정규화하기 위한 샘플 수.
      7. $N_{reg}$: 회귀 손실을 정규화하기 위한 샘플 수 (일반적으로 RoI의 수).
      8. $\lambda$: 분류 손실과 회귀 손실 간의 균형을 조절하는 하이퍼파라미터.
      9. $[p_i^* \geq 1]$: 실제 클래스 레이블이 1 이상인 경우에만 회귀 손실을 계산하도록 하는 인디케이터 함수.

결론

  1. Fast-RCNN에서 R-CNN 차이는 2가지, ROI pooling과 Multi-task Loss
  2. ROI pooling은 원본을 한번에 conv하면서 나온 결과를 동일한 특징벡터로 만들 수 있다.
  3. Multi-task loss는 classification과 Bbox regression을 한번에 해결할 수 있다.

추가로 생각할 점

  1. 저번 R-CNN에서 왜 softmax를 쓰지 않는지에 대한 해답이 여기서 나온다.
  2. R-CNN과 마찬가지로 사진을 추가해서 새로 올릴 필요가 있다.
728x90