Ultralytics YOLO27: 대기자 명단에 등록하세요.
Get Started
컴퓨터 비전 기초·작업 선택하기·레슨 3/10
강의초급

객체 검출 이해하기

검출기의 출력인 클래스, 박스, 신뢰도를 확인하고 각 오류의 비용을 기준으로 신뢰도 임계값과 IoU 임계값을 설정합니다.

대부분의 프로덕션 비전 시스템은 카운터, 추적기, 구역 알림, 개인정보 보호용 블러 등 로직을 추가한 검출 시스템입니다. 이런 시스템이 오작동할 때 원인은 대개 모델이 아니라 아무도 의도적으로 선택하지 않은 임계값입니다. 검출기가 정확히 무엇을 반환하는지, 그리고 어떤 두 가지 조정값이 결과 목록에 영향을 미치는지 알면 이를 기반으로 구축된 거의 모든 시스템을 디버깅할 수 있습니다.

학습 성과

코드에서 YOLO26 검출 결과를 읽고, 미탐과 오탐의 비용을 기준으로 conf 및 iou을 선택합니다.

속성 과정
이미 사용법을 알고 계신다면, 간단히 요약해 드리겠습니다.
  1. 각 검출 결과는 클래스, 박스, 신뢰도 점수로 구성됩니다.

  2. conf은 신뢰도가 낮은 박스를 제거합니다(기본값 0.25). iou은 NMS가 두 박스를 중복으로 처리하는 기준을 결정합니다(기본값 0.7).

  3. 미탐 비용이 큰가요? conf을 낮추세요. 오탐이 눈에 띄나요? 값을 높이세요.

  4. 인접 객체가 사라지나요? iou을 높이세요.

  5. 신뢰도는 박스의 순위를 매기는 값이지, 보정된 확률이 아닙니다.

실습형

검출기가 반환하는 값#

사람, 자전거를 탄 두 사람, 개, 자동차 두 대가 검출되고 각 박스에 클래스와 신뢰도가 표시된 해안 산책로의 Ultralytics YOLO 검출 결과

이미지의 각 태그는 출력의 한 행에 해당합니다. 클래스 이름, 신뢰도, 그리고 해당 객체를 둘러싼 박스입니다. 검출 모델은 정확히 이러한 목록을 반환합니다:

  • 클래스 — result.names을 통해 이름에 매핑되는 정수 인덱스입니다(0은 person이고, 5은 bus입니다).
  • 박스 — 객체의 위치를 나타내는 네 개의 숫자입니다. xyxy은 왼쪽 위 모서리와 오른쪽 아래 모서리를 픽셀 단위로 나타냅니다.
  • 신뢰도 — 검출 결과의 순위를 매기고 필터링하는 데 사용하는 0~1 사이의 점수입니다.

계수, 알림, 추적, 블러 처리는 이러한 행을 기반으로 작성하는 코드입니다.

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]

for box in result.boxes:
    name = result.names[int(box.cls)]
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"{name:8} conf={float(box.conf):.2f} box=({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")
bus      conf=0.88 box=(0, 230, 803, 751)
person   conf=0.87 box=(49, 398, 240, 902)
person   conf=0.86 box=(223, 405, 345, 861)
person   conf=0.85 box=(670, 395, 810, 880)
person   conf=0.65 box=(0, 553, 60, 871)

한 줄씩 살펴보겠습니다. 버스가 왼쪽 가장자리 밖으로 이어지므로 버스 박스는 x=0에서 시작합니다. 사람 세 명의 신뢰도 점수는 0.85~0.87입니다. 왼쪽 경계에서 잘린 네 번째 사람의 점수는 0.65에 불과합니다. 모델이 신체의 절반만 보기 때문입니다. 잘린 객체의 신뢰도가 낮은 것은 정상이며, 임계값의 영향을 가장 먼저 받는 경우입니다.

박스는 네 가지 형식으로 제공됩니다. 후속 코드가 필요로 하는 형식을 사용하세요:

속성형식일반적인 용도
boxes.xyxy모서리 픽셀 (x1, y1, x2, y2)자르기, 그리기, 겹침 규칙
boxes.xywh중심 픽셀과 너비 및 높이크기 필터, 움직임
boxes.xyxyn0~1로 정규화된 모서리 좌표해상도가 달라져도 유지되는 규칙
boxes.xywhn0~1로 정규화된 중심 좌표와 크기YOLO 레이블 파일

후보에서 최종 목록까지#

모델 내부에서는 객체별 후보 박스 여러 개에 점수를 매깁니다. 두 가지 필터가 후보를 최종 목록으로 변환합니다:

신뢰도 필터. conf은 임계값보다 낮은 박스를 제거합니다. 예측 시 기본값은 0.25입니다. 버스 이미지에서는 개수가 빠르게 바뀝니다:

confbus.jpg의 박스
0.107
0.255
0.505
0.754

중복 필터. 비최대 억제(NMS)는 신뢰도가 가장 높은 박스를 유지하고, 해당 박스와 iou(기본값 0.7)보다 많이 겹치는 동일 클래스의 다른 박스는 제거합니다. 겹침은 교집합 대 합집합으로 측정합니다. 즉, 겹치는 영역을 전체 영역으로 나눈 값입니다.

새와 관련한 교집합 대 합집합: 겹치는 예측 박스와 정답 박스, 그리고 일치하는 마스크. IoU는 겹치는 영역을 합집합으로 나눈 값입니다

ioubus.jpg의 박스효과
0.35엄격: 겹치는 박스가 병합됩니다
0.75기본값
0.958관대: 거의 중복되는 항목이 유지됩니다

오류 비용을 기준으로 임계값을 선택합니다#

