Non maximum supression(NMS)

|

Non maximum supression(NMS)

  • 참고 글
    • https://dyndy.tistory.com/275
    • https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.g137784ab86_4_969
  • 딥러닝을 이용한 object detector들은 (특히 single shot 방식) NMS를 이용하여 연산량을 줄이고 mAP를 높히는 효과를 본다.
  • 일반적으로 영상 에지를 찾기 위한 NMS의 경우 현재 픽셀을 기준으로 주변의 픽셀과 비교 시 최댓값인 경우 그대로 두고, 아닐 경우 (비 최대) 억제(제거) 하는것이다.

  • 딥러닝을 이용한 object detector에선 대부분 bounding box + box의 objectiveness 확률(class별 확률)들이 나오게 되는데, 이 중 겹치는 부분(동일 객체에 대해 여러 bounding box가 쳐진 경우)을 제거하기 위해 사용된다.

Python implementation code

  • 출처: https://github.com/BichenWuUCB/squeezeDet/blob/master/src/utils/util.py
def nms(boxes, probs, threshold):
  """Non-Maximum supression.
  Args:
    boxes: array of [cx, cy, w, h] (center format)
    probs: array of probabilities
    threshold: two boxes are considered overlapping if their IOU is largher than
        this threshold
    form: 'center' or 'diagonal'
  Returns:
    keep: array of True or False.
  """
 
  order = probs.argsort()[::-1]
  keep = [True]*len(order)
 
  for i in range(len(order)-1):
    ovps = batch_iou(boxes[order[i+1:]], boxes[order[i]])
    for j, ov in enumerate(ovps):
      if ov > threshold:
        keep[order[j+i+1]] = False
  return keep

동작 알고리즘

  • 연산에는 IoU가 필요하며, IoU가 threshold 이상인 case에 대해서만 NMS 연산이 수행된다.
  • 연산 알고리즘은 다음과 같다.
    1. 동일한 class에 대해 confidence 순서대로 높-낮 순으로 정렬한다.(line 13)
    2. 가장 높은 confidence를 갖는 bounding box와 IoU가 일정 threshold 이상인 다른 bounding box가 존재한다면 동일한 객체를 탐지한것으로 판단하고 지운다.(16~20)
      • 보통 threshold는 0.5로 한다.
views
Before
views
After