라벨링
이미지 라벨링(Labeling)은 학습 데이터에 정답(Ground Truth)을 부여하는 과정입니다. 이 문서에서는 Label Studio를 활용하여 분류, 탐지, 세그멘테이션 라벨링 워크플로우를 구축합니다.
환경 준비
label-studio start --port 8080
브라우저에서 http://localhost:8080으로 접속합니다. 최초 실행 시 계정을 생성합니다.
Create Project 클릭
프로젝트 이름 입력 (예: safety-helmet-detection)
이미지 파일 업로드 또는 클라우드 스토리지 연결
태스크에 맞는 라벨링 인터페이스 선택
태스크별 라벨링 설정
이미지 분류
<View>
<Image name="image" value="$image"/>
<Choices name="label" toName="image">
<Choice value="양품"/>
<Choice value="불량"/>
</Choices>
</View>
객체 탐지 (바운딩 박스)
<View>
<Image name="image" value="$image" zoom="true"/>
<RectangleLabels name="label" toName="image">
<Label value="person" background="red"/>
<Label value="helmet" background="green"/>
<Label value="no_helmet" background="orange"/>
</RectangleLabels>
</View>
세그멘테이션 (다각형)
<View>
<Image name="image" value="$image" zoom="true"/>
<PolygonLabels name="label" toName="image">
<Label value="tumor" background="red"/>
<Label value="normal" background="green"/>
</PolygonLabels>
</View>
라벨링 워크플로우
라벨링 가이드라인 작성 요령
효과적인 라벨링을 위해 사전에 가이드라인을 명확히 정의해야 합니다.
| 항목 | 정의 내용 | 예시 |
|---|
| 클래스 정의 | 각 클래스의 명확한 기준 | ”안전모를 착용한 사람” vs “안전모를 들고 있는 사람” |
| 경계 사례 | 모호한 상황의 판단 기준 | 안전모가 반쯤 벗겨진 경우 → no_helmet |
| 바운딩 박스 규칙 | 여백, 가림(Occlusion) 처리 | 객체에 밀착, 가림 50% 이상은 미라벨링 |
| 최소 크기 | 라벨링할 최소 객체 크기 | 20x20 픽셀 이상만 라벨링 |
라벨링 결과 내보내기
Label Studio에서 다양한 포맷으로 내보낼 수 있습니다.
COCO JSON
YOLO
Pascal VOC
Export → COCO 선택바운딩 박스와 세그멘테이션 어노테이션을 COCO JSON 형식으로 내보냅니다.
Export → YOLO 선택이미지별 .txt 파일과 classes.txt가 생성됩니다.
Export → Pascal VOC XML 선택이미지별 XML 어노테이션 파일이 생성됩니다.
라벨링 도구 비교
| 도구 | 라이선스 | 특징 | 추천 용도 |
|---|
| Label Studio | Apache 2.0 | 다양한 태스크 지원, 웹 기반 | 범용 추천 |
| CVAT | MIT | 영상 라벨링 강점, 팀 협업 | 영상 프로젝트 |
| Roboflow | 상용 (무료 티어) | 자동 증강, 모델 학습 통합 | 빠른 프로토타이핑 |
| LabelImg | MIT | 가벼운 데스크톱 앱 | 소규모 바운딩 박스 |
소규모 프로젝트에는 Label Studio의 로컬 설치로 충분합니다. 팀 단위 대규모 라벨링에는 Label Studio Enterprise 또는 CVAT를 검토하세요.
라벨링 품질 관리
교차 검증 (Inter-Annotator Agreement)
def calculate_iou(box1, box2):
"""두 바운딩 박스의 IoU를 계산합니다."""
x1 = max(box1[0], box2[0])
y1 = max(box1[1], box2[1])
x2 = min(box1[2], box2[2])
y2 = min(box1[3], box2[3])
intersection = max(0, x2 - x1) * max(0, y2 - y1)
area1 = (box1[2] - box1[0]) * (box1[3] - box1[1])
area2 = (box2[2] - box2[0]) * (box2[3] - box2[1])
union = area1 + area2 - intersection
return intersection / union if union > 0 else 0
# 두 작업자의 라벨링 일치도 확인
iou = calculate_iou(annotator1_box, annotator2_box)
print(f"라벨링 일치도 (IoU): {iou:.3f}")
# IoU > 0.7이면 양호한 수준
- 사전학습 모델로 예측 후 교정: 모델의 예측 결과를 초기값으로 제공하고 사람이 수정합니다. 2) Active Learning: 모델이 불확실한 이미지만 선별하여 라벨링합니다. 3) SAM 활용: 클릭 한 번으로 세그멘테이션 마스크를 자동 생성합니다.
명확한 가이드라인 문서를 작성하고, 파일럿 라벨링으로 품질을 검증한 뒤 본격 작업을 시작하세요. 교차 검증으로 작업자 간 일관성을 정기적으로 확인하는 것이 중요합니다.