OpenCV 비전 실무18장 · OpenCV 전처리와 YOLO 연계3 / 21← 이전목차다음 →MetaContents

18장. OpenCV 전처리와 YOLO 연계

YOLO 다시 보기

식당에서 손님이 들어오면 직원이 홀을 한 번 쓱 훑어보고 "창가 2번 자리에 두 분, 안쪽 5번 자리에 네 분" 하고 바로 압니다. 자리마다 다가가 한 명씩 세지 않습니다. YOLO(You Only Look Once) 는 이 직원처럼 사진을 한 번만 훑어보고 물체의 자리와 이름을 함께 내놓습니다. 1장에서 이름의 뜻을, 17장에서 YOLO 가 읽는 데이터셋을 봤습니다. 이 장에서는 YOLO 가 실제로 무엇을 돌려주는지부터 봅니다.

YOLO 가 물체마다 돌려주는 상자, 신뢰도, 클래스의 세 가지를 나란히 놓은 비교 그림

그림의 세 카드가 YOLO 가 찾은 물체 하나마다 돌려주는 값입니다. 왼쪽 카드의 상자는 어디에 있는지, 가운데 카드의 신뢰도는 얼마나 자신 있는지, 오른쪽 카드의 클래스는 무엇인지입니다. 여기서 "창가 2번 자리"가 상자, "두 분"이라고 바로 말하는 확신이 신뢰도, "손님"이라는 갈래가 클래스입니다. 비유와 다른 점도 있습니다. 직원은 확신이 없으면 다시 보러 가지만, YOLO 는 다시 보지 않고 신뢰도 숫자만 낮게 붙여 내놓습니다.

결과의 꼴

ultralytics 의 YOLO 는 결과를 아래 이름으로 돌려줍니다. 실습 1에서 실제로 꺼내 봅니다.

이름뜻꼴17차시의 형식과 견주면
boxes.xyxy상자의 왼쪽 위와 오른쪽 아래물체마다 (x1, y1, x2, y2), 픽셀모서리 두 점 형식
boxes.xywhn상자의 가운데와 크기물체마다 (xc, yc, w, h), 0~1 비율YOLO 라벨 형식
boxes.conf신뢰도물체마다 0~1 의 수 하나라벨에는 없다(정답은 100% 확실하므로)
boxes.cls클래스 번호물체마다 0, 1, 2 같은 번호라벨 줄의 첫 숫자
names번호와 이름의 사전{0: "bolt", 1: "nut", 2: "washer"}data.yaml 의 names

짧은 예시

YOLO 를 부르기 전에, 결과가 이런 꼴로 온다고 보고 NumPy 배열로 흉내 내 봅니다. 아래 숫자는 꼴을 보이려고 지어낸 값입니다.

Python
import numpy as np

# 물체 세 개를 찾았다고 치고 만든 배열(지어낸 값)
xyxy = np.array([[52.0, 160.0, 92.0, 200.0],      # 물체마다 (x1, y1, x2, y2)
                 [131.0, 200.0, 175.0, 239.0],
                 [270.0, 30.0, 310.0, 70.0]])
conf = np.array([0.91, 0.47, 0.12])               # 물체마다 신뢰도
cls = np.array([1, 1, 2])                          # 물체마다 클래스 번호
names = {0: "bolt", 1: "nut", 2: "washer"}

for box, p, c in zip(xyxy, conf, cls):
    x1, y1, x2, y2 = [int(v) for v in box]         # 그릴 때는 정수로 바꾼다
    print(f"{names[int(c)]:6} 신뢰도 {float(p):.2f}  상자 ({x1}, {y1}, {x2}, {y2})")

세 배열은 같은 자리끼리 한 물체입니다. 0번 자리를 모으면 "nut, 0.91, (52, 160, 92, 200)" 이 됩니다. 그래서 zip 으로 묶어 한 물체씩 꺼냅니다.

주의할 점

  • 상자 하나를 찾아도 xyxy 는 2차원 배열(물체 수 × 4)입니다. 하나도 못 찾으면 물체 수가 0 인 빈 배열이 옵니다. len(xyxy) 로 개수부터 확인합니다.
  • 클래스 번호와 이름의 짝은 모델마다 다릅니다. COCO 로 배운 모델의 0번은 person(사람)이고, 우리가 가르친 모델의 0번은 bolt 입니다. 이름은 언제나 그 모델의 names 에서 찾습니다.
← 이전 절18장 · 용어 짚고 가기다음 절 →18장 · ultralytics 와 사전학습 모델