Data science/이미지처리

[이미지처리] 5. YOLO 모델

endingo 2025. 4. 9. 16:14

★ 모델 평가:

NMS 과정을 통해 YOLO 모델 성능 평가를 하여 최종 분류탐색한다.

NMS 과정의 지표들

- IoU: 예측된 바운딩 박스와 실제 바운딩 박스가 겹치는 정도

- Confidence Score: 바운딩 박스가 정확한지 그리고 그 안에 객체가 존재하는지 평가하는 지표

 

 

 

1. 라이브러리 설치

!pip install ultralytics

 

2. 모델 사용

 

1) 모델 다운로드

 

테스크와 맞는 모델 선택이 중요하다

model: 모델 구조+ 가중치 설정

task: detect, segment, classify, pose

YOLO(model='yolo11n.py', task= 'detect')

model = YOLO(model='yolo11n.pt', task='detect')

 

2) 모델 사용

 

model을 통해 예측 작업 실행

model.predict(image_path, save=True)

results = model.predict(image_path, save=True)
results[0].show()  # 탐지된 객체 출력

욜로를 통해 사람을 인식했다.

 

 

3) 박스 실행

 

box.xyxy[0]: 박스의 위치정보 Bounding Box x_min, y_min, x_max, y_maxf를통해 디텍티드 박스의 위치를 알 수 있다.

box: conf[0] confidence값 알 수 있다.

class: 무엇으로 탐지했는지 알 수 있다.

for box in results[0].boxes:
    x_min, y_min, x_max, y_max = box.xyxy[0]  # 좌표
    conf = box.conf[0]
    cn = results[0].names[int(box.cls[0])]  # 클래스 이름
    print(f"좌표: {x_min}, {y_min}, {x_max}, {y_max} | conf. : {conf} | class : {cn}")

 

3. 동영상

 

1) 동영상 객체탐지 실행

model.predict("~", save=True)

# 동영상 객체 탐지 실행 및 결과 저장
results = model.predict("sample.mp4", save=True)  # 결과 자동 저장

 

2) 코랩에서 영상 play위한 세팅

 

영상 코덱으로  ffmpeg 설치하고 사용해서 변환한다.

 

3) 영상 play 

 

Video()

# YOLO 탐지 결과 동영상 재생
Video("runs/detect/predict/video_converted.mp4", embed=True)

 

4. 모델평가

 

- 지표

1) IoU

개념: 두 박스의 중복 영역 크기를 통해 측정

공식: 교집합 / 합집합

좋은 모델: 겹치는 영역이 넓을수록 1에 가까운 값이다. 0.5정도보다 크면 올바른 탐지

 

2) Confidence Score

개념: YOLO 모델이 예측한 바운딩 박스안에 객체가 존재할 확률을 나타낸다.

공식: P*IoU

Confidence Score 낮은 점수면 필터링한다.

 

Confidence Score 의 임계값:

임계값을 높이면 정밀도 올라가고 재현률은 내려간다.

임계값을 낮추면 정밀도 내려가고 재현률은 올라간다.

 

Confidence Score로 Precision-Recall Curve 그리기

그래프의 곡선의 면적이 1에 가까우면 좋은 모델

 

 

3) 과정

- NMS

개념: 모델에서 중복된 Bounding Box를 제거하고 가장 신뢰도가 높은 박스만 남기는 과정

여러 박스 있을때 하나의 박스만 남기고 나머지는 제거

 

- NMS 과정 순서

Confidence Score 임계 값 이하의 바운딩 박스 제거

남은 바운딩 박스들을 Confidence Score 내림차순으로 정렬

가장 Confidence Score 가 높은 첫번째 박스를 선택하고 다른 박스와 IoU 비교

선택한 박스와 IoU를 계산하여 IoU 값이 임계값 이상인 다른 박스들을 제거

바운딩 박스가 하나 남을 때까지 수행

 

4) Confidence 임계값 조정

high_conf = model(image_path, conf=0.7)  # 신뢰도 증가
low_conf = model(image_path, conf=0.1)   # 신뢰도 감소

 

이렇게하면 

첫번째 예제는 정밀도가 올라가고 재현률이 내려가고 

두번째 예제는 정밀도가 내려가고 재현률이 올라간다.

 

- 그래프 그리기

# Matplotlib 서브플롯 설정
fig, axes = plt.subplots(1, 2, figsize=(16, 4))

# 결과를 NumPy 배열로 변환하여 Matplotlib에 표시 (BGR → RGB 변환 포함)
axes[0].imshow(cv2.cvtColor(high_conf[0].plot(), cv2.COLOR_BGR2RGB))  # 높은 신뢰도
axes[0].set_title("High Confidence (conf=0.7)")
axes[0].axis("off")

axes[1].imshow(cv2.cvtColor(low_conf[0].plot(), cv2.COLOR_BGR2RGB))  # 낮은 신뢰도
axes[1].set_title("Low Confidence (conf=0.1)")
axes[1].axis("off")

plt.tight_layout()
plt.show()

 

첫번째는 박스 묶는 기준이 엄격한것을 볼수있고

두번째는 박스를 묶는 기준이 낮지만 재현률이 높은것을 볼 수 있다.

 

5) IoU 임계값 조정

high_iou = model(image_path, iou=0.7)   # IoU 증가
low_iou = model(image_path, iou=0.1)    # IoU 감소
# Matplotlib 서브플롯 설정
fig, axes = plt.subplots(1, 2, figsize=(16, 4))

# 결과를 NumPy 배열로 변환하여 Matplotlib에 표시 (BGR → RGB 변환 포함)
axes[0].imshow(cv2.cvtColor(high_iou[0].plot(), cv2.COLOR_BGR2RGB))  # 높은 IoU
axes[0].set_title("High IoU (iou=0.7)")
axes[0].axis("off")

axes[1].imshow(cv2.cvtColor(low_iou[0].plot(), cv2.COLOR_BGR2RGB))  # 낮은 IoU
axes[1].set_title("Low IoU (iou=0.1)")
axes[1].axis("off")

plt.tight_layout()
plt.show()

 

IoU는 교집합/ 합집합으로 중복되는 박스들을 비교하여 일치율이 0.5이상이되면 높은것이라고 판단하고

박스를 남겨둔다.

IoU가 완전 낮은것도 남겨두는데 그건 다른 객체일수도 있기 때문이다.