OpenCV 비전 실무17장 · Batch Processing 과 YOLO 데이터 준비11 / 21← 이전목차다음 →MetaContents

17장. Batch Processing 과 YOLO 데이터 준비

라벨을 그림에 그려 확인하기

새로 산 가구의 조립 설명서를 받으면, 부품 목록의 그림과 상자 안의 실제 부품을 하나씩 대어 봅니다. 숫자 목록만 봐서는 모르던 빠진 부품이 눈으로 대어 보면 바로 보입니다. 라벨도 숫자로만 검사하지 않고, 그림 위에 상자를 다시 그려 사람이 봅니다.

라벨 파일 읽기, 픽셀로 되돌리기, 상자 그리기, 이름 쓰기의 네 단계를 이은 흐름도

그림의 네 단계로 YOLO 라벨을 그림 위에 되살립니다. 둘째 단계에서 비율을 그림 크기로 곱해 픽셀로 되돌리는 것이 핵심입니다. 셋째와 넷째 단계는 12장에서 결과를 표시할 때 쓴 cv2.rectangle 과 cv2.putText 를 그대로 씁니다. 여기서 부품 목록이 라벨 파일, 실제 부품이 그림입니다.

되돌리는 식

구할 것식예 (가로 320, 세로 240, xc 0.25, yc 0.333333, w 0.25, h 0.166667)
x1(xc − w ÷ 2) × 가로(0.25 − 0.125) × 320 = 40
y1(yc − h ÷ 2) × 세로(0.333333 − 0.083333) × 240 = 60
x2(xc + w ÷ 2) × 가로(0.25 + 0.125) × 320 = 120
y2(yc + h ÷ 2) × 세로(0.333333 + 0.083333) × 240 ≈ 100
Python
import cv2

img = cv2.imread("ch17_raw/part_001.png")
H, W = img.shape[:2]
names = ["bolt", "nut", "washer"]
line = "2 0.170313 0.106250 0.128125 0.170833"     # 라벨 파일의 한 줄(와셔)

cls, xc, yc, w, h = line.split()
cls, xc, yc, w, h = int(cls), float(xc), float(yc), float(w), float(h)
# 비율 → 픽셀: 가운데에서 크기의 절반을 빼고 더한 뒤 그림 크기를 곱한다
x1, y1 = round((xc - w / 2) * W), round((yc - h / 2) * H)
x2, y2 = round((xc + w / 2) * W), round((yc + h / 2) * H)
print(names[cls], (x1, y1, x2, y2))

cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 1)
cv2.putText(img, names[cls], (x1, y1 - 3), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 255, 0), 1)

round 로 반올림해 정수로 만듭니다. cv2.rectangle 은 좌표를 정수로만 받습니다.

주의할 점

  • 이 장의 x2 는 상자의 오른쪽 끝 자리라서, cv2.rectangle 에 (x2, y2) 를 그대로 주면 선이 한 칸 바깥에 그려집니다. 12장처럼 칸에 딱 맞추려면 1 을 빼고, 눈으로 확인하는 그림에서는 그대로 써도 됩니다.
  • 그림을 많이 확인할 때는 몇 장을 격자로 이어 붙여 한 번에 봅니다. 모든 그림을 볼 수 없으면 무작위로 골라 봅니다.
← 이전 절17장 · 라벨 검사: 실수 찾기 규칙다음 절 →17장 · 상자와 함께 하는 증강