본문 바로가기
Project/YOLO 의 한계점

YOLO의 한계점 실험 및 분석 - 작은객체탐지와 공간적 제약

by 바다의 공간 2024. 12. 12.

1. 실험배경 · 목적

실험배경 : yolo논문에서 제시된 한계점이 실질적 영향을  확인하고자 하였습니다.

목적 : yolo의 한계점인 작은객체 탐지와 공간적 제약을 실험적으로 분석하고 개선 가능성을 탐구해보는것입니다.

 

 


2. 실험 목표와 한계점 정의

실험에서 확인할 한계점

1. 작은객체 탐지가 어렵습니다.

=> 작은 객체를 정확히 로컬라이즈하는데 어려움을 느끼며, 근접한 여러 객체를 탐지하는데도 제한이 있습니다.

 

2. 공간적 제약이 있습니다

=> 각 그리드 셀의 2개의 바운딩 박스만 예측하고 한 가지 클래스만 처리할 수 있기때문에 근접한 객체를 탐지하기 어렵습니다.

 

3. 손실함수의 한계가 있습니다. (이번실험에서는 제외되었음)

=> 손실함수는 작은 바운딩 박스와 큰 바운딩박스에서 발생하는 오류를 동일하게 처리하여 

작은 객체에 더 큰 영향을 미칩니다.

 

그렇지만 여기서3 번은 사실 간단하게 확인하기 어렵기때문에 1,2번에 중점을 두고 진행되었습니다.


3. 실험 과정


3-1 작은 객체 탐지 실험

이미지 설명:

- 갈매기와 새떼, 물고기가 있는 이미지 사용

- 다양한 크기와 해상도(320*640, 448,640,480,640)

 

 

480 * 640

 

생각보다 잘 잡는것을 확인할 수 있습니다. 종횡비여도 객체가 뚜렷하게 보이는것은 탐지를 잘 하는것으로 확인됩니다.

 

480 * 640

 

 

이런 부분도 2마리정도는 못잡는데 대체적으로는 잘 잡는것같습니다.

 

320 * 640

역시나 한 그리드안에 여러개의 객체가 있는 새 떼같은경우는 잘 잡지못하는 부분을 확인할 수 있습니다.

단 1마리도 잡지못하는것을 확인했습니다.

 

448 * 640


결과:

해상도 결과 이유
480*640 갈매기는 탐지, 물고기 탐지 실패 데이터셋에 fish 클래스 없음
320*640 새 떼 탐지 실패 한 그리드 안에 객체 다수 포함

 

갈매기는 잘 탐지했지만 새떼와 물고기는 탐지 실패

실패이유 : 데이터셋에 fish클래스가 포함되어있지 않음(pascal VOC 기준)

Aeroplane, Bicycle, Bird, Boat, Bottle, Bus, Car, Cat, Chair, Cow, Diningtable, Dog, Horse, Motorbike, Person, Pottedplant, Sheep, Sofa, Train, TV/Monitor.

 

그러면 데이터셋을 좀 더 업그레이드 시키거나 사진을 변경해야하는데 저는 욜로의 기본모델의 성능중 한계점을 확인해보기 위해서니 인덱스 되어있는 객체만 사용하도록 하겠습니다.

 

여기서  작은객체 탐지가 어려운 것에대한 궁금증은 해소가 됐습니다.

=> 작은 객체를 정확히 로컬라이즈하는데 어려움을 느끼며, 근접한 여러 객체를 탐지하는데도 제한이 있습니다.

=> 너무 심히 작은 객체가 아니면 어느정도는 잘 잡는다는것을 느꼈습니다. 이런 부분은 많이 확인해보면서 경험치를 쌓고되겠다, 안 되겠다의 감을 잡으면 효율이 좀 더 늘어날것같았습니다.


다음으로 궁금한 점은 2번입니다.

3-2 공간적 제약 실험

이미지 설명: 

