nayeoniee
개발공부 노트
nayeoniee
전체 방문자
오늘
어제
  • 분류 전체보기 (53)
    • Deep Learning (16)
      • 개념 정리 (6)
      • 논문 리뷰 (2)
      • 논문 구현 (0)
      • Object Detection (8)
    • Algorithm (16)
      • 개념 정리 (5)
      • 이코테 (1)
      • baekjoon (5)
      • programmers (4)
      • LeetCode (1)
    • Project (4)
      • Boostcamp AI Tech (4)
    • 자격증 (16)
      • AWS (1)
      • 정보처리기사 필기 (15)
    • 기타 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • LIS
  • python
  • 데이터제작
  • 그래프
  • ELECTRA
  • 이코테
  • aif-c01
  • F1 Score
  • selective search
  • 딥러닝
  • 서로소 집합
  • BFS
  • spatial pyramid pooling
  • 운영체제 #데이터베이스 관리시스템 #웹애플리케이션 #오픈소스 #OS #DBMS #WAS
  • 1-stage
  • KLUE
  • FLOPs
  • Anchor box
  • 현행시스템파악
  • 프로그래머스
  • boostcamp
  • 알고리즘
  • 이진탐색
  • re
  • 회고
  • 2-stage
  • object detection
  • 백준
  • wandb
  • dp

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nayeoniee

개발공부 노트

Deep Learning/Object Detection

NMS (Non Maximum Suppression)

2022. 9. 4. 01:22

1. NMS

  • NMS란 하나의 객체(object)에 bbox가 여러개 만들어진 경우 각 객체당 confidence가 가장 큰 bbox 하나만 남기는 기법이다.
  • 가장 정확한 bbox 하나만 남기는데, optimal bbox를 찾을 수는 없고, bbox 후보 중 가장 정확도가 높은 bbox를 찾는다. (local maxima를 찾는 과정)

 

2. NMS 과정

  1. 각 bbox는 해당 객체를 얼마나 잘 detect하는지를 나타내는 confidence 값을 가진다. 모든 bbox에 대하여 threshold 이하의 confidence값을 가지는 bbox는 제거한다. (threshold를 기준으로 1차적으로 필터링)
  2. confidence score를 기준으로 나머지 bbox를 내림차순 정렬한다.
  3. 첫번째 bbox를 기준으로 다른 bbox와의 IoU를 계산한다. IoU ≤ threshold인 bbox를 제거한다. ⇒ IoU가 크다는건 이미 두 bbox가 많이 겹친다는 의미이기 때문이다.
  4. 순차적으로 모든 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를 구한다.

 

 

 

참고 자료

  • 위키독스 - 한땀한땀 딥러닝 컴퓨터 비전 백과사전
  • PyTorch로 NMS 구현하기

'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
    'Deep Learning/Object Detection' 카테고리의 다른 글
    • SPPnet
    • R-CNN
    • 성능 평가 지표 3(속도)
    • IoU (Intersection over Union)
    nayeoniee
    nayeoniee

    티스토리툴바