Skip to main content
Summary

모델을 의심하기 전에 데이터를 본다

로봇 정책 학습이 잘 안 될 때 가장 먼저 확인할 것은 모델 구조가 아니다. 데이터다. 같은 정책이라도 깨끗한 데이터에서는 빠르게 배우고, 흔들리는 데이터에서는 이상한 행동을 반복한다. 영상은 정상처럼 보여도 action이 한 박자 늦게 기록되었거나, 특정 관절값이 끊겼거나, 그리퍼 명령이 반대로 들어가 있으면 학습은 쉽게 무너진다.

LeRobot 데이터셋은 보통 카메라 영상, 로봇 상태, 행동 명령, 타임스탬프를 함께 가진다. LeRobotDataset v3에서는 저차원 신호가 Parquet에 저장되고, 카메라 프레임은 MP4로 저장되며, 에피소드 경계는 meta/ 아래의 메타데이터로 복원된다.1 그래서 정제할 때는 파일 이름만 보지 말고, 에피소드 단위로 실제 재생하며 확인해야 한다.

좋은 정제의 목표는 데이터를 예쁘게 만드는 것이 아니다. 학습 가능한 기록만 남기는 것이다. 사람이 보아도 "이 장면에서 왜 이 행동이 나왔는지" 설명되지 않는 에피소드는 모델에게도 혼란이다.

데이터셋 정제와 시각화AI 생성 이미지

에피소드 단위로 함께 재생하기

가장 먼저 할 일은 수집한 에피소드를 눈으로 보는 것이다. LeRobot은 데이터셋을 시각화하는 CLI 도구를 제공한다. Hub에 올라간 데이터셋은 다음처럼 열 수 있다.2

lerobot-dataset-viz \
  --repo-id 사용자명/데이터셋이름 \
  --episode-index 0

로컬 폴더에 있는 데이터셋을 확인할 때는 --root와 --mode local을 사용한다.

lerobot-dataset-viz \
  --repo-id 사용자명/데이터셋이름 \
  --root ./my_local_data_dir \
  --mode local \
  --episode-index 0

이 도구는 Rerun 뷰어를 열어 카메라 스트림, 로봇 상태, 행동 값을 같은 시간축에서 보여준다.2 여기서 중요한 것은 영상만 보는 것이 아니다. 물체를 집는 순간에 그리퍼 action이 닫히는지, 팔이 움직이는 순간에 관절 state도 같이 변하는지, 영상 속 움직임과 그래프 변화가 같은 타이밍인지 봐야 한다.

온라인으로 빠르게 훑어볼 때는 LeRobot Dataset Visualizer도 유용하다. 이 도구는 에피소드 영상과 시계열 그래프를 동기화해 보여주고, 에피소드 길이 분포나 움직임이 적은 에피소드 같은 이상 후보를 찾는 데 도움을 준다.3

검수할 때는 한 번에 모든 에피소드를 자세히 보려 하지 말자. 먼저 0번, 중간 번호, 마지막 번호를 본다. 그다음 길이가 너무 짧거나 긴 에피소드, 실패가 의심되는 에피소드, 그래프가 평평하거나 튀는 에피소드를 골라 본다. 문제는 보통 무작위로 흩어져 있지 않고, 특정 수집 구간에 몰려 있다. 카메라가 밀린 뒤 수집한 구간, 조작자가 바뀐 구간, 포트를 다시 꽂은 뒤의 구간을 특히 확인한다.

시간 정렬 문제 찾기

타임스탬프 불일치는 데이터 품질 문제 중 가장 위험하다. 영상에서는 그리퍼가 물체에 닿았는데 action은 아직 접근 중인 값을 가리키거나, 로봇이 이미 움직였는데 state 변화가 뒤늦게 나타나면 정책은 잘못된 인과관계를 배운다.

먼저 각 에피소드의 타임스탬프가 단조롭게 증가하는지 확인한다. 시간이 거꾸로 가거나 같은 시간이 반복되면 저장 과정에 문제가 있었을 수 있다. 다음으로 프레임 간 간격을 본다. 예를 들어 30fps라면 이상적인 간격은 약 0.033초다. 실제 시스템에서는 약간 흔들릴 수 있지만, 특정 구간에서 간격이 두세 배 이상 벌어진다면 누락 프레임이나 기록 지연을 의심해야 한다.

