컴퓨터 비전

OHEM (Training Region-based Object Detectors with Online Hard Example Mining)

kdjames0930 2026. 2. 15. 00:52

 Object Detection을 위한 모델을 학습시킬 때 모델에게 Positive sample(객체가 있는 영역과 클래스를 올바르게 분류한 bounding box), Negative sample(그렇지 못한 bounding box)를 제공해야 한다. 문제는 대부분의 이미지에서 객체를 포함하고 있는 영역은 일부이고 대부분은 탐지의 대상이 아닌 '배경'으로 이루어져 있다. 따라서 객체를 올바르게 감싸고 있는 Positive sample에 비해 Negative sample의 숫자가 훨씬 많다. 

강아지를 찾아야 한다고 생각해보자. 이미지에서 강아지를 포함하는 bounding box (positive sample) 에 비해 negative sample 이 매우 많다.

 

뿐만 아니라 대부분의 Negative Sample들은 학습에 크게 도움이 되지 않고, 실제로 모델의 성능을 좌우하는 Sample들(물체의 일부만 포함한 box, 서로 겹치는 물체, 배경과 유사한 물체)의 비중은 적다. 이러한 클래스 불균형 문제들을 해결하기 위한 방법으로 Bootstrapping (=Hard Negative Mining) 같은 방법이 제시되었다. 하지만 이 방법은 학습 속도가 느려지고 성능 향상에 한계가 있어 대안으로 OHEM이 제시되었다.

 

  Hard Negative Mining이 무엇인지 살펴보고, R-CNN, Fast R-CNN 등 객체 탐지 모델에서 학습을 어떻게 시켰는지 알아본 후 OHEM이 가져올 수 있는 장점에 대해서 알아보겠다. 

 

  • Bootstrapping (Hard Negative Mining)

Bootstrapping 사용 전후

 

 Hard Negative Mining의 핵심 아이디어는 "Negative sample 중에서 햇갈리는 것들만 골라서 학습하자" 이다. 객체 탐지에는 negative가 압도적으로 많고, 이중 대부분은 쉽게 negative 임을 구분해낼 수 있는 것들이다. 예를 들어 하늘, 바닥, 벽 같은 배경들은 쉽게 객체가 아님을 모델이 판단할 수 있다. 반면 'Hard negative'는 사람의 그림자, 물체의 일부만 애매하게 포함된 bounding box, 다른 클래스 물체를 잘못 판단한 bounding box 처럼 모델이 쉽게 구별해내지 못하는 케이스들이다.

 

 만약 모든 Negative sample 중에서 랜덤하게 샘플링을 해서 학습을 시킨다면 모델 성능 향상에 도움이 되지않는 쉬운 negative sample들로 학습이 되어 모델 성능 향상도 못 시키고 시간을 낭비할 수 있다. Hard Negative Mining은 이 문제를 해결해주는 것이다. 과정은 다음과 같다.

  1. positive sample (ground truth 혹은 IoU가 threshold 이상), negative sample -> 초기 모델 학습
  2. 수십~수백개의 이미지들을 현재 모델을 통해서 추론 후 틀린 sample들 추출 (예로, 배경인데 object 점수가 높은 박스)
  3. 위와 같은 hard negative sample들을 모아서 tranining set에 추가, threshold size 만큼 추가되면 다음 단계로.
  4. 업데이트된 training set으로 모델을 다시 학습

