KNOWLEDGE · 물체 탐지

한 물체에 박스가 여러 개면, 무엇을 남길까?

두 박스가 얼마나 겹치는지는 IOU(겹친 넓이 ÷ 합친 넓이)로 잰다. 신뢰도가 낮은 박스를 먼저 버리고, 남은 박스 중 신뢰도 1위와 IOU가 기준을 넘게 겹친 박스를 지우면(NMS) 물체마다 박스가 하나 남는다.

YOLOv1 페이지에는 IOU와 NMS가 설명 없이 나온다. 둘은 이어져 있다. IOU로 두 박스가 얼마나 겹치는지 재고, NMS는 그 값으로 한 물체에 겹친 박스를 하나만 남긴다. 두 장면을 직접 만져 보자.

  1. 01 IOU두 박스의 겹침 재기
  2. 02 NMS박스 하나만 남기기

01 IOU

겹친 넓이 ÷ 합친 넓이

IOU(Intersection over Union)는 두 박스가 겹친 넓이를 두 박스를 합친 넓이로 나눈 값이다. 완전히 겹치면 1, 닿지 않으면 0이다. 물체 탐지 대회 PASCAL VOC는 정답 박스와 IOU가 0.5를 넘어야 맞은 탐지로 센다.

예측 박스를 끌어 옮기고, 오른쪽 아래 모서리를 끌어 크기를 바꿔 보자. 키보드로는 그림을 선택한 뒤 화살표로 옮기고, Shift와 화살표로 크기를 바꾼다.

IOU

0.46

VOC 기준 틀림 · 0.5를 넘지 못했다

겹친 넓이 8.4 ÷ 합친 넓이 18.2 = 0.46 (사진 넓이 = 100)

꽤 겹쳐 보여도 IOU는 0.46이다. VOC 기준에서는 틀린 박스다.

사진 폭의 5%만큼 옆으로 밀었을 때, 박스 폭에 따른 IOU

YOLOv1에서 IOU가 쓰이는 곳

  • 신뢰도: 박스마다 내는 신뢰도는 정답 박스와의 IOU를 배운다. YOLOv1 01 격자
  • 책임: 한 칸의 박스 2개 중 정답과 IOU가 큰 쪽이 그 물체를 맡는다.
  • 벌점: 같은 크기 오차도 작은 박스의 IOU를 더 떨어뜨려서, w 대신 √w를 배운다. YOLOv1 04 학습
  • 추론: 한 물체에 겹친 박스를 IOU로 가려 지운다. 아래 02 NMS
  • 채점: 논문의 성적(mAP)은 정답과 IOU가 0.5를 넘는 박스를 맞음으로 센다.

출처: PASCAL VOC 논문 §4.2 식 3, VOC2007 개발 키트 §4.4, YOLOv1 논문 §2, §2.2, §2.4, GIoU 논문 §3 · 5% 이동의 IOU는 이 페이지의 계산

02 NMS

개 한 마리에 박스는 하나만

신경망은 물체 하나를 두고도 박스를 여러 개 낸다. YOLOv1에서는 큰 물체나 칸 경계에 걸친 물체를 여러 칸이 함께 잡는다. 그래서 박스를 두 번 걸러 하나만 남긴다. ① 신뢰도가 기준보다 낮은 박스를 버린다. ② 남은 박스 중 신뢰도가 가장 높은 박스를 남기고, 그 박스와 IOU가 기준을 넘는 박스를 지운다. 남은 박스가 없을 때까지 ②를 되풀이한다. 이 ②가 NMS(Non-Maximum Suppression, 겹침 제거)다.

단계 탭을 차례로 눌러 박스 6개가 1개가 되는 과정을 따라가 보자. 그다음 두 기준을 바꾸거나 박스를 끌어 옮겨 보자. 키보드로는 탭에서 ← →로 단계를 옮기고, 그림을 선택한 뒤 [ ]로 박스를 고르고 화살표로 옮긴다.

7 / 7

끝. 후보 6개 중 신뢰도로 2개, NMS로 3개가 걸러져 A 박스 하나가 남았다. 개 한 마리에 박스 하나.

후보6
① 신뢰도 통과4
② NMS 뒤 최종1

기본값 0.2와 0.4는 YOLOv1 저자의 Darknet 코드가 쓰는 값이다. 신뢰도 기준을 0.1로 내리면 일부만 잡은 E 박스가 끝까지 남는다. A 박스와 겹침이 0.23뿐이라 NMS가 다른 물체의 박스로 보기 때문이다. 겹침 기준을 0.7로 올리면 B, C, D 박스도 남아 개 한 마리에 박스가 넷이 된다. 반대로 겹침 기준을 너무 낮추면, 붙어 있는 다른 개의 박스까지 지워서 그 개를 놓친다.