시각화 화면에서는 다음 장면을 기준점으로 삼으면 좋다.

  • 로봇이 처음 움직이기 시작하는 순간

  • 그리퍼가 물체를 잡기 위해 닫히는 순간

  • 물체가 테이블에서 떨어지는 순간

  • 목표 위치에 놓고 그리퍼가 열리는 순간

이 네 순간에서 영상, observation.state, action, timestamp가 같은 사건을 가리키는지 확인한다. 한두 프레임 정도의 차이는 시스템에 따라 생길 수 있지만, 지속적으로 늦거나 앞서면 학습 전에 원인을 찾아야 한다. 카메라 fps 설정, 인코딩 지연, 로봇 제어 주기, 데이터 저장 스레드가 서로 맞지 않는 경우가 많다.

누락 프레임과 끊긴 관절값 확인하기

누락 프레임은 항상 검은 화면처럼 드러나지 않는다. 더 흔한 형태는 영상이 잠깐 멈춘 것처럼 보이는 것이다. 물체와 로봇이 한 프레임에서 갑자기 멀리 이동하거나, 손목 카메라가 순간적으로 같은 이미지를 반복한다면 프레임 드롭을 의심한다.

관절값도 비슷하다. 정상적인 텔레오퍼레이션 데이터에서는 관절 state가 대체로 연속적으로 변한다. 사람이 빠르게 움직여도 그래프는 부드러운 곡선에 가깝다. 다음과 같은 패턴은 위험 신호다.

  • 특정 관절값이 여러 초 동안 완전히 고정되어 있다.

  • 한 프레임 사이에 물리적으로 불가능한 크기로 값이 튄다.

  • 모든 관절값이 동시에 0 또는 같은 값으로 떨어진다.

  • 영상 속 로봇은 움직이는데 state는 변하지 않는다.

  • action은 변하는데 실제 로봇 상태가 따라오지 않는다.

특히 그리퍼는 따로 봐야 한다. 집기 태스크에서 그리퍼 명령은 성공과 실패를 가르는 핵심 신호다. 그리퍼가 닫혀야 할 순간에 action이 열림 방향으로 기록되어 있거나, 조작 장치의 축이 반대로 매핑되어 있으면 모델은 물체 앞에서 계속 놓는 행동을 배운다. 에피소드 몇 개를 골라 "닫힘 값이 커지는가, 작아지는가", "완전히 닫힌 값과 열린 값이 일관적인가"를 확인한다.

문제가 있는 에피소드는 과감히 제거한다. LeRobot의 lerobot-edit-dataset은 특정 에피소드를 삭제해 새 데이터셋을 만들 수 있다.2

lerobot-edit-dataset \
  --repo_id 사용자명/raw_pick_cube \
  --new_repo_id 사용자명/pick_cube_clean_v1 \
  --operation.type delete_episodes \
  --operation.episode_indices "[3, 17, 24]"

원본을 바로 덮어쓰지 않는 것이 좋다. 정제 전 데이터셋과 정제 후 데이터셋을 분리해야 나중에 실험 결과를 비교할 수 있다.

수집 편향을 숫자로 확인하기

영상 검수만으로는 편향을 찾기 어렵다. 사람이 보기에는 다양한 것처럼 보여도 실제로는 물체가 거의 같은 위치에 놓였거나, 로봇이 항상 같은 경로로만 접근했을 수 있다. 이런 데이터로 학습한 정책은 훈련 환경에서는 잘하지만, 물체가 조금만 옆으로 가도 실패한다.

분포를 확인할 때는 다음 값을 본다.

  • 에피소드 길이 분포

  • 시작 시점의 관절 상태 분포

  • 물체 위치를 추정할 수 있다면 물체의 시작 위치 분포

  • 그리퍼가 닫히는 시점의 분포

  • 각 관절 action의 최솟값, 최댓값, 평균, 표준편차

  • 성공 에피소드와 실패 에피소드의 비율

예를 들어 큐브 집기 데이터 100개를 모았는데 80개가 카메라 중앙 오른쪽 아래에서 시작한다면, 모델은 그 위치에 과하게 맞춰질 수 있다. 같은 물체, 같은 조명, 같은 배경만 있는 것도 편향이다. 반대로 너무 많은 변화를 한 번에 넣는 것도 문제다. 처음에는 물체 위치를 고르게 늘리고, 그다음 조명이나 방향을 조금씩 늘리는 식이 좋다.

분포 확인은 복잡한 통계가 아니어도 된다. 에피소드별 시작 관절값을 산점도로 그리고, 에피소드 길이를 히스토그램으로 보고, 그리퍼 명령의 범위를 확인하는 것만으로도 많은 문제가 드러난다. 중요한 것은 "내가 평가하려는 상황이 훈련 데이터 안에 충분히 들어 있는가"라는 질문이다.

