파이톨치

[개념정리] NMS, NMW 본문

AI&ML

[개념정리] NMS, NMW

파이톨치 2024. 10. 22. 14:56
728x90

NMS(Non-Maximum Suppression)와 NMW(Non-Maximum Weighting)는 주로 객체 탐지 및 관련 작업에서 사용되는 기술로, 앙상블 방법을 통해 모델의 성능을 향상시키는 데 기여합니다. 다음은 이 두 기술의 개요와 하이퍼파라미터에 대한 설명입니다.

 

NMS (Non-Maximum Suppression)

  • 목적: NMS는 중복된 탐지를 제거하여 최종 탐지 결과를 정제하는 데 사용됩니다. 객체 탐지 모델이 동일한 객체에 대해 여러 바운딩 박스를 생성할 때, 가장 높은 신뢰도를 가진 바운딩 박스를 선택하고 나머지는 제거합니다.
  • 작동 원리:
    1. 신뢰도(score)가 높은 순서대로 바운딩 박스를 정렬합니다.
    2. 가장 높은 신뢰도를 가진 박스를 선택하고, 그와 겹치는 박스들을 제거합니다.
    3. 이 과정을 모든 박스가 선택되거나 제거될 때까지 반복합니다.

from ensemble_boxes import nms

prediction_strings = []
file_names = []
# ensemble 시 설정할 iou threshold 이 부분을 바꿔가며 대회 metric에 알맞게 적용해봐요!
iou_thr = 0.4

# 각 image id 별로 submission file에서 box좌표 추출
for i, image_id in enumerate(image_ids):
    prediction_string = ''
    boxes_list = []
    scores_list = []
    labels_list = []
    image_info = coco.loadImgs(i)[0]
    # 각 submission file 별로 prediction box좌표 불러오기
    for df in submission_df:
        predict_string = df[df['image_id'] == image_id]['PredictionString'].tolist()[0]
        predict_list = str(predict_string).split()

        if len(predict_list)==0 or len(predict_list)==1:
            continue

        predict_list = np.reshape(predict_list, (-1, 6))
        box_list = []

        for box in predict_list[:, 2:6].tolist():
            # box의 각 좌표를 float형으로 변환한 후 image의 넓이와 높이로 각각 정규화
            image_width = image_info['width']
            image_height = image_info['height']
            box[0] = float(box[0]) / image_width
            box[1] = float(box[1]) / image_height
            box[2] = float(box[2]) / image_width
            box[3] = float(box[3]) / image_height
            box_list.append(box)

        boxes_list.append(box_list)
        scores_list.append(list(map(float, predict_list[:, 1].tolist())))
        labels_list.append(list(map(int, predict_list[:, 0].tolist())))

    # 예측 box가 있다면 이를 ensemble 수행
    if len(boxes_list):
        # ensemble_boxes에서 import한 nms()를 사용하여 NMS 계산 수행
        # 👉 위의 코드에서 만든 정보들을 함수에 간단하게 적용해보세요!
        # nms에 필요한 인자: [NMS할 box의 lists, confidence score의 lists, label의 list, iou에 사용할 threshold]
        boxes, scores, labels = nms(boxes_list, scores_list, labels_list, iou_thr=iou_thr)
        for box, score, label in zip(boxes, scores, labels):
            prediction_string += str(label) + ' ' + str(score) + ' ' + str(box[0] * image_info['width']) + ' ' + str(box[1] * image_info['height']) + ' ' + str(box[2] * image_info['width']) + ' ' + str(box[3] * image_info['height']) + ' '

    prediction_strings.append(prediction_string)
    file_names.append(image_id)

 

위 코드와 같이, 박스 정보를 사용해서 앙상블 한다. 

 

NMW (Non-Maximum Weighting)

  • 목적: NMW는 여러 모델의 예측을 결합하여 최종 결과를 도출할 때 사용됩니다. 각 모델의 예측에 가중치를 부여하여 성능을 극대화합니다
    1. 각 모델의 예측 결과를 기반으로 가중치를 부여합니다.
    2. 높은 성능을 보이는 모델에 더 높은 가중치를 할당합니다.
    3. 가중치를 기반으로 최종 예측을 결정합니다.

하이퍼파라미터 설정

NMS 및 NMW에 대한 하이퍼파라미터 설정은 모델의 성능에 중요한 영향을 미칠 수 있습니다.

  1. NMS 관련 하이퍼파라미터:
    • IoU(Intersection over Union) 임계값: 박스를 선택할 때 얼마나 많은 겹침을 허용할지 결정하는 값입니다. 일반적으로 0.5 또는 0.7로 설정되며, 높은 값을 설정하면 더 엄격한 선택 기준이 됩니다.
    • 최대 바운딩 박스 수: 최종 결과에 포함될 최대 바운딩 박스 수를 설정합니다. 이 값을 적절히 설정하여 결과의 다양성을 조절할 수 있습니다.
  2. NMW 관련 하이퍼파라미터:
    • 모델 가중치: 각 모델의 성능에 따라 가중치를 설정합니다. 예를 들어, k-fold 교차 검증을 통해 각 모델의 평균 성능을 계산하고, 성능이 좋은 모델에 더 높은 가중치를 부여할 수 있습니다.
    • 가중치 스케일링: 가중치를 정규화하거나 스케일링하여 모든 모델의 가중치가 합쳐질 때 1이 되도록 합니다. 이렇게 하면 모델 간의 상대적인 성능을 유지하면서도 안정적인 예측 결과를 얻을 수 있습니다.

성능이 좋은 값에 가중치 주기

성능이 좋은 모델에 가중치를 주는 방법:

  • Cross-validation: 각 모델의 성능을 k-fold 교차 검증을 통해 평가하고, 이 값을 가중치로 사용합니다.
  • Weighted Averaging: 성능에 기반하여 가중치를 부여한 후, 예측 결과를 가중 평균하여 최종 결과를 도출합니다. 이 방법은 예측의 신뢰성을 높이고, 모델 간의 다양성을 유지하는 데 유리합니다.

이러한 기술을 통해 NMS와 NMW는 앙상블 모델의 성능을 향상시키고, 더 정확한 예측 결과를 생성하는 데 기여할 수 있습니다.

728x90