datasets
데이터셋 일괄 변경 (Batch Edit)
한 데이터셋에 증강 / 다운샘플 / 크롭 / 회전을 한 번에 적용해 새 데이터셋을 만듭니다.
최근 확인 버전: v5.0.0
일괄 변경(Batch Edit) 은 한 데이터셋 전체에 네 가지 변환 — 증강 / 다운샘플 / 크롭 / 회전 — 을 한 번에 적용해 새 데이터셋을 생성하는 기능입니다.
어디서 여나
좌측 네비의 데이터셋 탭에서 다음 두 방법 중 하나로 엽니다.
- 데이터셋 폴더 라벨 클릭 — 트리에서 데이터셋 이름(아이콘/텍스트) 영역을 클릭하면 우측에 BatchEditPanel 이 펼쳐집니다. expand/collapse는 행 우측의 chevron으로만 동작하므로, 폴더를 열지 않고도 패널을 열 수 있습니다.
- 데이터셋 우클릭 → Batch Edit — 우클릭 메뉴의 Batch Edit 항목을 누릅니다.

패널 구성
패널 상단에 출력 데이터셋 이름 입력칸이 있고, 그 아래로 네 개의 섹션(Augmentation / Downsample / Crop / Rotate)이 펼침/접힘 카드 형태로 정렬되어 있습니다. 각 섹션은 Enable 토글로 따로 켜고 끕니다 — 켜진 섹션만 실제로 적용됩니다.

Augmentation 섹션
색상·노이즈·perspective 변환을 적용해 한 에피소드에서 여러 학습 샘플을 만듭니다. 다음 하위 항목으로 구성됩니다.
- Repeat — 한 원본 에피소드에서 몇 배의 증강 복제본을 만들지 정합니다.
repeat=3이면 원본 1개당 무작위로 변형된 에피소드 3개가 생성됩니다(1~20). - Lightness — 밝기 보정(-100 ~ +100).
- HSV — Hue / Saturation / Value 슬라이더. Random 체크 시 매 에피소드마다 무작위 값이 추첨됩니다.
- Disturbances — 화면에 무작위 사각형을 그려 가림 상황을 시뮬레이션합니다. Count(개수)와 색상(고정/Random color)을 설정합니다.
- Salt & Pepper — 점잡음 비율(0~1).
- Gaussian noise — Mean / Sigma 슬라이더.
- Perspective — Scale / Degrees / Shear / Perspective 슬라이더로 평면 왜곡을 줍니다.

Downsample 섹션
프레임을 솎아 시퀀스 길이를 줄입니다.
- Keep — 한 블록에서 살릴 프레임 수(기본
1). - Out of every — 블록 크기(기본
2).
예) keep=1, every=2 → 2 프레임마다 1 프레임 유지(절반). keep=1, every=3 → 1/3.
그리퍼 transition 자동 보존
데이터셋의 info.json에 tool_qpos_indices가 있으면 그리퍼 값이 크게 변하는 프레임은 sampling 위치와 상관없이 살아남고, 좌우 1프레임(tool_pad=1)도 함께 보존됩니다. open/close 전환이 빠지면 학습 시 라벨이 노이즈처럼 보일 수 있는데, 별도 옵션 없이 keep/every 비율만 정하면 알아서 처리됩니다.
Crop 섹션 (신규)
카메라(sensor) 별로 첫 프레임 위에 박스를 드래그해 잘라낼 영역을 지정합니다. 데이터셋의 카메라마다 박스가 독립적으로 그려지고, Reset 버튼으로 해당 카메라의 박스만 제거할 수 있습니다.
-
Crop 섹션을 펼치고 Enable 을 켭니다.
섹션을 처음 열면 첫 에피소드의 0번째 프레임이 카메라별로 로드됩니다. 로딩이 끝날 때까지 "Loading preview…" 가 잠시 표시될 수 있습니다.

-
카메라 영상 위에서 마우스로 박스를 그립니다.
드래그하는 동안 파란 점선 박스가 보이고, 손을 놓으면 채워진 박스로 고정됩니다. 같은 카메라에서 다시 드래그하면 박스가 새로 그려집니다.
-
Reset 버튼으로 박스를 지웁니다.
카메라 헤더 우측의 Reset 버튼을 누르면 해당 카메라의 박스만 제거됩니다. 다른 카메라의 박스는 영향을 받지 않습니다.
Rotate 섹션 (신규)
카메라별로 0° / 90° / 180° / 270° 중 하나를 선택합니다. 토글 버튼 그룹이라 한 번 누르면 적용 각도가 바뀝니다.

Apply — 한 번에 적용
-
출력 데이터셋 이름을 입력합니다.
기본값은
<원본이름>_transformed입니다. 다른 작업과의 구분이 필요하면 직접 수정합니다. -
켤 섹션의 Enable 토글을 켭니다.
최소 한 섹션은 켜져 있어야 Apply 버튼이 활성화됩니다.
-
Apply 버튼을 누릅니다.
토스트로 "Dataset transform started." 가 뜨고 패널 하단에 progress bar가 표시됩니다. 진행률은 Socket.io 이벤트(
transform_progress)로 0~1 사이로 갱신됩니다.
-
완료를 기다립니다.
transform_complete이벤트가 도착하면 데이터셋 목록에 새 데이터셋이 등장합니다. 입력한 이름이 새 데이터셋의 이름이 되고, 학습 / 에피소드 편집 등에서 다른 데이터셋과 동일하게 사용할 수 있습니다.
적용 순서
내부적으로는 다음 순서로 한 번의 패스 안에서 처리됩니다.
augment ×N (반복) → downsample → crop → rotate
repeat=3, augmentation=ON, downsample=ON, crop=ON, rotate=ON 으로 두면 원본 1개 에피소드 → 무작위 증강 3개 → 각각 다운샘플 → 각각 카메라별 crop → 각각 카메라별 rotate → 최종 3개의 새 에피소드.
백엔드 API
직접 호출이 필요한 고급 사용자는 다음 엔드포인트를 사용할 수 있습니다.
POST /dataset/<id>/transform
{
"name": "<출력 데이터셋 이름>",
"task_id": <워크스페이스 id>,
"operations": {
"repeat": 1,
"augmentation": { "lightness": 0, "hsv": {...}, "rectangles": {...},
"saltAndPepper": {...}, "gaussian": {...}, "prospective": {...} },
"downsample": { "keep": 1, "every": 2 },
"crop": { "regions": { "<sensor_name>": [x1, y1, x2, y2], ... } },
"rotate": { "angles": { "<sensor_name>": 0|90|180|270, ... } }
}
}
진행률은 transform_progress { progress: 0..1 }, 완료는 transform_complete { dataset_id } Socket.io 이벤트로 전달됩니다.