만약…그러면…
놓치면 비용이 큽니다(안전 알림, 결함)conf을 낮추고 일부 오탐을 허용합니다
오탐이 사용자에게 드러납니다(검색, 태깅)conf을 높입니다
개수를 보고합니다검증 이미지에서 conf을 여러 값으로 테스트하고 개수 오차가 가장 작은 값을 선택합니다
혼잡한 곳에서는 실제로 가까이 있는 객체가 사라집니다iou을 높입니다(예: 0.7 → 0.8)
같은 객체에 박스가 두 개 생깁니다iou을 낮춥니다
클래스마다 난이도가 다릅니다필요한 가장 낮은 conf 값으로 예측한 다음, 코드에서 클래스별로 필터링합니다

창고 안전 모니터링은 임계값을 낮게 설정하는 대표적인 사례입니다. 예측 모드에는 모든 추론 인수가 나열되어 있습니다.

주의할 점#

신뢰도를 확률로 해석하기

증상: "모델이 이것이 버스라고 88% 확신합니다"라고 말하고 직관에 따라 임계값을 선택합니다. 해결: 신뢰도를 순위를 매기는 점수로 취급합니다. YOLO26에서는 하나의 점수가 "객체가 있다"와 "이 클래스에 속한다"를 모두 나타내며, 보정된 값이 아닙니다. 숫자의 의미를 기준으로 삼지 말고 검증 데이터에서 임계값을 선택하세요.

이웃한 두 객체 중 하나가 사라졌나요? NMS를 확인하세요

두 사람이 어깨를 나란히 하고 서 있으면 박스가 크게 겹쳐 NMS가 실제 사람을 "중복"으로 삭제할 수 있습니다. iou을 높이면 두 번째 박스가 다시 나타납니다. YOLO26에는 NMS가 전혀 필요 없는 엔드투엔드 헤드도 포함되어 있습니다. 이를 사용하려면 nms=False을 전달하세요.

한 이미지에서만 튜닝하기

증상: 데모 이미지에서는 완벽해 보이는 임계값이 실제 카메라에서는 제대로 작동하지 않습니다. 해결: 배포 카메라에서 가져온 검증 세트로 임계값을 스윕합니다. 이미지 한 장만으로는 각 조정값의 효과만 확인할 수 있습니다.

잘못 판단하는 네 가지 방식#

실패문제가 무엇인가요일반적인 해결 방법
클래스는 맞지만 박스가 느슨함위치 추정더 엄격하고 일관된 박스 규칙을 적용합니다. 작은 객체에는 imgsz을 더 크게 설정합니다
박스는 맞지만 클래스가 틀림분류혼동되는 클래스 쌍의 예시를 늘리거나 클래스를 병합합니다
박스가 전혀 없음재현율해당 조건의 예시를 더 추가합니다(조명, 크기, 가림)
배경에 박스가 표시됨정밀도모델을 속인 대상의 하드 네거티브 이미지

두 가지 목록을 사용하면 원인을 빠르게 진단할 수 있습니다. 신뢰도가 낮은 참양성(모델이 실제 객체를 확신하지 못함)과 신뢰도가 높은 거짓양성(모델이 잘못된 대상을 확신함)입니다. 두 목록은 서로 다른 해결 방법을 가리킵니다.

사용해 보기

conf=0.05으로 솔루션을 실행하고 저장된 이미지를 엽니다. 0.5 미만인 모든 박스를 참양성 또는 거짓양성으로 표시하고, 각 거짓양성이 발생한 이유를 기록합니다. 그런 다음 이 카메라의 보행자 계수기에 배포할 conf 값을 한 문장의 근거와 함께 적습니다.

완료 조건
다음 조건을 모두 충족하면 레슨을 완료한 것입니다.
  • bus.jpg에서 0.5 미만인 모든 박스의 목록을 만들고, 각 박스를 이유와 함께 참양성 또는 거짓양성으로 표시했습니다.

  • 보행자 계수기에 사용할 conf 값과 그 값으로 방지하려는 오류를 기록했습니다.

  • iou 표를 사용해 iou을 높이면 억제된 인접 객체가 다시 나타나는 이유를 설명할 수 있습니다.

정답 보기
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", conf=0.05, save=True, verbose=False)[0]

for box in sorted(result.boxes, key=lambda b: -float(b.conf)):
    name, conf = result.names[int(box.cls)], float(box.conf)
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"{conf:.2f} {name:10} ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")
0.88 bus        (0, 230, 803, 751)
0.87 person     (49, 398, 240, 902)
0.86 person     (223, 405, 345, 861)
0.85 person     (670, 395, 810, 880)
0.65 person     (0, 553, 60, 871)
0.18 person     (0, 600, 40, 871)
0.12 stop sign  (0, 252, 35, 326)
0.08 handbag    (43, 732, 78, 812)
0.07 skateboard (669, 822, 808, 881)
0.06 handbag    (225, 634, 291, 705)

0.5 미만인 박스는 모두 거짓양성입니다. 0.18의 person은 왼쪽 가장자리에서 잘린 사람(0.65)을 중복 검출합니다. 0.12의 stop sign은 실제 도로 표지판이지만 클래스가 잘못되었습니다. 핸드백과 스케이트보드는 각각 손과 신발에 표시되어 있습니다. 모든 실제 객체의 점수가 0.6을 넘으므로, conf=0.5는 네 사람을 모두 유지하고 모든 잡음을 제거해 보행자 계수기에 적합합니다. 이는 중복 계수를 방지합니다. 배포하기 전에 실제 카메라의 검증 세트에서 확인하세요. 0.65인 잘린 사람은 실제 객체의 점수가 임계값에 얼마나 가까워질 수 있는지 보여줍니다.

다음 단계

다음: 사각형으로는 부족하고 객체의 정확한 모양이 필요한 경우를 살펴봅니다.