모델 초안예외 검수자동 학습

라벨링,
대부분은 기계가.

이미지 폴더를 넣으면 모델이 먼저 라벨을 만들고,
사람은 틀린 것만 고친다. 승인할수록 다음 초안은 더 정확해진다.

기본 경로 100% 로컬필수 API 키 없음 Apple Silicon 최적화COCO · YOLO 출력
0.995문서 서명 제로샷 mAP50
0.8초장당 박스 오토라벨
137회귀 테스트 통과
0필수 클라우드 의존

실제 DeepPCB 홀드아웃 + 번들 모델 추론 결과 — 앱 레이아웃만 재현한 도식

문제

사람이 전부 그리던 순서를
기계가 먼저 그리도록 뒤집었다

그런데 기존 도구는 사람이 그리는 화면을 먼저 주고 오토라벨을 부가 기능으로 둔다. 순서가 거꾸로다. 슬라이더를 끌어 차이를 보라.

실제 원본실제 모델 초안

말로 찾는다

클래스 이름과 검출 프롬프트를 분리해 적는다. 도메인이 바뀌어도 코드가 아니라 설정만 바뀐다.

예시 박스 1개로 유사 객체 전부 · SAM 클릭으로 마스크

검증된 예외만 본다

홀드아웃과 클래스별 정밀도 검증을 통과한 초안만 자동 승인한다. 나머지와 심판의 위반·불확실은 사람에게 온다.

A 승인 · X 거부 · ⌘Z는 이미지를 건너서도 되돌린다

쓸수록 좋아진다

승인 라벨로 전용 모델을 자동 학습하고, 홀드아웃에서 기존 모델을 이길 때만 교체한다. 지면 조용히 폐기.

실측: 60장 도전 모델이 열세로 승격 거부 — 게이트 실작동
작동 방식

라벨링할수록
라벨링이 쉬워진다

사람이 승인한 라벨이 다음 라운드의 교사가 된다. 이 고리가 도구의 심장이다.

1

투입 — 복사 없이 연결까지

이미지 업로드, 기존 폴더 연결(복사 없음, 기존 COCO·YOLO 라벨 흡수), 또는 비디오 임포트.

비디오는 프레임 추출 + 메모리 전파 트래킹으로 프레임별 초안까지 자동
2

자동 초안 — 두 엔진을 먼저 견준다

전용 모델이 없으면 SAM 3와 Grounding DINO를 앞 30장 교차 실행해 비교 표본을 만든다. 승인 정답이 쌓이면 클래스마다 검수 비용이 적었던 엔진 또는 둘의 합의를 자동 선택한다.

경로가 정해진 뒤에도 10장에 1장은 두 엔진을 다시 돌려 근거를 갱신 · SAM 3가 없으면 Grounding DINO(+SAM 마스크)
3

문맥 심판 — 기준으로 판정

“사고에 연루된 차량만” 같은 판정은 검출 모델이 못 푼다. 기준문을 읽는 VLM이 박스마다 근거를 달아 예비 판정한다.

같은 기준 재실행은 캐시로 비용 0 · 24px 미만 박스는 묻지 않고 보류
4

리뷰 — 예외 확인

위반·불확실·저신뢰 순으로 정렬해 보여준다. 고신뢰 이미지는 미리보기를 확인하고 한 번에 승인.

통계적 배치 검수로 전수 대신 필요한 만큼만 검사
5

자동 학습 — 이겨야 교체

승인 8장부터 실험 학습을 시작하고, 데이터가 쌓이면 그룹이 섞이지 않는 train/val/test로 평가한다. 현재 모델과 같은 val에서 비교해 이긴 후보만 교체한다.

학습 중 epoch·ETA 표시 · Colab 번들도 성능표를 검증한 뒤 적용
↻

다시 2번으로 — 이번엔 더 정확하게

승급한 전용 모델이 초안 엔진을 대신한다. 초안이 좋아지면 리뷰가 줄고, 리뷰가 줄면 더 많이 승인된다.

실측 PCB: 제로샷 ≈0 → 42장 0.571 → 300장 0.963
비디오는 프레임마다 그리지 않는다 SAM 3 메모리 전파가 같은 객체를 이어 추적하고, 프레임별 초안 라벨로 저장된다 — 같은 객체는 meta.track_id로 묶인다
frame 001
frame 004
frame 007
frame 010

