오늘은 Object Detection 과제에서 사용되는 후처리 알고리즘인 NMS에 대해 다뤄보고자 합니다.

Object Detection 모델을 학습한 뒤, 추론을 수행했을 때, 우리는 왼쪽의 이미지처럼 많은 Box를 얻을 수 있습니다.
이는 Box를 예측해야하는 모델의 특성 상, 무조건적으로 발생될 수 밖에 없는 문제라고 할 수 있습니다.
하지만 우리는 Detector를 통해 하나의 객체에 대해 하나의 박스를 예측하도록 출력을 도출하길 원합니다.
이런 상황에서 우리는 NMS(Non-Maximum Suppression)란 알고리즘을 적용하여 처리할 수 있습니다.
이 때, 사용되는 NMS란 무엇이고 어떤식으로 처리되는걸까요?
Object Detector Outputs

Detector가 어떠한 출력을 도출하는지 먼저 이해한 뒤, 아래 내용을 보면 조금 더 쉽게 이해할 수 있습니다.
이번 파트는 Object Detection 과제에서 Detector가 도출하는 출력에 대한 설명입니다.
우리가 접하는 대부분의 Object Detection 모델들의 출력에 대해, 위의 이미지로 간단하게 예를 들 수 있습니다.
YOLO 등의 모델에 이미지가 입력되고 나면, 여러 레이어를 거치며 작은 크기의 Feature map으로 표현됩니다.
위 이미지에서 1시 방향 격자 이미지가 YOLO v3에서 도출된 13 x 13 크기의 Feature map이라고 할 수 있습니다.
이후 Feature map의 모든 위치에서 앵커 박스의 개수만큼 객체에 대한 Box 좌표 등 여러 값을 계산합니다.

위의 예시를 기준으로 계산한다면, 13 x 13 크기의 모든 위치에서 3개의 앵커를 통해 85개의 결과를 도출합니다.
이는 하나의 F map에 대해 13 x 13 x 3 = 507, 그리고 각각 85개의 정보를 갖는 (507, 85)의 결과를 갖게됩니다.
만약 여기서 앵커가 더 늘어나거나, 다수의 Feature map을 함께 활용한다면, 결과는 더욱 늘어나게 됩니다.
이러한 Object Detection의 특성 상, 예측된 Box가 많을 수 밖에 없게 됩니다.
정리하자면, Detector는 Feature map을 통해, 여러 위치에서 객체의 정보가 담긴 정보들을 도출하게 됩니다.
도출된 정보들은 매우 많은 수의 (Box xywh, Confidence, Class) 형태를 가진다고 할 수 있게됩니다.
NMS를 이해하기 위한 기초 지식은 이정도로 마무리하고, 다음으론 NMS에 대해 다뤄보겠습니다.
NMS algorithm
앞서 Object Detection 모델이 어떠한 출력을 가지며, 그 안에 어떠한 정보들이 있는지 다루었습니다.
이전 포스트인 mAP 계산에서 IoU가 사용된 것처럼, NMS 과정에서도 역시 IoU 값이 사용됩니다.
추가적으로 Confidence score가 함께 사용되는데, 두 값 모두 어떠한 임계(Threshold)와 함께 사용됩니다.

위의 의사 코드는 NMS 알고리즘의 동작 과정을 간단하게 설명한 것이며, 동작 순서는 다음과 같습니다.
1. 예측된 전체 Bounding Box 데이터 중, Confidence score가 가장 큰 데이터를 선택/추출
2. 해당 데이터와 이를 제외한 나머지 모든 데이터에 대해 IoU를 계산
3. 계산된 IoU가 IoU threshold 보다 큰 데이터들은 모두 제거
4. 모든 데이터에 대해 많이 겹친 데이터가 제거되었다면, 1번으로 돌아가 반복
이러한 NMS를 전체 데이터에 대해 수행한다면, 타겟 객체에 대해 많이 겹친 데이터들은 모두 제거됩니다.

이렇게 놓고 보았을 때, NMS는 매우 긍정적이고 잘 동작할 것처럼 설명되지 않았나요?
물론 대부분의 상황에서 잘 동작하지만 몇몇 상황에서 원치 않은 방식으로 동작하는 경우가 있습니다.

