250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- pyenv
- N-Queen
- 파이싼
- BOJ
- 기계학습
- 실버
- streamlit
- 4948
- 파이썬
- 밑바닥부터 시작하는 딥러닝
- 그리디 알고리즘
- Mac
- 설정
- Python
- 가상환경
- 9020
- 손실함수
- n과 m
- 개발환경
- 경사하강법
- 1101
- 백준
- 백트래킹
- 재귀
- 신경망 학습
- end to end
- 15649
- 1002
Archives
- Today
- Total
파이톨치
[개념정리] NMS, NMW 본문
728x90
NMS(Non-Maximum Suppression)와 NMW(Non-Maximum Weighting)는 주로 객체 탐지 및 관련 작업에서 사용되는 기술로, 앙상블 방법을 통해 모델의 성능을 향상시키는 데 기여합니다. 다음은 이 두 기술의 개요와 하이퍼파라미터에 대한 설명입니다.
NMS (Non-Maximum Suppression)
- 목적: NMS는 중복된 탐지를 제거하여 최종 탐지 결과를 정제하는 데 사용됩니다. 객체 탐지 모델이 동일한 객체에 대해 여러 바운딩 박스를 생성할 때, 가장 높은 신뢰도를 가진 바운딩 박스를 선택하고 나머지는 제거합니다.
- 작동 원리:
- 신뢰도(score)가 높은 순서대로 바운딩 박스를 정렬합니다.
- 가장 높은 신뢰도를 가진 박스를 선택하고, 그와 겹치는 박스들을 제거합니다.
- 이 과정을 모든 박스가 선택되거나 제거될 때까지 반복합니다.
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는 여러 모델의 예측을 결합하여 최종 결과를 도출할 때 사용됩니다. 각 모델의 예측에 가중치를 부여하여 성능을 극대화합니다
-
- 각 모델의 예측 결과를 기반으로 가중치를 부여합니다.
- 높은 성능을 보이는 모델에 더 높은 가중치를 할당합니다.
- 가중치를 기반으로 최종 예측을 결정합니다.
하이퍼파라미터 설정
NMS 및 NMW에 대한 하이퍼파라미터 설정은 모델의 성능에 중요한 영향을 미칠 수 있습니다.
- NMS 관련 하이퍼파라미터:
- IoU(Intersection over Union) 임계값: 박스를 선택할 때 얼마나 많은 겹침을 허용할지 결정하는 값입니다. 일반적으로 0.5 또는 0.7로 설정되며, 높은 값을 설정하면 더 엄격한 선택 기준이 됩니다.
- 최대 바운딩 박스 수: 최종 결과에 포함될 최대 바운딩 박스 수를 설정합니다. 이 값을 적절히 설정하여 결과의 다양성을 조절할 수 있습니다.
- NMW 관련 하이퍼파라미터:
- 모델 가중치: 각 모델의 성능에 따라 가중치를 설정합니다. 예를 들어, k-fold 교차 검증을 통해 각 모델의 평균 성능을 계산하고, 성능이 좋은 모델에 더 높은 가중치를 부여할 수 있습니다.
- 가중치 스케일링: 가중치를 정규화하거나 스케일링하여 모든 모델의 가중치가 합쳐질 때 1이 되도록 합니다. 이렇게 하면 모델 간의 상대적인 성능을 유지하면서도 안정적인 예측 결과를 얻을 수 있습니다.
성능이 좋은 값에 가중치 주기
성능이 좋은 모델에 가중치를 주는 방법:
- Cross-validation: 각 모델의 성능을 k-fold 교차 검증을 통해 평가하고, 이 값을 가중치로 사용합니다.
- Weighted Averaging: 성능에 기반하여 가중치를 부여한 후, 예측 결과를 가중 평균하여 최종 결과를 도출합니다. 이 방법은 예측의 신뢰성을 높이고, 모델 간의 다양성을 유지하는 데 유리합니다.
이러한 기술을 통해 NMS와 NMW는 앙상블 모델의 성능을 향상시키고, 더 정확한 예측 결과를 생성하는 데 기여할 수 있습니다.
728x90
'AI&ML' 카테고리의 다른 글
[Paper review] Co-DETR (1) | 2024.10.20 |
---|---|
[Robot] ros&gazebo 이륜차 만들기 (1) | 2024.08.26 |
[부스트캠프] 프리코스 정리 (1) | 2024.07.05 |
[부스트캠프] 인공지능 기초 다지기 - 딥러닝 - Layer (1) | 2024.07.03 |
[부스트캠프] 인공지능 기초 다지기 - 딥러닝 - PyTorch (1) | 2024.07.03 |