실측: 팬 영상 10프레임 → 박스 19개, 한 트랙이 9프레임 연속 유지

차별점

“이 박스가 기준에 맞나”를
기계가 먼저 답한다

검출 모델은 어디에 있는지만 안다. 아래는 실제 판정 출력 그대로 — 기준문 한 단락을 쓰고 돌린 결과다.

✓ 부합dog · conf 0.77
“빨간 박스 안 주 객체가 곱슬털 개(푸들류)로 dog 라벨에 부합한다”

사람이 볼 필요 없음 — 통과

✗ 위반dog · conf 0.40
“빨간 박스 안 주 객체가 개가 아니라 세로 나무 판자(울타리·상자 형태) 구조물이라 dog 라벨과 부합하지 않는다”

검출기가 흘린 오탐을 심판이 잡아냄

? 불확실cup · 저해상도
“이미지 해상도가 낮아 빨간 박스 안 객체가 컵인지 그릇인지 형태를 명확히 구분할 수 없다”

거짓 확신 대신 “모른다” — 사람 확인 대상

  • 비용 — Claude Code CLI가 있으면 구독 경로로 무료, API 키가 있으면 Claude API, 로컬 Ollama도 가능. 셋 다 없으면 이 기능만 비활성되고 나머지는 정상 동작한다.
  • 재실행이 공짜 — 판정은 기준 해시와 박스 스냅샷을 키로 캐시된다. 고친 박스만 다시 묻는다.
  • 중단에 안전 — 서버를 세 번 강제 재시작한 실측에서 “중단됨”을 정직하게 보고하고, 재실행 시 캐시 재사용으로 판정 유실 0.
증거

숫자로

전부 고정 홀드아웃 기준 자체 측정치다. M4 Pro · MPS · 단일 머신.

0.995

문서 서명 제로샷 mAP50
SAM 3. 같은 데이터에서 기존 경로는 0.000 — 라벨 0장으로 시작이 가능해졌다

0.963

PCB 결함 (제로샷 완전 실패 도메인)
≈0 → 승인 42장 0.571 → 300장 0.963. 특수 도메인의 정공법

9/9

정검출 · 오검출 0
개 9장 + 함정 6장. 개 닮은 인형에도 속지 않았다

문서 서명 도메인 · 같은 데이터, 같은 홀드아웃 (mAP50)

Grounding DINO 제로샷0.000
SAM 3 제로샷0.995
시드 100장 → 전용 모델0.969
항목수치
배치 오토라벨 (박스 / 박스+마스크)0.8초 / 1.8초 per 장
SAM 클릭 보정 (브라우저에서 디코딩)클릭당 ~120ms
흔한 객체 제로샷 — person 128장이미지 단위 61 / 62
멀티클래스 제로샷 — cup · bowl · tablemAP50 0.690
비디오 트래킹 — 팬 영상 10프레임박스 19개 · 9프레임 연속
익스포트 → 재임포트 왕복 (128장)460 → 460 박스
목록 전송량 (썸네일 캐시 도입 후)−97.8%
회귀 테스트 — 백엔드 / 프론트(unit+browser)88 / 14+35 통과

핵심 결론: 흔한 객체는 첫날부터 자동, 특수 도메인은 수동 수십 장 투자 후 자동.

신뢰

조용히 틀리지 않는다

라벨링 도구의 최악은 오류가 아니라 보고되지 않은 오류다. 회귀 테스트 137개는 실제 결함과 핵심 경계 조건을 재현해 막는다.

완료가 아닌 종료를
완료라고 말하지 않는다

서버가 재시작되면 진행 중이던 작업은 “중단됨”으로, 어디까지 처리했는지와 함께 보고된다. 절반만 라벨된 데이터를 끝난 줄 알고 넘기는 일이 없다.

사용자 원본은
건드리지 않는다

폴더 연결 임포트는 복사 없이 참조한다. 프로젝트·이미지 삭제는 도구가 만든 파일만 지운다 — 연결된 원본 데이터셋은 그대로 남는다.

부분 실패도
세서 알린다

손상 파일 건너뛰기, 온톨로지에 없는 클래스 제외, 이미지 누락 — 조용히 통과시키지 않고 개수로 노출한다.

그리고 라벨링에 필요한 나머지 전부

