1. 실험배경 · 목적
실험배경 : yolo논문에서 제시된 한계점이 실질적 영향을 확인하고자 하였습니다.
목적 : yolo의 한계점인 작은객체 탐지와 공간적 제약을 실험적으로 분석하고 개선 가능성을 탐구해보는것입니다.
2. 실험 목표와 한계점 정의
실험에서 확인할 한계점
1. 작은객체 탐지가 어렵습니다.
=> 작은 객체를 정확히 로컬라이즈하는데 어려움을 느끼며, 근접한 여러 객체를 탐지하는데도 제한이 있습니다.
2. 공간적 제약이 있습니다
=> 각 그리드 셀의 2개의 바운딩 박스만 예측하고 한 가지 클래스만 처리할 수 있기때문에 근접한 객체를 탐지하기 어렵습니다.
3. 손실함수의 한계가 있습니다. (이번실험에서는 제외되었음)
=> 손실함수는 작은 바운딩 박스와 큰 바운딩박스에서 발생하는 오류를 동일하게 처리하여
작은 객체에 더 큰 영향을 미칩니다.
그렇지만 여기서3 번은 사실 간단하게 확인하기 어렵기때문에 1,2번에 중점을 두고 진행되었습니다.
3. 실험 과정
3-1 작은 객체 탐지 실험
이미지 설명:
- 갈매기와 새떼, 물고기가 있는 이미지 사용
- 다양한 크기와 해상도(320*640, 448,640,480,640)
생각보다 잘 잡는것을 확인할 수 있습니다. 종횡비여도 객체가 뚜렷하게 보이는것은 탐지를 잘 하는것으로 확인됩니다.
이런 부분도 2마리정도는 못잡는데 대체적으로는 잘 잡는것같습니다.
역시나 한 그리드안에 여러개의 객체가 있는 새 떼같은경우는 잘 잡지못하는 부분을 확인할 수 있습니다.
단 1마리도 잡지못하는것을 확인했습니다.
결과:
해상도 | 결과 | 이유 |
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가 근접하게 배치된 이미지 사용
결과:
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으로 변경해도 아직 잘 잡지 못하는 현상이 있습니다.
이렇게 변경해도 성능개선이 되지않았습니다. 왜 이런지 한번 다시보니 이미지 리사이징을 하면서 겉에 패딩으로 둘러싸여서 결국 한 그리드셀에 겹치는 부분은 해결되지 않는다는것을 확인할 수 있습니다.
그렇다고 이미지를 무리하게 늘릴경우는 화질이 깨지겠죠?ㅠㅠ
3.4 YOLO5로 개선 가능성 실험
-모델 변경, 하이퍼파라미터조정, 결과를 아래에 서술했습니다.
이 부분은 확실히 한계점으로 느껴지기는 합니다.
물론 한계점을 극복하는 방법으로는 1.모델 파인튜닝(재학습) 해서 객체를 잘 잡게 할 수는 있지만
이미 YOLO5가 나와있기때문에 YOLO5로 확인해보도록 하겠습니다.
모델 | 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. 결론 및 개선 방안
결론
- 작은 객체 탐지와 공간적 제약은 YOLO의 명확한 한계점으로 확인.
- 데이터셋 확장 및 파인튜닝을 통해 개선 가능성 존재.
개선 방안
- 데이터셋 업그레이드: 작은 객체와 다양한 클래스 포함.
- 모델 구조 개선: YOLO의 그리드 기반 구조 보완.
- 파인튜닝: 특정 문제 상황에 적합한 재학습.
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
일단 이번은 한계점을 확인하기 위한것이기때문에 두개 모두 잡는것은
개선과제로 남겨두겠습니다.