0biglife.

[자율주행] 어노테이션 툴 만들기 ③ 루프 — 자동 라벨과 사람이 서로를 먹이는 법

자율주행/어노테이션 툴

· 2026-09-07

[자율주행] 어노테이션 툴 만들기 ③ 루프 — 자동 라벨과 사람이 서로를 먹이는 법

본문의 점선 밑줄 친 전문용어를 누르면 설명이 열립니다.

에디터를 만들고 백엔드를 붙이면 도구가 돌아간다. 그런데 거기까지는 "사람이 라벨을 만드는 시스템"일 뿐이다.

이 글은 그다음이다. 모델이 만든 라벨과 사람이 만든 라벨이 서로를 먹이는 루프를 어떻게 닫는가. 그리고 이 루프가 왜 데이터 엔지니어와 툴 엔지니어를 한 사람에게 묶어놓는지.

      ┌──────────────────────────────────────────────┐
      │                                              │
      ▼                                              │
  자동 라벨러 ──▶ 에디터에 사전 주입 ──▶ 사람이 수정 ──┤
      ▲                                              │
      │                                              ▼
      └────────── 재학습 ◀── 품질 게이트 ◀── 라벨 스냅샷

오프라인은 반칙이다

먼저 왜 자동 라벨이 쓸 만한지부터. 흔한 오해는 "차에서 도는 모델이 못 잡는 걸 어떻게 자동으로 라벨링하나"인데, 전제가 다르다.

오프라인 라벨러는 온라인 모델보다 유리하다.

  • 실시간 제약이 없다. 10배 무거운 앙상블을 써도 된다.
  • 미래를 볼 수 있다. 지금 가려진 차가 3초 뒤 드러나면, 그 정보를 소급해 지금 프레임의 박스에 반영한다.
  • 을 누적할 수 있다. 앞뒤 수십 프레임을 리파인 포즈로 겹치면 원거리 객체도 형상이 살아난다.
  • 을 시간 전체에서 다듬는다. 프레임마다 튀는 박스 대신 부드러운 트랙이 나온다.

그래서 잘 만든 자동 라벨러는 원거리·가림 상황에서 오히려 사람보다 일관되다. 사람의 역할이 "그리는 사람"에서 "판정하는 사람" 으로 옮겨간다.

에디터에 어떻게 집어넣는가

여기가 툴 엔지니어의 몫이고, 설계를 잘못하면 자동 라벨이 오히려 방해가 된다.

① 사람이 만든 것과 구분되어야 한다

자동 라벨은 시각적으로 달라야 한다 — 점선 테두리, 다른 채도, "AUTO" 배지. 그래야 라벨러가 "이건 검토 대상"이라고 인식한다. 구분이 없으면 라벨러가 자동 라벨을 그냥 승인하고 넘어간다.

그리고 손댄 순간 상태가 바뀌어야 한다.

auto  ──(사람이 수정)──▶  auto+human
      ──(사람이 확인만)──▶  auto+verified
      ──(사람이 삭제)────▶  auto+rejected

이 세 상태를 구분해 기록하는 게 뒤에 나올 모든 지표의 근거가 된다.

② 신뢰도를 노출한다

모델이 낸 confidence를 색이나 정렬 순서로 보여준다. 라벨러가 낮은 것부터 보면 시간 대비 효과가 가장 크다.

여기에 붙는 실용적인 기능 하나 — "검토 필요"만 순회하는 단축키. 프레임을 순서대로 넘기는 게 아니라, 신뢰도가 낮거나 검사에 걸린 객체로 바로 점프한다. 라벨러가 이미 잘된 것을 보느라 쓰는 시간이 사라진다.

③ 되돌릴 수 있어야 한다

"자동 라벨 전부 되돌리기"가 있어야 라벨러가 과감하게 수정한다. 없으면 조심스러워지고, 조심스러우면 느려진다.

④ 자동 라벨이 나쁜 구간은 아예 끈다

원거리라 점이 몇 개 없거나, 측위가 흔들린 구간이거나, 자동 라벨러가 학습하지 않은 클래스라면 을 넣지 않는 게 낫다. 나쁜 사전 라벨을 지우는 시간이 처음부터 그리는 시간보다 길다.

자기 확증 — 이 루프의 유일한 진짜 위험