예시 박스 1개 → 유사 객체 전부 SAM 클릭 마스크 타일링 추론 계층 라벨 (person.head) 프롬프트 실험 SAM 3 · GDINO 교차 시험 검수 기반 클래스 라우팅 누락 라벨 찾기 라벨 의심 랭킹 권장 임계값 자동 계산 능동 샘플 추천 통계적 배치 검수 일괄 승인·거부 100단계 되돌리기 학습 이력·롤백 검증 모델 자동 승인 Colab 모델 번들 검증 COCO · YOLO zip
시작하기

세 단계면 시작된다

Apple Silicon Mac · Python 3.11 · Node 20 기준.

# 1. 저장소 받기
git clone https://github.com/Seung-Won-Yu/autolabel.git && cd autolabel

# 2. 최초 1회 — venv · 의존성 · SAM 가중치 · 브라우저 디코더
./setup.sh

# 3. 실행 — 백엔드 + 프론트 동시, 브라우저 자동 오픈
./start.sh
  • 코드를 고쳤다면 — ./test.sh && ./test-e2e.sh로 백엔드 88개와 프론트 49개(unit 14 + 브라우저 35) 회귀 경로를 확인한다.
  • 첫 프로젝트 — 이름 짓고, 클래스 한 줄 적고, 이미지 던지고, “전체 오토라벨”을 누른다. 나머지는 “지금 할 일” 배너가 단계별로 안내한다.
  • SAM 3는 선택 — facebook/sam3 접근 승인 후 models/sam3.pt로 두면 제로샷이 자동 승급된다. 없으면 Grounding DINO + SAM 경로로 동작.
  • 결과는 어디로든 — COCO / YOLO zip은 바로 학습 가능한 구조, 학습된 .pt도 내려받는다. 로컬로 감당 안 되는 규모는 Colab 노트북으로.
솔직한 답

자주 나오는 질문

정말 무료인가?

도구와 로컬 모델(SAM 3 · Grounding DINO · SAM · YOLO)은 전부 로컬 실행이라 사용료가 없다. 문맥 심판도 Claude Code CLI가 설치돼 있으면 구독에 포함된 경로로 돌아 별도 과금이 없다.

다만 구독 사용량은 소비된다. 완전 무료를 원하면 로컬 Ollama 비전 모델로 바꿀 수 있다 (품질은 낮아진다). ANTHROPIC_API_KEY를 넣는 순간부터만 종량 과금이다.

사람이 아예 안 봐도 되나?

아니다. 그리고 그건 어떤 도구도 못 한다 — 라벨의 정답 자체가 프로젝트마다 다르게 정의되기 때문이다(“접시는 bowl인가?”는 모델이 아니라 사람이 정한다).

이 도구가 겨냥하는 최선은 전수 판독을 예외 확인으로 줄이는 것이다. 기준을 글로 적어두면 그 판단을 기계가 먼저 대신하고, 사람은 위반·불확실만 본다.

내 도메인은 특수한데 될까?

텍스트로 설명되는 개념이면 첫날부터 자동에 가깝다(서명 실측 0.995). PCB 미세 결함처럼 제로샷이 완전히 실패하는 도메인은 수동 수십 장이 필요하다 — 대신 그 뒤로는 급격히 좋아진다(42장 0.571 → 300장 0.963).

첫 3장에서는 SAM 3와 Grounding DINO를 함께 돌려 합의·단독 후보를 보여주고, 사람이 승인한 결과로 클래스별 엔진을 보정한다. 그래도 검출률이 낮으면 도구가 다음 수 (프롬프트 실험 / 직접 라벨 후 학습)를 지정한다.

팀에서 같이 쓸 수 있나?

지금은 1인 로컬 전제다(SQLite · 단일 프로세스). 여러 사람이 동시에 쓰려면 잡 큐와 DB 교체가 필요하고, 그건 로드맵에 남아 있다.

라이선스는?

전용 모델 학습에 쓰는 YOLO 계열은 AGPL-3.0이다. 개인·내부 사용은 무방하지만 제품에 실어 배포할 계획이면 교체가 필요하다 — 교체 지점은 server/train_worker.py 한 곳으로 격리해 두었다.

SAM 3는 Meta의 자체 라이선스(SAM License)를 따른다. 상용·재배포 조건은 원문을 확인할 것.

준비됐다면,
첫 배치를 돌려보자

클래스 한 줄 적고, 이미지 폴더를 연결하고, 모델의 초안을 확인한다.