Anchor Boxes
앵커 박스가 객체 탐지를 위한 참조 템플릿으로 작동하는 방법을 알아보세요. 앵커 박스가 정확도를 높이는 방식과 Ultralytics YOLO26과 같은 모델이 앵커 프리 설계를 활용하는 방법을 살펴보세요.
앵커 박스는 특정 종횡비와 크기로 미리 정의된 참조 사각형으로, 이미지 전체에 배치되어 객체 탐지 모델이 객체의 위치를 찾고 분류하도록 지원합니다. 신경망에 객체의 정확한 크기와 위치를 처음부터 예측하도록 하는 대신, 객체 형태의 종류가 매우 다양해 불안정할 수 있으므로 모델은 이러한 고정 템플릿을 시작점으로 사용합니다. 시스템은 이러한 초기 박스를 정답 데이터에 맞도록 얼마나 조정해야 하는지, 즉 "회귀(regress)"해야 하는지를 학습함으로써 더 빠른 수렴과 높은 정확도를 달성할 수 있습니다. 이 기법은 복잡한 위치 추정 작업을 보다 관리하기 쉬운 최적화 문제로 단순화하여 컴퓨터 비전 (CV) 분야를 근본적으로 변화시켰습니다.
앵커 박스의 작동 원리#
고전적인 앵커 기반 검출기에서는 입력 이미지를 셀 그리드로 나눕니다. 네트워크는 각 셀 위치에서 서로 다른 기하학적 형태를 가진 여러 앵커 박스를 생성합니다. 예를 들어 키가 큰 보행자와 폭이 넓은 자동차를 동시에 탐지하기 위해 모델은 동일한 중심점에 세로로 길고 좁은 박스와 가로로 짧고 넓은 박스를 제안할 수 있습니다.
모델 학습 중에는 Intersection over Union (IoU)이라는 메트릭을 사용하여 이러한 앵커를 실제 객체와 매칭합니다. 레이블이 지정된 객체와 상당히 겹치는 앵커는 "positive" 샘플로 지정됩니다. 그런 다음 네트워크는 다음 두 가지 병렬 작업을 학습합니다.
-
분류: 앵커가 특정 클래스(예: "dog" 또는 "bicycle")를 포함할 가능성을 나타내는 확률 점수를 할당합니다. 이 과정에서는 교차 엔트로피 손실과 같은 표준 지도 학습 목적 함수를 사용합니다.
-
박스 회귀: 일반적인 앵커를 정확히 맞는 바운딩 박스로 변환하는 데 필요한 정밀한 오프셋 값(좌표 이동 및 스케일링 계수)을 계산합니다.
이 접근 방식은 서로 다른 크기의 여러 객체가 서로 가까이 있는 경우에도 모델이 이를 처리할 수 있도록 합니다. 각 객체를 형태가 가장 잘 일치하는 앵커에 할당할 수 있기 때문입니다.
실제 적용 사례#
최신 아키텍처가 앵커 프리 설계로 전환하고 있지만, 객체 특성을 예측할 수 있는 많은 기존 프로덕션 시스템에서는 앵커 박스가 여전히 중요합니다.
- 소매 및 재고 관리: AI 기반 소매 솔루션에서는 카메라가 선반의 재고를 모니터링합니다. 시리얼 상자나 탄산음료 캔과 같은 제품은 규격화된 치수를 가지므로 앵커 박스를 이러한 특정 종횡비에 맞게 조정할 수 있습니다. 이러한 사전 지식은 복잡한 환경에서도 모델이 높은 재현율을 유지하는 데 도움이 됩니다.
- 자율 주행: 자율 주행 차량의 인식 스택은 보행자, 차량, 교통 표지판의 탐지에 의존합니다. 멀리서 본 자동차는 도로에 비해 형태 프로파일이 비교적 일정하므로 이러한 형태에 맞게 조정된 앵커를 사용하면 견고한 객체 추적과 거리 추정이 가능합니다.
앵커 기반 방식과 앵커 프리 방식 비교#
기존의 앵커 기반 방법과 최신 앵커 프리 검출기를 구분하는 것이 중요합니다.
- 앵커 기반: 기존 Faster R-CNN이나 초기 YOLO 버전(예: Ultralytics YOLOv5)과 같은 모델은 이러한 사전 정의 템플릿을 사용합니다. 이러한 모델은 견고하지만, 새로운 데이터셋에 맞게 조정하려면 하이퍼파라미터(앵커 크기/비율)를 수동으로 튜닝하거나 k-means 클러스터링과 같은 클러스터링 알고리즘을 사용해야 하는 경우가 많습니다.
- 앵커 프리: YOLO26을 포함한 고급 모델은 앵커 프리 방식이나 엔드투엔드 방식을 사용하는 경우가 많습니다. 이러한 네트워크는 객체 중심점이나 키포인트를 직접 예측하므로 수동으로 앵커를 구성할 필요가 없습니다. 이를 통해 아키텍처가 단순해지고, 비어 있는 배경 앵커 수천 개를 처리하는 데 필요한 계산을 제거하여 추론 속도가 빨라집니다.
예시: 앵커 정보에 액세스하기#
Ultralytics Platform과 같은 최신 고수준 API는 학습 중 이러한 세부 사항을 추상화하지만, 이전 모델 아키텍처로 작업하거나 모델 config 파일을 분석할 때는 앵커를 이해하는 것이 유용합니다. 다음 스니펫은 모델을 로드하고 구성을 확인하는 방법을 보여줍니다. 앵커 설정이 있는 경우 일반적으로 이 구성에 정의됩니다.
from ultralytics import YOLO
# Load a pre-trained YOLO model (YOLO26 is anchor-free, but legacy configs act similarly)
model = YOLO("yolo26n.pt")
# Inspect the model's stride, which relates to grid cell sizing in detection
print(f"Model strides: {model.model.stride}")
# For older anchor-based models, anchors might be stored in the model's attributes
# Modern anchor-free models calculate targets dynamically without fixed boxes
if hasattr(model.model, "anchors"):
print(f"Anchors: {model.model.anchors}")
else:
print("This model architecture is anchor-free.")과제 및 고려 사항#
앵커 박스는 효과적이지만 복잡성을 높입니다. 생성되는 앵커의 수가 매우 많고 이미지당 수만 개에 달하는 경우가 많아 클래스 불균형 문제가 발생합니다. 대부분의 앵커가 배경만 포함하기 때문입니다. Focal Loss와 같은 기법은 쉬운 배경 예제의 가중치를 낮춰 이 문제를 완화하는 데 사용됩니다. 또한 최종 출력에는 일반적으로 중복되는 겹침 박스를 필터링하기 위해 Non-Maximum Suppression (NMS)이 필요하며, 이를 통해 각 객체에 대해 신뢰도가 가장 높은 탐지만 남깁니다.









