Yolov5, Yolov8 학습 후 바운딩박스 detect시 한 객체에 바운딩 박스 여러개 검출하고 싶어요.

GPU를 통해 바운딩 박스 학습과 검출을 실행 중입니다.
Yolov5와 Yolov8을 사용해서 음식 객체를 인식하고 검출하는데 하나의 음식에 대해 검출 결과를 보여줄 때, 하나의 음식에 대해 여러 class로 예측한 결과도 보고 싶습니다. 예측한 결과를 응용해서 그 중에서 맞는 class를 사용자가 체크해서 다시 학습 시킬 수 있도록 만들려고 합니다. 어떻게 해야하는 건지 모르겠습니다. 알려주세요!

  • 아래 답변은 OpenAI의 GPT-3.5(ChatGPT) 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

Yolov5와 Yolov8은 객체 검출을 위한 모델로, 하나의 객체에 대해 하나의 바운딩 박스를 예측하는 것이 일반적입니다. 하지만, 하나의 객체에 대해 여러 class로 예측한 결과를 보고 싶다면, 다음과 같은 방법을 시도해 볼 수 있습니다.

  1. Non-maximum suppression(NMS)의 임계값을 낮추기
    NMS는 중복된 바운딩 박스를 제거하는 기술로, 일반적으로 높은 임계값을 사용합니다. 하지만, 임계값을 낮추면 중복된 바운딩 박스가 더 많이 검출될 수 있습니다. 따라서, NMS의 임계값을 낮추는 것이 하나의 객체에 대해 여러 class로 예측한 결과를 얻는 방법 중 하나입니다.

  2. Score threshold 조정하기
    객체 검출 모델은 각 바운딩 박스에 대한 예측 점수를 출력합니다. Score threshold를 조정하여 예측 점수가 낮은 바운딩 박스를 제거하면, 더 많은 바운딩 박스를 검출할 수 있습니다.

  3. 다른 모델 사용하기
    Yolov5와 Yolov8은 하나의 객체에 대해 하나의 바운딩 박스를 예측하는 모델입니다. 하지만, 하나의 객체에 대해 여러 class로 예측한 결과를 얻고 싶다면, 다른 모델을 사용해볼 수 있습니다. 예를 들어, Faster R-CNN, Mask R-CNN, RetinaNet 등의 모델은 하나의 객체에 대해 여러 바운딩 박스를 예측할 수 있습니다.

참고로, Yolov5와 Yolov8 모델은 PyTorch로 구현되어 있으며, PyTorch 공식 튜토리얼(Welcome to PyTorch Tutorials — PyTorch Tutorials 2.0.1+cu117 documentation)에서 관련 내용을 찾아볼 수 있습니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

Yolov5와 Yolov8 모델에서 한 객체에 대해 여러 개의 바운딩 박스를 검출하려면, 검출 결과를 처리하는 방식을 변경해야 합니다. 기본적으로, YOLO 모델은 NMS(Non-Maximum Suppression) 알고리즘을 사용하여 겹치는 박스를 제거하고 최종 결과를 출력합니다. 이 경우, NMS 알고리즘을 수정하거나 적용하지 않고 여러 개의 예측 결과를 얻을 수 있습니다.

다음은 이를 수행하는 방법입니다.

  1. YOLO 모델의 출력에서 NMS 알고리즘을 적용하지 않고, 객체에 대한 여러 개의 예측 결과를 얻습니다.

  2. 각 예측 결과에 대해 사용자가 확인할 수 있는 형태로 결과를 표시합니다. 예를 들어, 이미지에 여러 개의 바운딩 박스를 그리고, 각 박스에 클래스 이름과 확률을 표시합니다.

  3. 사용자가 올바른 클래스를 선택하면, 해당 정보를 사용하여 모델을 추가로 학습시킵니다.

다음은 PyTorch를 사용하여 YOLO 모델의 출력에서 NMS를 적용하지 않고 여러 개의 예측 결과를 얻는 예입니다.

import torch

# YOLO 모델의 출력 (예: [batch_size, num_boxes, 4+num_classes])
output = torch.randn(1, 10647, 4+80)

# 각 박스의 좌표와 클래스 확률을 분리합니다.
boxes = output[..., :4]
class_probs = output[..., 4:]

# 클래스 확률이 일정 임계값보다 큰 박스를 선택합니다.
threshold = 0.5
selected_boxes = boxes[class_probs > threshold]
selected_class_probs = class_probs[class_probs > threshold]

# 선택된 박스와 클래스 확률을 사용하여 결과를 표시하고 사용자의 선택을 기반으로 모델을 추가로 학습시킵니다.

이 예에서는 임의의 YOLO 모델 출력을 사용했지만, 실제 YOLO 모델에서 출력을 가져와 동일한 방식으로 처리할 수 있습니다. 이렇게 하면 한 객체에 대해 여러 개의 바운딩 박스와 클래스 예측을 얻을 수 있습니다. 이후 사용자의 선택을 기반으로 모델을 추가로 학습시키는 방법은 데이터셋과 학습 파이프라인에 따라 다를 수 있습니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!