학습용, 검증용, 평가용으로 나누기

정제한 데이터는 바로 전부 학습에 쓰지 말고 나누어야 한다. 기본은 학습용, 검증용, 평가용 세 가지다.

학습용 데이터는 모델이 직접 배우는 데이터다. 검증용 데이터는 학습 중 설정을 고를 때 본다. 예를 들어 몇 epoch에서 멈출지, 어떤 learning rate가 나은지 판단하는 데 쓴다. 평가용 데이터는 마지막까지 열어 보지 않는 데이터다. 최종 정책이 새로운 에피소드에도 일반화되는지 확인하기 위한 기준이다.

작은 데이터셋에서는 보통 8:1:1 또는 7:1:2 정도로 시작할 수 있다. 단, 무작위 분할만 믿으면 안 된다. 같은 날 같은 위치에서 연속으로 수집한 에피소드가 학습용과 평가용에 섞이면 평가가 쉬워진다. 가능하면 평가용에는 물체 위치, 조명, 조작자, 수집 시간이 조금 다른 에피소드를 넣는다. 그래야 실제 배포에 가까운 성능을 볼 수 있다.

lerobot-edit-dataset은 데이터셋을 여러 부분으로 나누는 기능도 제공한다.2

lerobot-edit-dataset \
  --repo_id 사용자명/pick_cube_clean_v1 \
  --operation.type split \
  --operation.splits '{"train": 0.8, "val": 0.1, "test": 0.1}'

과적합은 학습 손실만 보면 놓치기 쉽다. 학습용 성능은 좋아지는데 검증용 손실이 더 이상 줄지 않거나, 평가용에서 집기 성공률이 낮다면 모델이 데이터의 표면적 패턴만 외웠을 가능성이 크다. 이때 모델을 키우기보다 먼저 데이터 분할이 제대로 되었는지, 평가용이 너무 어려운지, 반대로 학습 데이터가 너무 좁은지 확인해야 한다.

데이터셋 버전을 실험 단위로 관리하기

정제는 한 번에 끝나지 않는다. 첫 학습 후 실패 장면을 보고 다시 데이터를 고치게 된다. 그래서 데이터셋 버전 관리는 선택이 아니라 실험의 일부다.

권장하는 이름은 단순해야 한다.

  • pick_cube_raw_v0: 수집 직후 원본

  • pick_cube_clean_v1: 명백한 실패와 센서 오류 제거

  • pick_cube_clean_v2: 위치 편향을 줄이기 위해 추가 수집

  • pick_cube_eval_v1: 최종 비교용 평가 세트

각 버전에는 짧은 변경 기록을 남긴다. "에피소드 3, 17, 24 삭제", "왼쪽 위치 데이터 30개 추가", "그리퍼 반전 문제가 있던 2차 수집분 제외"처럼 적으면 충분하다. 중요한 것은 나중에 학습 결과를 봤을 때 어떤 데이터 차이가 성능 차이를 만들었는지 추적할 수 있어야 한다는 점이다.

Hub에 올릴 때도 원본과 정제본을 구분하자. 원본은 다시 확인할 수 있는 기준이고, 정제본은 학습에 쓰는 입력이다. 정제본만 남기면 나중에 삭제 판단이 맞았는지 검증하기 어렵다.

정제의 기준은 학습 가능성이다

좋은 데이터셋은 크기보다 일관성이 먼저다. 에피소드의 시작과 끝이 분명하고, 영상과 상태와 행동이 같은 시간을 가리키며, 관절값과 그리퍼 명령이 물리적으로 말이 되어야 한다. 또한 훈련 데이터가 평가하려는 상황을 충분히 덮고 있어야 한다.

학습이 실패했을 때 바로 정책을 바꾸지 말자. 먼저 에피소드 몇 개를 재생하고, 타임스탬프를 보고, 그리퍼 명령을 확인하고, 데이터 분포를 살펴본다. 로봇 학습에서 데이터 정제는 부가 작업이 아니다. 정책이 배울 수 있는 세계를 정리하는 핵심 과정이다.

참고

1LeRobotDataset v3.0 · Hugging Face

2Using Dataset Tools · Hugging Face

3LeRobot Dataset Visualizer · GitHub

책 목록

LeRobot 실전 가이드: 데이터 수집부터 로봇 배포까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기