Horse와 Dog가 근접하게 배치된 이미지 사용

 

 

480 * 640

결과:

Horse만 탐지하고  Dog는 예측하지 못함

이유분석 : YOLO의 그리드 기반 구조로 인해 동일한 그리드셀 내에서 높은 신뢰도를 가진 Horse만 선택됨.

 

조금 더 디테일하게 이러한 현상이 왜 발생하는지는 논문에 이미 나와있지만 리마인드로 이야기해보자면

 

YOLO는 그리드 기반설계이기때문에 이미지를 S*S 그리드로 나누고 각 그리드셀은 최대 2개의 바운딩 박스와 1개의 클래스를 예측하기때문입니다. 이 중 한개밖에 예측을 못 한다는것은 말과 강아지가 동일한 그리드셀에 놓여져있을 확률이 크다는거죠!

 

그중에 왜 말을 선택했냐?

그리드셀에서 가장 높은 confidence score를 가진 객체를 예측하기때문입니다. 강아지와 말 중의 말의 신뢰도가 더 높기때문에 말로 예측되었을것입니다.

 

근접 객체 탐지문제는 욜로의 한계에서 이미 언급되었던 문제입니다.

이렇게둘다 큰 객체임에도 불구하고 하나의 그리드셀에 있으면 두 객체 모두 예측하지 못한다는것이 한계점이죠.

 


 

3.3 해상도 변경 실험

해상도를 480*640, 640*640, 1024,1024로 변경

결과:

해상도를 변경해도 여전히 두 객체를 동시에 탐지하지 못함.

이유분석:

이미지 리사이징 과정에서 생기는 패딩 문제로 인해 그리드 간 경계 해결되지 않음.

 

좀 더 서술해보면..

그러면 이미지의 변화를 주어야하는데 이미지 입력 크기에 따라서 그리드 셀의크기도 달라지기때문에 

480*640 ->640*640으로 변경해보겠습니다

이렇게 입력크기를 늘리면 그리드 셀 크기가 작아지기 때문에 그리드에 겹칠 가능성이 좀 더 낮아지겠죠

그러면 탐지성능이 개선된다고 볼 수 있겠죠!

640*640

640*640으로 변경해도 아직 잘 잡지 못하는 현상이 있습니다.

 

1024*1024

이렇게 변경해도 성능개선이 되지않았습니다. 왜 이런지 한번 다시보니 이미지 리사이징을 하면서 겉에 패딩으로 둘러싸여서 결국 한 그리드셀에 겹치는 부분은 해결되지 않는다는것을 확인할 수 있습니다.

그렇다고 이미지를 무리하게 늘릴경우는 화질이 깨지겠죠?ㅠㅠ


 

3.4 YOLO5로 개선 가능성 실험

-모델 변경, 하이퍼파라미터조정, 결과를 아래에 서술했습니다.

 

이 부분은 확실히 한계점으로 느껴지기는 합니다.

물론 한계점을 극복하는 방법으로는 1.모델 파인튜닝(재학습) 해서 객체를 잘 잡게 할 수는 있지만

이미 YOLO5가 나와있기때문에 YOLO5로 확인해보도록 하겠습니다.

모델 yolo5s yolo5m yolo5l
이미지
yolo5s
yolo5m
yolo5l
특징 말 감지가 더 낮아졌습니다. 초기 욜로정도로 잡는것같습니다 말예측이 0.87로
꽤 높게 나왔습니다

 

 

그런데 여전히 두 객체를 동시에 잡는것은 불가능해보였습니다.

 

그래서 좀 더 딥하게 하이퍼파라미터를 조정해보려고합니다 yolo5모델에서!

파라미터명 conf_thres iou_thres
역할 객체탐지 신뢰도를 조정합니다.
(이 물체가 얼마나 맞는지 확신하는지 설정함)
겹치는 박스를 얼마나 합칠지 조정합니다.
(박스가 얼마나 겹치면 같은 물체로 볼지 설정함)

 

