1. NMS
- NMS란 하나의 객체(object)에 bbox가 여러개 만들어진 경우 각 객체당 confidence가 가장 큰 bbox 하나만 남기는 기법이다.
- 가장 정확한 bbox 하나만 남기는데, optimal bbox를 찾을 수는 없고, bbox 후보 중 가장 정확도가 높은 bbox를 찾는다. (local maxima를 찾는 과정)
2. NMS 과정
- 각 bbox는 해당 객체를 얼마나 잘 detect하는지를 나타내는 confidence 값을 가진다. 모든 bbox에 대하여 threshold 이하의 confidence값을 가지는 bbox는 제거한다. (threshold를 기준으로 1차적으로 필터링)
- confidence score를 기준으로 나머지 bbox를 내림차순 정렬한다.
- 첫번째 bbox를 기준으로 다른 bbox와의 IoU를 계산한다. IoU ≤ threshold인 bbox를 제거한다. ⇒ IoU가 크다는건 이미 두 bbox가 많이 겹친다는 의미이기 때문이다.
- 순차적으로 모든 bbox(첫번째, 두번째 … bbox)를 기준으로 비교해 제거한다.
→ confidence threshold가 높을수록, IoU threshold가 낮을수록 많은 bbox가 제거된다.
위키독스에 이해하기 쉬운 예시가 있어 가져왔다.
3. PyTorch로 구현하기
import torch
def nms(bboxes, threshold, iou_threshold, box_format='corners'):
"""
Parameters:
bboxes(list) : 모든 bbox의 정보를 담고 있음. [class_pred, prob_score, x1, y1, x2, y2]
threshold(float) : 몇 퍼센트의 확률로 bbox가 해당 클래스를 예측하는지
iou_threshold(float) : 얼만큼 겹쳐야 같은 bbox로 생각할건지
box_format(str) : bbox 정보가 (x1, y1, x2, y2) 형식으로 들어옴
Returns:
list : IOU threshold가 주어졌을 때 NMS 수행 이후 남은 bbox
"""
assert type(bboxes) == list
bboxes = [box for box in bboxes if box[1] > threshold] # confidence > threshold인 bbox만 선택
bboxes = sorted(bboxes, key=lambda x:x[1], reverse=True) # confidence 내림차순 정렬
bboxes_nms = []
# 정렬한 모든 bbox 확인
while bboxes:
chosen_box = bboxes.pop(0) # 가장 confidence가 큰 bbox부터
print('chosen:', chosen_box)
# confidence가 가장 큰 bbox와 다른 클래스이거나
# 기준 bbox와의 iou가 임계치보다 낮거나 class가 다르면 bboxes에 남기고, 나머지는 없애기
bboex = [box for box in bboxes if box[0] != chosen_box[0] \
or cal_iou(torch.tensor(chosen_box[2:]), torch.tensor(box[2:]), box_format=box_format) < iou_threshold]
bboxes_nms.append(chosen_box)
return bboxes_nms
bbox 1개만 남은 것을 확인할 수 있다.
4. NMS의 문제점
object끼리 겹칠 때 다른 object지만 많이 겹쳐 IoU가 threshold보다 커지면 다른 object의 bbox도 날아간다.
예를 들어 위 그림처럼 차가 겹쳐있는 경우에 3대의 차가 겹쳐있다면 object는 3개지만 bbox는 1개만 남는다.
이러한 NMS의 문제점을 해결하기 위한 아이디어가 Anchor box이다.
Anchor box는 detect하려는 object의 모양을 정해놓고, object가 detect되었을 때 어떤 anchor box와 유사한지 판단해 벡터값을 할당하는 방식이다.
다양한 종횡비(aspect ratio=w/h)와 크기(scale)로 이루어진 anchor box를 정의해 bbox를 구한다.
참고 자료
'Deep Learning > Object Detection' 카테고리의 다른 글
SPPnet (1) | 2022.09.04 |
---|---|
R-CNN (0) | 2022.09.04 |
성능 평가 지표 3(속도) (0) | 2022.09.04 |
IoU (Intersection over Union) (0) | 2022.09.03 |
성능 평가 지표 2 (0) | 2022.09.03 |