위 이미지와 함께 '말'을 탐지하는 Object Detection 모델이 있다고 가정해보겠습니다.
이 경우엔 2마리에 말에 대해 각각 Box를 예측해주는 작업이 필요하며, 위처럼 예측했다고 가정해봅시다.
만약 위의 예측에서 NMS 알고리즘을 수행한다면 어떻게 될까요?
Threshold에 따라 다르겠지만 경우에 따라 남겨져야할 Box가 지워지는 문제가 발생할 수 있습니다.
이러한 NMS의 문제를 보완하기 위해 나온 것이 'Soft-NMS' 입니다.
그렇다면 Soft-NMS는 어떠한 방식으로 동작하기에 NMS의 문제를 보완할 수 있는걸까요?
Soft-NMS algorithm
Soft-NMS를 소개한 저자는 2가지 활용 방법에 대해 제안했습니다.
첫번째 Soft-NMS, Soft-NMS Linear의 활용은 다음과 같습니다.

가장 높은 Confidence score를 갖는 데이터에 대해 IoU를 계산하는 과정은 동일하지만, 내용은 약간 다릅니다.
이전 NMS는 IoU가 threshold보다 크다면 제거했지만, Soft-NMS에선 (1 - IoU) 만큼 Confidence를 조절합니다.
조절한 Confidence score가 어떻게 처리되는지는 이후에 다루고, 두번째 방법으로 넘어가보겠습니다.

두번째 Soft-NMS, Soft-NMS Gaussian 방법 또한 앞의 방법과 유사하면서도, 약간 다릅니다.
첫번째 방법은 IoU threshold에 따라 값을 조절했지만, 두번째 방법에선 IoU threshold를 사용하지 않습니다.
음의 지수를 통해 IoU가 겹친 크기만큼 Confidence score를 연속적으로 계속 조절해나갑니다.
만약 IoU가 작다면 값을 거의 그대로 유지하도록, IoU가 크다면 큰 만큼 Confidence score를 감소시킵니다.
Soft-NMS에서 제안하는 두가지 방법 모두 Confidence score를 감소시켰는데, 왜 이런 방법을 사용한걸까요?
앞서 NMS를 거치기 전 데이터는 아주 많은 수의 예측을 갖는다고 설명했습니다.
이러한 Soft-NMS의 처리를 수백, 수천번 반복한다면 데이터들의 Confidence score는 어떻게 변화할까요?
겹쳐있는 IoU 비율에 따라 score가 유지되거나, 아주아주 작은 값을 갖게 될 것 같습니다.
이렇게 score를 조절하고 난 다음엔, 드디어 일반 NMS 알고리즘처럼 Confidence threshold를 사용합니다!
대신, 0.25, 0.5 등의 큰 값이 아닌 0.001의 아주 작은 값의 Confidence threshold를 사용합니다.
그 이유는 앞선 설명처럼, 작은 IoU를 갖더라도 수백, 수천번 감소시키다보면 아주 작은 값을 갖게됩니다.
그렇기에 0.25 등의 높은 threshold를 사용한다면, 대부분의 Box가 제거되어 오히려 부정적인 영향을 주게됩니다.
이러한 이유로 작은 threshold를 통해, 적절하게 겹쳐있는 Box들은 살려서 활용하게 됩니다.
이러한 방식을 Soft-NMS 방식이라고 합니다.

제안된 Soft-NMS(S-NMS G, S-NMS L)와 NMS를 비교했을 때, 거의 대부분 Soft-NMS가 좋았다고 설명합니다.
물론 torchvision.ops.nms에서 제공되는 nms는 일반 NMS 방식을 사용하고 있습니다.
어떠한 이유로 인해, Soft-NMS 대신 NMS를 사용하는지 잘 모르겠지만, 저는 torchvision의 NMS를 사용해오며,
크게 불편을 느낀적은 없던 것 같습니다.
이에 대해선 어떠한 이유가 있는지, 조금 더 조사해보는 과정이 필요할 것 같습니다.
이번 포스트에선 NMS와 Soft-NMS에 대해 다루었습니다.
설명 드린 내용이 도움이 되었으면 하며, 잘못 되었거나 궁금하신 내용 또한 언제든 말씀 부탁드립니다.
긴 글 읽어주셔서 감사합니다.
'Deep Learning > Computer Vision' 카테고리의 다른 글
| Convolution의 개념과 연산에 대하여 (4) | 2024.06.14 |
|---|