YOLO(You Only Look Once)는 객체 탐지를 위한 인공 신경망 모델로, 이미지 전체를 한 번에 분석하여 객체의 유형 및 위치를 탐지하는 방식으로 작동합니다. YOLO는 빠르고 정확한 성능을 자랑하여, 다양한 컴퓨터 비전 애플리케이션에서 광범위하게 사용됩니다. 이 글에서는 YOLO의 구조와 클래스 예측, 경계 상자 회귀, 신뢰도(confidence)에 대한 자세한 설명을 다루겠습니다.
YOLO의 기본 구조
YOLO는 CNN(Convolutional Neural Network) 아키텍처를 기반으로 하고 있으며, 입력 이미지를 고정된 크기로 변환한 후 여러 단계의 합성곱 및 풀링 층을 통과시켜 특징 맵을 생성합니다. 최종적으로, YOLO 모델은 이 특징 맵을 사용하여 각 그리드 셀에서 객체를 탐지하고 위치를 예측합니다.
1. 입력 이미지의 전처리
YOLO는 입력 이미지의 크기를 고정된 크기(예: 416×416 또는 608×608)로 조정합니다. 이를 통해 네트워크는 다양한 크기의 객체를 학습하고 예측할 수 있습니다. 전처리 단계에서는 다음과 같은 작업이 수행됩니다:
- 이미지 리사이징: 입력 이미지를 YOLO가 요구하는 크기로 변환합니다.
- 정규화: 픽셀 값(0-255)을 0과 1 사이로 정규화합니다.
2. 그리드 셀 분할
YOLO는 입력 이미지를 SxS 그리드 셀로 분할합니다. 각 그리드 셀은 이미지의 해당 영역에 대한 객체를 탐지하는 책임을 집니다. 예를 들어, 7×7 그리드 셀은 7개의 가로와 7개의 세로 셀로 이미지의 전체를 나누게 됩니다.
3. 예측 및 출력
각 그리드 셀은 각 객체에 대한 정보를 포함하는 바운딩 박스의 예측을 제공합니다. 예측 결과는 클래스 확률 및 경계 상자 좌표로 구성됩니다. YOLO의 최종 출력은 다음과 같은 포맷을 가집니다:
grid_cell_x, grid_cell_y, width, height, confidence, class_probabilities
클래스 예측
YOLO의 각 그리드 셀은 해당 셀에 객체가 존재하는 경우 classes 수만큼의 클래스 확률을 예측합니다. 객체의 클래스 예측은 소프트맥스(Softmax) 함수를 통해 비율화된 값으로 나타나며, 가장 높은 확률을 가지는 클래스가 최종 예측 클래스가 됩니다.
클래스 예측 예제 코드
아래는 YOLO 모델에서 클래스 예측을 수행하는 기본적인 예제 코드입니다:
import numpy as np
# 예측된 클래스 확률 (3개의 클래스)
class_probs = np.array([0.1, 0.7, 0.2])
# 소프트맥스 함수를 적용하여 확률을 비율화
def softmax(x):
exp_x = np.exp(x - np.max(x)) # 안정적 계산을 위한 수식
return exp_x / exp_x.sum()
normalized_probs = softmax(class_probs)
# 가장 높은 확률을 가진 클래스 찾기
predicted_class = np.argmax(normalized_probs)
predicted_probability = normalized_probs[predicted_class]
print(f"Predicted Class: {predicted_class}, Probability: {predicted_probability:.2f}")
경계 상자 회귀
각 그리드 셀은 객체를 탐지하기 위해 경계 상자의 위치를 회귀합니다. YOLO는 경계 상자의 중앙 좌표, 너비 및 높이를 예측합니다. 회귀는 다음과 같은 수식을 통해 계산됩니다:
- 중심 좌표 (bx, by): 해당 그리드 셀의 좌표를 기준으로 계산됩니다.
- 너비 (bw) 및 높이 (bh): 예측된 경계 상자는 실제 이미지 크기에 상대적으로 scaling됩니다.
경계 상자 회귀 예제 코드
경계 상자를 회귀하는 코드의 예는 다음과 같습니다:
# 경계 상자 회귀 예제
# 예측된 바운딩 박스 (bx, by, bw, bh)
predicted_box = [0.5, 0.5, 0.3, 0.4] # 그리드 셀의 중앙 기준
grid_size = 416 # 원본 이미지 크기
# 경계 상자 좌표 계산
x1 = (predicted_box[0] - predicted_box[2] / 2) * grid_size
y1 = (predicted_box[1] - predicted_box[3] / 2) * grid_size
x2 = (predicted_box[0] + predicted_box[2] / 2) * grid_size
y2 = (predicted_box[1] + predicted_box[3] / 2) * grid_size
print(f"Bounding Box coordinates: ({x1}, {y1}) to ({x2}, {y2})")
신뢰도(confidence) 이해하기
신뢰도는 객체 탐지의 정확성을 나타내는 지표로, 바운딩 박스가 특정 클래스에 대해 얼마나 믿을 수 있는지를 평가합니다. YOLO는 다음과 같이 신뢰도를 계산합니다:
- 신뢰도 = P(Object) * IoU (Intersection over Union)
여기서 P(Object)는 해당 그리드 셀에 객체가 존재할 확률이며 IoU는 예측된 박스와 실제 객체 박스 간의 겹치는 정도를 나타냅니다.
신뢰도 예측 예제 코드
아래는 YOLO에서 신뢰도를 계산하는 예제 코드입니다:
# 신뢰도 예측 예제
# 예측된 클래스 확률
p_object = 0.8 # 객체가 존재할 확률
iou = 0.5 # IoU 값
confidence_score = p_object * iou
print(f"Confidence Score: {confidence_score:.2f}")
결론
YOLO는 객체 탐지의 속도와 정확성 측면에서 강력한 성능을 제공하는 모델입니다. 본 글에서 설명한 클래스 예측, 경계 상자 회귀, 신뢰도 등 점차적으로 YOLO의 내부 구조와 그 작동 방식을 이해하는 데 도움을 주었기를 바랍니다. 다양한 분야에서 YOLO 모델을 활용하여 보다 발전된 비전 소프트웨어를 개발해 볼 수 있습니다.