Non maximum supression(NMS)
02 May 2019 | Non maximum suppression NMSNon 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 연산이 수행된다.
- 연산 알고리즘은 다음과 같다.
- 동일한 class에 대해 confidence 순서대로 높-낮 순으로 정렬한다.(line 13)
- 가장 높은 confidence를 갖는 bounding box와 IoU가 일정 threshold 이상인 다른 bounding box가 존재한다면 동일한 객체를 탐지한것으로 판단하고 지운다.(16~20)
- 보통 threshold는 0.5로 한다.