루프가 돌기 시작하면 조용히 나빠지는 경로가 있다.

자동 라벨러가 A를 잘 잡고 B를 못 잡는다
  → B에 대한 사전 라벨이 안 나온다
  → 라벨러가 화면에 있는 것 위주로 검토한다
  → B가 빠진 라벨이 학습에 들어간다
  → 자동 라벨러가 B를 더 못 잡게 된다

모델의 편향이 라벨의 편향이 되고, 그게 다시 모델을 강화한다. 그리고 평가 세트까지 같은 방식으로 만들면 측정으로도 안 잡힌다.

막는 방법은 셋이다.

  • 평가 세트는 사람 손으로 따로 유지한다. 학습 라벨은 자동화해도 자를 자동화하면 안 된다.
  • 무작위 표본을 검수에 섞는다. 신뢰도 낮은 것만 보내면 모델이 자신 있게 틀리는 케이스를 영영 못 본다.
  • "놓친 객체" 자체를 세는 지표를 둔다. 사람이 새로 추가한 객체 수를 자동 라벨러 버전별로 추적하면 재현율이 나빠지는 걸 바로 안다.

품질 게이트 — 라벨 납품에 CI를 붙인다

코드에는 테스트를 붙이면서 라벨에는 안 붙이는 게 이상하다. 라벨 오류는 조용히 모델 성능의 천장을 깎는다.

사람 판단 없이 자동으로 잡히는 것들이 의외로 많다.

검사무엇을 잡나
박스 안 점 개수 0허공에 그린 박스, 좌표계 실수
급변가림 구간에서 끊긴 트랙
프레임 간 크기 변화율 초과같은 차가 갑자기 커짐
물리적으로 불가능한 속도보간 오류, 위치 오타
도로 밖·건물 안 차량좌표계 혼동, 포즈 오류
박스 겹침 과다같은 객체를 두 번 라벨링
필수 속성 누락클래스·가려짐 미입력
클래스-크기 불일치보행자인데 5m 박스
이미지 밖 2D 박스왜곡 공간 혼동

이걸 납품 배치마다 자동으로 돌리고 리포트를 낸다. 임계를 넘으면 자동 반려한다.

중요한 원칙 하나 — 검사는 에디터 안에서도 실시간으로 돌아야 한다. 납품 후에 잡히면 다시 열어 고쳐야 하지만, 그리는 중에 경고가 뜨면 그 자리에서 끝난다. 같은 검사 로직을 에디터와 CI가 공유하게 만드는 게 설계 목표다.

그리고 경고는 차단이 아니다. 정당한 예외는 늘 있다(트럭 위에 실린 차, 진짜로 도로 밖에 있는 차). 막지 말고 사유를 적게 한다.

골든셋 회귀

전문가가 만든 소량의 정밀 정답을 두고, 새 라벨러·새 자동 라벨러 버전을 항상 여기에 채점한다. 모델 성능 회귀 테스트와 같은 구조다.

처리량 계측 — 무엇을 재고 무엇을 고치나

에디터 글에서 "측정하라"고 했던 것을 여기서 구체화한다.

무엇을 재나

객체당 소요 시간        가장 중요한 단일 지표
객체당 마우스 클릭 수
객체당 키 입력 수
실행취소 횟수           도구가 실수를 유발하는 지점
프레임 로딩 대기 시간    라벨러가 그냥 기다리는 시간
자동 라벨 수정률        auto → auto+human 비율
재작업률               검수 반려 비율

이 값들은 백엔드의 이벤트 로그에서 그대로 나온다. 별도 계측 시스템이 필요 없다는 게 이 설계의 이점이다.

어떻게 쓰나

  • 실행취소가 몰리는 동작을 찾는다. 특정 조작에서 undo가 유난히 많다면 그 UI가 실수를 유발하고 있다.
  • 대기 시간을 따로 뺀다. 객체당 30초 중 12초가 로딩 대기라면, 고쳐야 할 건 UI가 아니라 프리페치다.
  • 라벨러 간 편차를 본다. 특정 클래스에서 사람마다 시간이 크게 다르면 스펙이 모호하다는 신호다. 사람을 탓하기 전에 온톨로지를 고친다.

A/B로 검증한다