위 과정을 성능이 더 이상 향상되지 않을 때까지 계속 반복하면 False Positive에 강건한 모델을 만들 수 있다.

 

  • R-CNN 에서는 어떻게 training set 을 설정했을까?

 Region Proposal 이후의 R-CNN구조는 크게 CNN 영역, Classification SVM 영역, Bounding Box Regression 영역으로 나눌 수 있다.

 

 여기서 CNN을 학습시킬 때에는 앞서 Selective Search으로 RoI 생성 후 SGD iteration 마다 RoI 중 positive 25%, negative 75% 총 128개를 sampling 해서 forward_loss 계산, back propagation 으로 학습한다. 여기서 positive example은 ground truth 와의 IoU 0.5 이상, 나머지는 negative example 으로 분류된다.

 

 SVM을 학습시킬 때에는 Hard Negative Mining을 사용했다. 이때 약간의 변형으로 Ground Truth 만을 Positive sample으로 사용하고 Ground-Truth와의 IoU 0.3 미만을 negative sample로 분류, 그 사이는 (0.3 < IoU < 1.0) 무시했다. 과정은 다음과 같다: 초기 SVM 학습 → 현재 SVM을 고정한 상태에서 수십~수백개의 이미지들의 RoI들에 대해 점수 계산 → hard negative 추출해 재학습

 

  • Fast R-CNN 에서는 어떻게 training set 을 설정했을까?

 Fast R-CNN 에서는 Bootstrapping(Hard Negative Mining)을 사용하지 않고 SGD를 통해 모델을 학습시켰다. SGD iteration 마다 2개의 이미지 선택, selective search 로 RoI 생성 후 이들 중 positive 25%, negative 75% 총 128개를 random sampling 해서 forward_loss 계산, back propagation 으로 학습시켰다. Positive sample은 Ground-Truth와의 IoU > 0.5, Negative sample은 0.5 > Ground-Truth와의 IoU > 0.1 을 기준으로 선정되었다.

 

 OHEM 저자들은 이 방식에 대해 positive/negative sample 비율을 heuristic 하게 정해줘야 한다는 점을 지적했다. 또한 IoU>0.1 설정이 쉬운 background sample들을 제거하지에 충분하지 않다고 지적한다. 여전히 gradient가 거의 없는 sample들을 학습하게 된다. 

 

  • OHEM (Online Hard Example Mining Algorithm)

OHEM 전체 구조

 

 OHEM은 모든 RoI를 forward pass 해서 모든 proposal 들에 대해 loss 를 계산하고, 이중 높은 loss를 가지는 sample들에 한해서만 backward pass 시켜 모델 가중치를 업데이트한다. Fast R-CNN에 OHEM을 적용할 경우 과정은 다음과 같다.

  1. SGD Iteration t 에서 받은 이미지에 대해 CNN을 통해 conv feature map을 계산한다.
  2. Region Proposal을 통해 나온 모든 RoI(Region of Interest)들에 대해 Forward Pass를 진행한다. (기존 R-CNN에서는 mini-batch를 사용했었다)
  3. 모든 RoI에 대해 Loss를 계산한다.
  4. Loss가 높은 순서대로 정렬시켜 가장 loss가 큰 sample들을 B개 뽑는다. 이때, 겹치는 sample들을 제거하기 위해 NMS(non-maximum suppresion, IoU=0.7)을 사용한다.
  5. 위에서 선별한 'hard sample'들을 backward pass 시켜 모델을 학습시킨다. 

 

OHEM을 통해 얻을 수 있는 장점은 다음과 같다:

 

- 가장 Gradient에 유의미한 영향을 줄 수 있는 sample들을 골라 학습시키므로 성능이 향상된다. 기존의 Fast R-CNN에서는 쉬운 background sample 역시 학습에 포함됐다.

- SGD와 마찬가지로 굳이 모든 sample들을 학습시키지 않아도 되므로 training 시간이 절약된다.

- 단순히 가장 Loss가 큰 B개의 RoI만 고르면 되기 때문에, Positive/Negative sample 비율을 heuristic하게 정해줄 필요가 없다. 모델을 그때의 필요에 따라 Positive Sample들에 대한 학습이 더 필요하면 해당 RoI들을 training에 사용할 것이고, 반대의 경우에도 마찬가지일 것이다.

- 단순 Bootstrapping과 달리 'Online' 형태로 학습. 즉, 원래 Bootstrapping이 여러 epoch에 걸쳐서 Loss를 계산한 다음 한꺼번에 모델을 업데이트해 SGD와 맞지 않았지만, 하나의 iteration 안에서 loss 계산, training sample 선별, back propagation을 실행해 hard negative mining을 학습 루프 안으로 넣었다고 볼 수 있음. 

반응형