17장. Batch Processing 과 YOLO 데이터 준비
주석 달기(Annotation)
택배 상자에 송장을 붙이는 일을 떠올려 봅시다. 상자마다 송장을 빠짐없이 붙여야 하고, 받는 사람 이름을 같은 표기로 써야 합니다. "서울" 과 "서울시" 를 섞어 쓰면 분류하는 곳에서 헷갈립니다. 주석 달기도 같습니다. 사람이 그림을 열어 물체마다 상자를 그리고, 정해 둔 이름 가운데 하나를 골라 붙입니다.
그림의 네 단계를 그림마다 되풀이합니다. 여기서 송장을 붙이는 일이 상자 그리기, 받는 사람 이름을 쓰는 일이 클래스 고르기입니다. 마지막 "내보내기"는 라벨링 도구가 상자를 좌표 숫자로 바꿔 파일에 적는 일입니다. 이 장의 annotations.csv 는 그렇게 내보낸 파일처럼 꾸몄습니다.
라벨링 도구
라벨링 도구는 마우스로 상자를 그리면 좌표를 대신 적어 줍니다. 널리 알려진 것 세 가지의 성격만 정리합니다. 설치법과 쓰는 법은 도구마다 공식 안내를 따릅니다.
| 도구 | 쓰는 곳 | 성격 |
|---|---|---|
| LabelImg | 내 PC 에서 돌리는 작은 프로그램 | 상자 그리기에 집중한 단순한 도구. YOLO 형식과 Pascal VOC 형식으로 저장한다 |
| CVAT(Computer Vision Annotation Tool) | 웹 브라우저 | 여러 사람이 일을 나눠 맡기 좋다. 동영상 주석도 된다. 인텔에서 처음 만들었다 |
| Label Studio | 웹 브라우저 | 그림뿐 아니라 글, 소리 같은 여러 데이터의 주석을 한 도구에서 단다 |
상자를 그리는 규칙
규칙은 팀마다 조금씩 다릅니다. 중요한 것은 정해 둔 규칙을 모든 그림에 똑같이 지키는 것입니다. 이 장의 데이터는 아래 규칙으로 만들었습니다.
왼쪽 그림의 초록 상자는 부품에 빈틈없이 맞췄습니다. 가운데 그림의 다홍 상자는 잘못된 예입니다. 실선은 너무 크게, 점선은 너무 작게 그린 상자입니다. 오른쪽 그림의 와셔는 테두리에 걸려 일부만 보이므로 보이는 데까지만 상자를 그렸습니다.
| 규칙 | 이렇게 한다 | 까닭 |
|---|---|---|
| 빈틈없이 | 물체의 가장 바깥 칸에 상자 테두리를 맞춘다 | 상자가 크면 배경까지 물체로 배운다 |
| 빠짐없이 | 보이는 물체는 작아도 모두 그린다 | 빠뜨린 물체는 배경으로 배운다 |
| 잘린 물체 | 그림 안에 보이는 데까지만 그린다 | 좌표가 그림 밖으로 나가지 않게 |
| 가려진 물체 | 팀이 정한 대로 한다(예: 보이는 부분만) | 그림마다 다르게 하면 모델이 헷갈린다 |
| 이름 | 정해 둔 영문 소문자 이름만 쓴다 | bolt 와 Bolt 는 다른 클래스가 된다 |
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 는 쓰인 이름 가운데 허락한 이름에 없는 것만 남깁니다. 오타가 이렇게 바로 드러납니다. 자세한 검사는 "라벨 검사" 절에서 합니다.
주의할 점
- 여러 사람이 나눠 주석을 달면 사람마다 상자를 그리는 버릇이 다릅니다. 시작하기 전에 규칙을 글로 적고 예시 그림을 함께 봅니다.
- 주석을 다 단 뒤에는 일부를 골라 다른 사람이 다시 확인합니다. 사람은 반드시 실수를 하므로, 실수를 찾는 검사가 데이터 준비의 한 단계입니다.