단축키를 바꾸거나 을 넣었을 때, 정말 빨라졌는지 감으로 판단하지 않는다. 절반에게 새 UI를 주고 객체당 시간을 비교한다. 도구 개선은 측정 가능한 개선이어야 한다.

주의 — 만 최적화하면 품질이 떨어진다. 항상 품질 지표와 함께 본다. 골든셋 정확도가 떨어지면서 빨라진 건 개선이 아니다.

무엇을 라벨링할지 고르는 것도 이 루프다

큐레이션에서 다룬 이야기가 여기서 도구와 만난다. 자동 라벨러가 있으면 선택이 훨씬 똑똑해진다.

  • 불확실성 기반 — 자동 라벨러의 confidence가 낮거나 앙상블이 갈리는 프레임
  • 불일치 기반 — 자동 라벨과 온라인 인지 결과가 크게 다른 프레임
  • 희소성 기반 — 임베딩 공간에서 기존 데이터와 먼 장면
  • 실패 기반개입 이벤트 전후

그리고 이 선택 결과가 곧바로 작업 큐에 들어가야 한다. → 작업 큐 → 에디터 → 라벨 DB → 학습이 한 파이프라인으로 이어져야 바퀴가 돈다. 여기서 하나라도 사람이 CSV를 들고 옮기고 있으면 그 지점이 병목이 된다.

이 직무 조합이 존재하는 이유

마지막으로, 왜 AI 데이터 엔지니어와 툴 풀스택이 한 사람에게 붙어 있는가.

이 글에 나온 것들을 보면 답이 보인다.

  • 자동 라벨을 에디터에 주입하려면 모델 출력 포맷과 라벨 스키마를 둘 다 알아야 한다
  • 품질 검사를 에디터와 CI가 공유하려면 프론트와 파이프라인을 둘 다 짜야 한다
  • 지표는 UI 이벤트에서 나와 데이터 웨어하우스로 흘러간다
  • 좌표계를 모르는 사람이 만든 3D 에디터는 미묘하게 틀린 라벨을 대량으로 만든다

즉 이 루프는 데이터와 도구의 경계에 걸쳐 있고, 그 경계를 넘나들 수 있는 사람이 있어야 닫힌다. 도구만 아는 사람은 라벨이 왜 틀렸는지 모르고, 데이터만 아는 사람은 라벨러가 왜 느린지 모른다.

정리

  • 오프라인 자동 라벨러는 온라인 모델보다 유리하다 — 미래 프레임, 누적 , 시간 전체 최적화.
  • 에디터 주입에는 규칙이 있다 — 사람 것과 구분, 신뢰도 노출, 되돌리기, 나쁜 구간에는 아예 안 넣기.
  • 이 루프의 유일한 진짜 위험은 자기 확증이다. 평가 세트는 사람 손으로, 무작위 표본을 섞고, "놓친 객체"를 센다.
  • 라벨 납품에 CI를 붙인다. 사람 판단 없이 잡히는 검사가 아홉 가지는 된다. 같은 로직을 에디터와 CI가 공유하게 만든다.
  • 객체당 시간·클릭·undo·대기 시간으로 재고, 백엔드 이벤트 로그에서 그대로 나온다. UI 변경은 A/B로 검증한다.
  • 라벨러 간 편차는 사람 문제가 아니라 스펙이 모호하다는 신호다.
  • 이 루프는 데이터와 도구의 경계에 있고, 그래서 두 직무가 한 사람에게 붙어 있다.

이 시리즈: ① 에디터 · ② 백엔드 · ③ 루프. 정답 데이터 자체는 어노테이션 데이터, 그 위의 데이터 계층은 AV 데이터 플랫폼에서 다룬다.

Index

오프라인은 반칙이다에디터에 어떻게 집어넣는가① 사람이 만든 것과 구분되어야 한다② 신뢰도를 노출한다③ 되돌릴 수 있어야 한다④ 자동 라벨이 나쁜 구간은 아예 끈다자기 확증 — 이 루프의 유일한 진짜 위험품질 게이트 — 라벨 납품에 CI를 붙인다골든셋 회귀처리량 계측 — 무엇을 재고 무엇을 고치나무엇을 라벨링할지 고르는 것도 이 루프다이 직무 조합이 존재하는 이유정리