NMS(non - maximum suppresssion)을 사용하여 연산량을 줄이고, aAP도 올리는 효과를 본다고 한다.
일반적으로 영상엣지를 찾기 위한 NMS는 현재 픽셀을 기준으로 주변의 픽셀과 비교했을 때 최대값인 경우 그래도 놔두고, 아닐 경우(비 최대) 억제(제거)하는 것이다.
(차 한대에 여러가지 bounding box가 그려지는 경우와 같은)을 제거하기 위한 방법으로 사용된다.
def nms(boxes, probs, threshold):
"""Non-Maximum suppression.
Args:
boxes : array of [cx, cy, w, h] (center formet)
prob : 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 jm ov in enumerate(ovps):
if ov > threshold:
keep[order[j+i+1]] = False
return keep
IoU = Area of overlap / Area of Union
결국 전체 박스 영역 중 겹치는 부분의 비율이다.
NMS를 하려는 가장 큰 이유는 역시 중복제거이기 때문에 예측한 박스들 중 IOU가 일정 이상인 것들에 대해서 수행하게 된다. 코드만 봐도 어떻게 수행하는지 대략 감을 잡을 수 있겠으나 간단히 설명하면
1. 동일한 클래스에 대해 높은-낮은 confidence순서로 정렬한다.(line 13)
2. 가장 confidence가 높은 boundingBox와 IOU가 일정 이상인 bounding box는 동일한 물체를 detect했다고 판단하여 기준다.(16-20) 보통 50%(0.5)이상인 경우 지우는 경우를 종종 보았다.
추가로 러시아의 연구자가 YOLO(you look only once)에 대해 설명하는 슬라이드에서 nms또한 자세히 다뤄주어 이해하는데 도움이 많이 되었다.
본 글은 아래의 글을 개인적 공부를 위해 필사하였습니다.
'필사적 필사' 카테고리의 다른 글
프로토타입 기반 프로그래밍 (0) | 2020.01.21 |
---|---|
JIT 컴파일 (0) | 2020.01.21 |
.net framework란 무엇일까? (0) | 2019.12.31 |
DEBUG와 RELEASE 컴파일의 차이 (0) | 2019.12.11 |
여러가지 확장자에 관하여 (0) | 2019.12.11 |