출처: YOLOv1 논문 그림 1, §2.3, Darknet examples/yolo.c(test_yolo의 기본값), R-CNN 논문 §2.2, Soft-NMS 논문 초록 · 박스는 설명을 위해 만든 예시

정리

박스 하나만 남기기까지

  1. IOU로 두 박스가 얼마나 겹치는지 0에서 1 사이로 잰다. 정답과 IOU가 0.5를 넘으면 흔히 맞은 박스로 친다.
  2. 신뢰도가 기준보다 낮은 박스를 먼저 버린다. YOLOv1 저자의 코드는 0.2를 쓴다.
  3. NMS는 남은 박스 중 신뢰도가 가장 높은 박스를 남기고, 그 박스와 IOU가 기준을 넘는 박스를 지운다. 남은 박스가 없을 때까지 되풀이하면 물체마다 박스가 하나 남는다.

오해IOU 0.5면 박스가 반쯤 맞은 것이다.

실제로는같은 크기 박스를 폭의 ⅓만 밀어도, 넓이만 2배로 키워도 IOU는 0.5다. PASCAL VOC는 정답 박스 자체가 부정확할 수 있어 기준을 일부러 0.5로 낮게 잡았다.

오해NMS 겹침 기준은 낮을수록 깔끔하다.

실제로는기준을 너무 낮추면 붙어 있는 다른 물체의 박스까지 지워서 그 물체를 놓친다. 반대로 너무 높이면 한 물체에 박스가 여럿 남는다.

출처: PASCAL VOC 논문 §4.2, Darknet examples/yolo.c, R-CNN 논문 §2.2, Soft-NMS 논문 초록·§4 · IOU 0.5 예시는 이 페이지의 계산

질문

자주 묻는 질문

IOU(IoU)란 무엇인가?

두 박스가 겹친 넓이를 두 박스를 합친 넓이로 나눈 값이다(Intersection over Union). 0에서 1 사이이고, 완전히 겹치면 1, 닿지 않으면 0이다. Jaccard 지수라고도 부르며, 물체 탐지에서는 예측 박스가 정답 박스와 얼마나 맞는지 잴 때 쓴다.

IOU 0.5는 어느 정도로 맞은 것인가?

같은 크기의 박스를 폭의 3분의 1만큼 옆으로 밀거나, 중심은 그대로 두고 넓이만 2배로 키워도 IOU는 0.5다. PASCAL VOC는 정답 박스 자체가 부정확할 수 있어 기준을 일부러 0.5로 낮게 잡았고, 0.5를 넘어야 맞은 탐지로 센다.

NMS(Non-Maximum Suppression)란 무엇인가?

한 물체를 여러 박스가 겹쳐 잡았을 때 하나만 남기는 후처리다. 남은 박스 중 신뢰도가 가장 높은 박스를 남기고, 그 박스와 IOU가 기준을 넘는 같은 클래스의 박스를 지운다. 이것을 남은 박스가 없을 때까지 되풀이하고, 클래스마다 따로 한다.

신뢰도 기준과 NMS는 어떤 순서로 하나?

YOLOv1 저자의 Darknet 코드는 신뢰도가 0.2보다 낮은 박스를 먼저 버리고, 남은 박스로 IOU 0.4 기준의 NMS를 한다. 신뢰도로 먼저 거르지 않으면, 물체의 일부만 잡은 낮은 신뢰도 박스가 NMS를 빠져나가 결과에 남을 수 있다. 이 페이지의 02에서 신뢰도 기준을 0.1로 내리면 볼 수 있다.

NMS 겹침 기준은 얼마로 정하나?

모든 경우에 맞는 값은 없다. 기준을 낮추면 붙어 있는 다른 물체의 박스까지 지워 그 물체를 놓치고, 높이면 중복 박스가 남는다. YOLOv1 저자의 Darknet 코드는 0.4를 쓰고, Soft-NMS 논문에 따르면 Faster R-CNN과 R-FCN은 0.3을 기본값으로 쓴다.

YOLOv1에서 IOU는 어디에 쓰이나?

박스마다 내는 신뢰도가 정답 박스와의 IOU를 배우고, 한 칸의 박스 2개 중 정답과 IOU가 큰 쪽이 그 물체를 맡는다. 추론에서는 NMS가 IOU로 한 물체에 겹친 박스를 지운다. 논문의 성적(mAP)도 정답과 IOU가 0.5를 넘는 박스를 맞음으로 센다.

출처: PASCAL VOC 논문 §4.2, VOC2007 개발 키트 §4.4, GIoU 논문 §3, YOLOv1 논문 §2, §2.2, §2.3, Darknet examples/yolo.c, R-CNN 논문 §2.2, Soft-NMS 논문 §4 · IOU 0.5 예시와 02의 결과는 이 페이지의 계산

더 보기

02의 장면과 박스는 설명을 위해 만든 예시다. 예시의 IOU와 NMS 결과는 파이썬으로 따로 계산해 이 페이지의 계산과 같은지 확인했다.