초기설정은 conf_thres=0.25, iou_thres=0.45가 욜로의 기본값이기때문에

conf_thres 를 낮출수록 객체를 더 많이 잡습니다.

즉 미탐지를 줄이지만 단점으로는 신뢰도가 낮은 잘못된 탐지가 늘어나겠죠?

값을 높이면 오탐지를 줄이는대신에 위 사진처럼 두개의 객체를 못잡는 경우가 있겠죠?

 

iou_thres를 높일수록 중복탐지를 줄입니다.

이 친구의 역할은 중복탐지를 줄이기 위해서 바운딩 박스가 겹치는 정도를 조정하는데

값을 높이게되면 중복탐지를 줄이고 한 객체에 대해 여러박스가 나오지 않고

단점이라면 일부 객체가 잘못제거될수있겠죠?

 

값을 낮추게되면 더 많은 바운딩박스를 허용하는대신에 같은 객체에 대한 중복박스가 늘어날수있습니다.

그래서 이 값들을 적절하게 해야합니다.

 

 

 

일단 정확하고 많은 탐지를 원하기때문에... 각각 값을 0.1과 0.6으로 맞춰주었습니다.

모델 yolo5s yolo5m yolo5l
파라미터 수정 conf-thres 0.1
iou-thres 0.6
conf-thres 0.1
iou-thres 0.7
conf-thres 0.1
iou-thres 0.9
결과

 

생각보다 잘 잡히지 않는것을 확인했고 위 문제는 확실한 욜로의 한계점이라고 생각합니다.

그렇지만 좀 더 많은 데이터셋을 가지고 욜로를 학습시킨후 다시 예측을 한다면 잘 잡을 확률이 높겠죠!


4. 결론 및 개선 방안

결론

  1. 작은 객체 탐지와 공간적 제약은 YOLO의 명확한 한계점으로 확인.
  2. 데이터셋 확장 및 파인튜닝을 통해 개선 가능성 존재.

개선 방안

  1. 데이터셋 업그레이드: 작은 객체와 다양한 클래스 포함.
  2. 모델 구조 개선: YOLO의 그리드 기반 구조 보완.
  3. 파인튜닝: 특정 문제 상황에 적합한 재학습.

5. 참고코드, 데이터셋

코드)

# PyTorch와 torchvision 설치 (필요한 경우)
!pip install torch torchvision

# YOLOv5 설치
!git clone https://github.com/ultralytics/yolov5
%cd yolov5
!pip install -r requirements.txt

# torch.hub로 YOLOv5 모델을 로드
import torch
from google.colab import files

# YOLOv5 사전 학습된 모델 불러오기 ('yolov5s'는 소형 모델)
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')  # 'yolov5s', 'yolov5m', 'yolov5l' 등 선택 가능

# 이미지 업로드
uploaded = files.upload()

# 업로드한 이미지 이름 가져오기
image_path = list(uploaded.keys())[0]  # 업로드된 첫 번째 파일 경로
print(f"Uploaded image path: {image_path}")

# YOLOv5 탐지 실행 (torch.hub 방식)
results = model(image_path)

# 탐지 결과 출력 및 표시
results.print()  # 탐지된 클래스 정보 출력
results.show()   # 탐지 결과 이미지 표시

# 탐지 결과를 저장
results.save()  # 저장된 결과는 runs/detect/exp/ 폴더에 위치

# detect.py로 동일한 이미지를 탐지하고 결과 비교
!python detect.py --source "{image_path}" --weights "yolov5s.pt" --conf-thres 0.1 --iou_thres 0.6 --img-size 640

 

데이터셋)

https://github.com/ultralytics/yolov5

 

GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite

YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.

github.com

 

일단 이번은 한계점을 확인하기 위한것이기때문에 두개 모두 잡는것은

개선과제로 남겨두겠습니다.