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

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

주석 달기(Annotation)

택배 상자에 송장을 붙이는 일을 떠올려 봅시다. 상자마다 송장을 빠짐없이 붙여야 하고, 받는 사람 이름을 같은 표기로 써야 합니다. "서울" 과 "서울시" 를 섞어 쓰면 분류하는 곳에서 헷갈립니다. 주석 달기도 같습니다. 사람이 그림을 열어 물체마다 상자를 그리고, 정해 둔 이름 가운데 하나를 골라 붙입니다.

그림 열기, 상자 그리기, 클래스 고르기, 내보내기의 네 단계를 이은 흐름도

그림의 네 단계를 그림마다 되풀이합니다. 여기서 송장을 붙이는 일이 상자 그리기, 받는 사람 이름을 쓰는 일이 클래스 고르기입니다. 마지막 "내보내기"는 라벨링 도구가 상자를 좌표 숫자로 바꿔 파일에 적는 일입니다. 이 장의 annotations.csv 는 그렇게 내보낸 파일처럼 꾸몄습니다.

라벨링 도구

라벨링 도구는 마우스로 상자를 그리면 좌표를 대신 적어 줍니다. 널리 알려진 것 세 가지의 성격만 정리합니다. 설치법과 쓰는 법은 도구마다 공식 안내를 따릅니다.

도구쓰는 곳성격
LabelImg내 PC 에서 돌리는 작은 프로그램상자 그리기에 집중한 단순한 도구. YOLO 형식과 Pascal VOC 형식으로 저장한다
CVAT(Computer Vision Annotation Tool)웹 브라우저여러 사람이 일을 나눠 맡기 좋다. 동영상 주석도 된다. 인텔에서 처음 만들었다
Label Studio웹 브라우저그림뿐 아니라 글, 소리 같은 여러 데이터의 주석을 한 도구에서 단다

상자를 그리는 규칙

규칙은 팀마다 조금씩 다릅니다. 중요한 것은 정해 둔 규칙을 모든 그림에 똑같이 지키는 것입니다. 이 장의 데이터는 아래 규칙으로 만들었습니다.

빈틈없이 맞춘 상자, 너무 크거나 작은 상자, 테두리에 잘린 물체의 상자를 견준 그림

왼쪽 그림의 초록 상자는 부품에 빈틈없이 맞췄습니다. 가운데 그림의 다홍 상자는 잘못된 예입니다. 실선은 너무 크게, 점선은 너무 작게 그린 상자입니다. 오른쪽 그림의 와셔는 테두리에 걸려 일부만 보이므로 보이는 데까지만 상자를 그렸습니다.

규칙이렇게 한다까닭
빈틈없이물체의 가장 바깥 칸에 상자 테두리를 맞춘다상자가 크면 배경까지 물체로 배운다
빠짐없이보이는 물체는 작아도 모두 그린다빠뜨린 물체는 배경으로 배운다
잘린 물체그림 안에 보이는 데까지만 그린다좌표가 그림 밖으로 나가지 않게
가려진 물체팀이 정한 대로 한다(예: 보이는 부분만)그림마다 다르게 하면 모델이 헷갈린다
이름정해 둔 영문 소문자 이름만 쓴다bolt 와 Bolt 는 다른 클래스가 된다
Python
import pandas as pd

ann = pd.read_csv("ch17_raw/annotations.csv")
# 주석에 실제로 쓰인 클래스 이름과 개수. 정해 둔 세 이름 말고 다른 것이 섞였는지 본다
print(ann["class"].value_counts().to_dict())
allowed = {"bolt", "nut", "washer"}
print("정해 두지 않은 이름:", sorted(set(ann["class"]) - allowed))

set(...) - allowed 는 쓰인 이름 가운데 허락한 이름에 없는 것만 남깁니다. 오타가 이렇게 바로 드러납니다. 자세한 검사는 "라벨 검사" 절에서 합니다.

주의할 점

  • 여러 사람이 나눠 주석을 달면 사람마다 상자를 그리는 버릇이 다릅니다. 시작하기 전에 규칙을 글로 적고 예시 그림을 함께 봅니다.
  • 주석을 다 단 뒤에는 일부를 골라 다른 사람이 다시 확인합니다. 사람은 반드시 실수를 하므로, 실수를 찾는 검사가 데이터 준비의 한 단계입니다.
← 이전 절17장 · 객체 탐지 데이터셋이란다음 절 →17장 · 상자 좌표 형식 세 가지