콘텐츠로 이동
GitHub

dataset 정리

studio 의 Curate 페이지(http://localhost:8730/curate)에서 시연 수집으로 모은 시연을 LeRobot dataset 으로 변환합니다. 그리퍼 영상의 배경을 그대로 둘 수도 있고, 그리퍼와 작업 물체만 남기고 나머지를 무작위 무늬로 바꿀 수도 있습니다.

페이지는 위에서 아래로 세 단계입니다.

  1. Keep labels: 시연마다 그리퍼 영상의 각 프레임에서 남길 영역을 표시합니다. 결과는 시연 폴더의 masks/ 이고, 영상 자체는 바꾸지 않습니다.
  2. Review: 시연마다 표시한 영역을 영상에 겹쳐 확인합니다.
  3. Convert: 판정을 통과한 시연을 LeRobot dataset 으로 변환합니다. 1 단계의 표시를 읽어 남길 영역 밖을 시연마다 다른 무늬로 칠합니다.

배경을 칠한 dataset 은 3 단계에서 만들어집니다. 1 단계만 마친 상태에서는 표시만 있고 dataset 은 없습니다.

policy 가 보는 것은 두 그리퍼 카메라의 영상뿐인데, 그 영상에는 그리퍼와 작업 물체 말고도 방, 시연하는 사람, Hermit 몸통과 마커가 함께 찍힙니다. 이것들은 로봇이 policy 를 실행할 때 똑같이 보이지 않아서, policy 가 거기에 기대어 배우면 실행할 때 엉뚱하게 움직입니다. 그래서 시연마다 배경을 다른 무늬로 칠해 dataset 에 넣어, policy 가 그리퍼와 작업 물체만 보고 움직이도록 학습시킵니다.

keep label 은 그리퍼 영상의 프레임마다 남길 영역을 적은 그림입니다. 남기는 것은 아래와 같고, 나머지는 모두 배경입니다.

  • 그 카메라가 달린 그리퍼: claw, jaw, 서보, 카메라 브래킷
  • 다른 손의 그리퍼: 로봇의 다른 팔이 보여 줄 claw, jaw, 서보, 카메라, 브래킷
  • 작업 물체: 매트, 블록, 그릇처럼 작업에 쓰는 것
  • 렌즈 테두리: fisheye 화면 원 바깥의 검은 부분. 로봇 카메라에서도 똑같이 검게 보입니다

그리퍼는 영상에서 찾지 않고 description 의 형상으로 그립니다. 카메라는 camera.yaml 의 자리에, 렌즈는 시연이 기록한 Kannala-Brandt fit 으로, jaw 는 그 순간의 열림으로, 다른 손은 탑 카메라가 잰 두 손의 상대 위치로 놓습니다. Hermit 의 몸통과 마커는 그리지 않으므로 배경이 됩니다. 렌즈 테두리는 시연 영상 전체에서 한 번도 밝아지지 않는 바깥 영역에 원을 맞춰 찾으므로, 화면 가장자리의 어두운 물건은 테두리로 잡히지 않습니다.

작업 물체는 SAM 3 가 영어 이름으로 찾습니다. Keep labels 의 왼쪽에는 판정을 통과한 시연의 그리퍼 사진이 한 장 나오고, 시연과 Left·Right 카메라, 프레임을 골라 바꿀 수 있습니다. 오른쪽 Things to keep 에 물체 이름을 하나씩 넣으면(예: black cube) SAM 3 가 그 사진에서 바로 찾아 분홍 테두리와 이름표로 표시하고, 목록에는 그 프레임에서 찾은 개수가 나옵니다. 목록의 줄에 마우스를 올리면 그 물체만 칠해집니다. 그리퍼는 흰 점선으로, 버릴 영역은 어둡게 보입니다. 엉뚱한 것이 잡히거나 아무것도 안 잡히면 이름을 바꿔 다시 넣습니다(black cube 가 멀티탭을 잡으면 small black cube).

사진에서 물체가 맞게 잡히면 Make labels 를 누릅니다. 판정을 통과했고 그 물체들로 만든 keep label 이 없는 시연마다, 두 그리퍼 영상을 끝까지 추적합니다. 어느 프레임에서든 한 번 찾은 물체는 앞뒤로 따라가므로, 미리보기 프레임에서 안 보이는 물체도 다른 프레임에서 찾으면 됩니다. 같은 이름의 물체가 여러 개면 모두 찾습니다. 진행 막대에는 지금 하는 시연과 영상, 물체가 나오고, Stop 으로 멈출 수 있습니다. keep label 은 시연 폴더의 masks/ 에 저장됩니다.

SAM 3 는 따로 설치해야 합니다. 설치 방법은 설치의 SAM 3 환경에 있습니다. 맥에서는 물체 셋에 시연 하나가 몇 분 걸립니다.

Things to keep 위의 SAM 3 on 에서 SAM 3 를 돌릴 컴퓨터를 고릅니다. 목록은 this machine 과 Train 페이지의 Sources 에 추가한 컴퓨터입니다. 목록에 없는 컴퓨터는 옆의 Add 로 ssh 접속 줄과 작업 폴더를 넣어 바로 추가하면 SAM 3 가 그 컴퓨터에서 돌고, Train 페이지의 Sources 에도 함께 올라갑니다. NVIDIA GPU 가 있는 컴퓨터를 고르면 시연 하나에 걸리는 시간이 맥의 3 분의 1 정도로 줄어듭니다. 8 GB GPU 에서 물체 셋이면 6 초 시연 하나가 2 분 남짓입니다.

항목 동작
준비 고르면 studio 가 그 컴퓨터의 Sources 폴더(기본 ~/pinkrab-train)에 SAM 3 환경(sam3-env)을 만들고 가중치를 받습니다. 처음 한 번은 몇 분 걸리고, 진행 상황은 선택 칸 아래에 나옵니다. 그다음부터는 몇 초면 ready 가 됩니다
시연 시연은 이 컴퓨터에 그대로 두고, 그리퍼 영상만 보내 keep label 을 받아 옵니다
미리보기와 Make labels 같은 컴퓨터의 SAM 3 하나를 함께 씁니다. Make labels 가 도는 동안 미리보기는 그리퍼만 그리고, 끝나면 물체를 다시 찾습니다
Stop, 연결 끊김 그 컴퓨터의 SAM 3 도 바로 멈춰 GPU 를 비웁니다
1 분 미사용 SAM 3 를 멈춰 GPU 를 비우므로 그 컴퓨터에서 바로 학습을 띄울 수 있고, 다음에 처음 쓸 때는 모델을 다시 올리느라 10 초쯤 더 걸립니다

SAM 3 의 가중치는 승인을 받아야 받을 수 있어서, 그 컴퓨터가 가중치를 처음 받을 때는 Hugging Face 로그인이 필요합니다. 로그인이 없으면 선택 칸 아래에 실행할 명령이 나오므로, 그 컴퓨터에서 실행한 뒤 Try again 을 누릅니다. 가중치를 받은 뒤에는 로그인 없이 씁니다.

Review 목록에는 녹화를 마친 시연마다 판정과 keep label 의 상태가 나옵니다. dataset 에는 판정을 통과한 시연만 들어갑니다.

열 내용
verdict 판정 결과. 떨어진 시연은 이유가 진하게 나옵니다
keep labels keep label 을 만들 때 적은 작업 물체. 지금 적은 물체와 다르면 (other things)
flags 추적이 의심스러워 검수할 구간의 수

줄 끝의 Review 는 그 시연의 두 그리퍼 영상을 keep label 과 겹쳐 재생합니다. 남길 영역은 분홍 테두리로 두르고 나머지는 어둡게 보입니다. 배경을 칠한 모습은 변환한 뒤 dataset 에서 봅니다.

타임라인의 빨간 구간과 그 아래 목록은 추적이 의심스러운 곳입니다.

표시 뜻
lost 화면 가장자리에 닿지 않은 물체가 사라짐. 시야 밖으로 나간 것이 아니라 추적을 놓친 것
jumped 물체의 넓이가 한 프레임 사이에 3배 넘게 바뀜. 다른 것을 그 물체로 잡았거나 일부만 잡은 것

물체를 놓친 프레임에서는 그 물체가 배경으로 칠해지므로, policy 는 그 프레임에서 물체를 보지 못합니다. 놓친 구간이 길면 물체 이름을 바꿔 keep label 을 다시 만들거나, 그 시연을 빼고 변환합니다.

Convert 단계에 dataset 이름과 작업 설명을 적고 Convert 를 누르면 판정을 통과한 시연 전체를 변환합니다. 떨어진 시연은 지우지 않았어도 빠지고, 진행 줄에 빠진 이유가 나옵니다. 작업 설명은 시연한 작업을 영어 문장으로 적습니다(예: pick and place the block). dataset 은 ~/pinkrab/datasets/<이름>/ 에 저장되고 Datasets 목록에 나타납니다.

변환 설정은 따로 고르지 않습니다.

  • 배경: keep label 이 있는 시연이 하나라도 있으면 배경을 칠하고, label 이 없는 시연은 뺍니다. label 이 있는 시연이 하나도 없으면 녹화한 그대로 넣습니다. 버튼 아래 줄에 어느 쪽으로 몇 개가 들어가는지 나옵니다.
  • 무늬: 시연마다 하나씩, 매끄럽게 번지는 색 위에 줄무늬·체크·얼룩 가운데 하나를 겹친 것입니다. 한 시연 안에서는 바뀌지 않고, 같은 시연에는 변환할 때마다 같은 무늬가 나옵니다.
  • fps: core 설정의 dataset_fps(50)이고, 학습한 policy 는 이 주기로 실행됩니다. 카메라 프레임 사이를 채우는 방법은 dataset 의 fps 에 있습니다.

변환이 끝나면 진행 줄 아래의 View the dataset, 또는 Datasets 목록 줄의 View 로 만든 dataset 을 엽니다. 왼쪽에 episode 와 그 episode 가 나온 시연이 나열되고, 두 그리퍼 영상을 dataset 에 저장된 그대로 재생합니다. 학습이 읽는 그림이 이것입니다.

같은 변환을 명령으로도 할 수 있습니다. 명령은 판정 없이 적은 시연을 그대로 변환하고, --randomised 를 붙이면 배경을 칠합니다.

터미널 창
pinkrab-umi convert --randomised --out pick_place --task "pick and place the block" <episode> <episode> ...