EdgeGround-VLA_바퀴형로봇_목표지향주행_경량모델_초안_0805.docx에서 보완이 요구된
지점을 전수 추출해, 항목마다 ① 문제 상황(초안 원문 그대로) →
② 대응책(근거와 논리) →
③ 실 답변(논문에 그대로 삽입할 문장) 3단으로 배치했습니다.
문제 제기는 손대지 않았고, 근거를 거쳐 최종 문장까지 한 줄로 이어지게 했습니다.
✅ 코드로 확인해 반영 —
8클래스→3자유도 변환은 ACTION_3D 고정 룩업테이블(별도 ROS 노드 아님, 추론 서버 내 즉시 조회) ·
LeRobot 내보내기는 "구축은 맞으나 420ep(레거시 포함)로 현재 학습셋 225ep와 불일치, 재내보내기 필요" ·
모델 다이어그램에서 서빙 제어 분리는 지난 턴에 이미 완료.
🔀 구조 변경(작성자 지시 발견) —
좌우 액션 불균형(21.8%) 분석을 3. Collection of data → Future Work(8절)로 이동.
docx의 노란색 하이라이트(우리 초고 붙여넣은 부분) 안에 "테스트 중 발견된 결과이므로 퓨쳐워크로 빼기"라는
지시가 있었음.
📚 문헌조사(웹서치) —
REFERENCES [1]Mobility VLA·[2]SmolVLA·[4]OWLv2·[5]Kosmos-2 arXiv ID 전부 정확함을 교차검증.
RoboVLMs 인용 누락 발견(본문은 인용하는데 참고문헌에 없음, arXiv:2412.14058 추가 필요).
"Mobility VLA 경량 버전 있는지" 질문 → 없음, Mobility VLA의 "가벼움"은 모델 축소가 아니라
클라우드 오프로드임을 확인 — 오히려 본 연구와의 차별점. 대안으로 TIC-VLA·AsyncShield 제시.
⏸ 보류(자료 필요) — 데이터 수집 과정 사진(조이스틱 등)은
실사진 없이는 만들 수 없어 보류. 하드웨어 CAN 다이어그램은 기존 hardware_architecture.svg 유지.
붙여넣기용 산문은 논문 드래프트 보완 초고에 절별로 정리돼 있습니다. 아래는 그 커버리지입니다.
| 절 | 상태 | 내용 |
|---|---|---|
| 1. Model Architecture | ✅ 완결 | 260차원 구성 · window 6 → 1560 · 학습 대상이 0.866M 헤드뿐임을 산문화 |
| 1.1 설계 경위 | ✅ 완결 | text attn 0.000% → E2E 주행 0% → decomposition 66.7% 시간순 논리 + 인코더 선택 근거 |
| 1.2 / 1.3 (사실오류) | ✅ 교체안 완결 | 256차원·4 hidden layer → 1560차원·hidden 2개 / 'projection 융합' → 병치(concat) |
| 1.4 Serving Control | ✅ 4개 문단 완결 | 임계값 0.20 · skip_n=3 · 재검출 규칙 3종 · 정지 판정 + 콜드스타트 가드 |
| 3. Collection of data | ✅ 완결 | 조이스틱 원격조작 · HDF5 · 225ep/16,599frame · 액션 21.8% 불균형 명시 |
| 5.2 학습 방법 | ✅ 3문단 + 표 | 2단계 절차 · 파라미터 표(분할·샘플링·학습대상 추가) · 체크포인트 메타데이터 |
| 6. Deploy | ⚠️ 절반 | 디코더 미로드(호스트 RAM 10.59→3.20GB)는 작성. 젯슨 환경·배치·자동시작·ROS 연결은 로봇 담당자 필요 |
| 7. Runtime | ✅ 완결 | 전처리/추론/후처리 경로 · 환경변수 주입 · has_bbox 보강 한 문단 |
초안에서 빨간색으로 표기된 보완 요구 원문입니다. 공백·줄바꿈·오탈자까지 문서 그대로이며 요약·수정하지 않았습니다.
| 검사 대상 | 빨간 항목 |
|---|---|
word/document.xml 의 w:color = EE0000 |
run 120개 · 단락 25개 (전체 단락 242개 중) |
word/footnotes.xml · word/endnotes.xml | 0개 |
themeColor / highlight / rStyle |
0개 (문서에 사용되지 않음) |
삽입 이미지 5개 (word/media/image1~5.png) |
빨간 지시문 없음 — 파이프라인 도표 · SerbotII 사진 · 궤적 그림 |
[01] p4 단락#39 (1. Model Architecture) -> 이 그림을 다시 그려야 될 것 같음. [02] p4 단락#40 (1. Model Architecture) 프레임 특징 벡터 — 260차원 [03] p4 단락#41 (1. Model Architecture) FRAME_DIM = 4 + 256 = 260 [04] p4 단락#42 (1. Model Architecture) ├ bbox 4채널 : cx, cy, area, has_bbox ← OWL-v2 출력 (area는 bbox_scale=3.0 배율 적용) [05] p4 단락#43 (1. Model Architecture) └ 비전 256채널: Kosmos-2 vision_model(1024) → image_proj → L2 normalize [06] p4 단락#45 (1. Model Architecture) 헤드 입력 : window=6 프레임을 flatten → (6 × 260) = 1560차원 [07] p4 단락#46 (1. Model Architecture) 헤드 출력 : 8클래스 로짓 [08] p5 단락#55 (1.1 Heterogeneous Grounding Encoder) 이 것이 이구조를 생각한 이유를 설명할 수 있나?) [09] p5 단락#63 (1.4. Serving Control) threshold 설정 내용 기재 [10] p5 단락#64 (1.4. Serving Control) skip_n=3 의미 [11] p5 단락#65 (1.4. Serving Control) force_reground_on_miss - 회전 후 강제 재그라운딩 [12] p5 단락#66 (1.4. Serving Control) stop_mode=learned + 콜드스타트 가드 3 [13] p6 단락#78 (3. Collection of data) 데이터 포맷 ( Manipulator 같은 경우 Droid, LeRobot 같은) 으로 어떻게 데이터를 모았는지 설명 [14] p8 단락#125 (5.2 학습 방법 설명) 데이터를 이용하여 어떻게 학습을 진행 했는지 기술 [15] p8 단락#126 (5.2 학습 방법 설명) 학습 파라미터 [16] p8 단락#127 (5.2 학습 방법 설명) window = 6 프레임 bbox_scale = 3.0 [17] p8 단락#128 (5.2 학습 방법 설명) num_classes = 8 optimizer = Adam, lr = 5e-4 [18] p8 단락#129 (5.2 학습 방법 설명) epochs = 300 scheduler = CosineAnnealingLR [19] p8 단락#130 (5.2 학습 방법 설명) class weight = 1/빈도 정규화 ← FORWARD 71~74% 편중 보정 [20] p8 단락#131 (5.2 학습 방법 설명) seeds = 0, 1, 2 (다중 시드로 분산 확인) [21] p8 단락#133 (5.2 학습 방법 설명) 모델을 학습하고 난 후에 ***.pth 파일이 결과로 나옴. [22] p9 단락#137 (6. Deploy the trained EdgeGround-VLA model on the robot) 학습된 EdgeGrouund-VLA 모델을 SerbotII에 탑재하는 방법 설명 [23] p9 단락#141 (7. Runtime 수행) 로봇 수행 시 카메라로 한 프레임 입력값 전처리 -> 입력값 AI 모델에 입력 -> AI 모델 수행-> 결과값으로 후처리 과정 설명 [24] p9 단락#142 (7. Runtime 수행) Serving control을 런타임시에 여기에서 threshold 값 설정 [25] p9 단락#144 (7. Runtime 수행) has_bbox 채널의 의미 — 검출 실패 시 cx=0.5, cy=0.6, area=0.06의 고정 fallback 값이 들어가고 has_bbox=0으로 표시됩니다. 즉 헤드는 "지금 타겟을 못 보고 있다"는 신호를 입력으로 받습니다. 그런데 학습 데이터에는 has_bbox=False 프레임이 0.00%(0/16,599)여서, 모델은 이 신호에 대응하는 법을 배운 적이 없습니다(CH64 64-15). 실기에서는 이를 학습이 아니라 서빙 제어 로직으로 우회했습니다(4절).
| # | 쪽 | 단락 | 절 | 보완 요구 원문 |
|---|---|---|---|---|
| 01 | p4 | #39 | 1. Model Architecture | -> 이 그림을 다시 그려야 될 것 같음. |
| 02 | p4 | #40 | 1. Model Architecture | 프레임 특징 벡터 — 260차원 |
| 03 | p4 | #41 | 1. Model Architecture | FRAME_DIM = 4 + 256 = 260 |
| 04 | p4 | #42 | 1. Model Architecture | ├ bbox 4채널 : cx, cy, area, has_bbox ← OWL-v2 출력 (area는 bbox_scale=3.0 배율 적용) |
| 05 | p4 | #43 | 1. Model Architecture | └ 비전 256채널: Kosmos-2 vision_model(1024) → image_proj → L2 normalize |
| 06 | p4 | #45 | 1. Model Architecture | 헤드 입력 : window=6 프레임을 flatten → (6 × 260) = 1560차원 |
| 07 | p4 | #46 | 1. Model Architecture | 헤드 출력 : 8클래스 로짓 |
| 08 | p5 | #55 | 1.1 Heterogeneous Grounding Encoder | 이 것이 이구조를 생각한 이유를 설명할 수 있나?) |
| 09 | p5 | #63 | 1.4. Serving Control | threshold 설정 내용 기재 |
| 10 | p5 | #64 | 1.4. Serving Control | skip_n=3 의미 |
| 11 | p5 | #65 | 1.4. Serving Control | force_reground_on_miss - 회전 후 강제 재그라운딩 |
| 12 | p5 | #66 | 1.4. Serving Control | stop_mode=learned + 콜드스타트 가드 3 |
| 13 | p6 | #78 | 3. Collection of data | 데이터 포맷 ( Manipulator 같은 경우 Droid, LeRobot 같은) 으로 어떻게 데이터를 모았는지 설명 |
| 14 | p8 | #125 | 5.2 학습 방법 설명 | 데이터를 이용하여 어떻게 학습을 진행 했는지 기술 |
| 15 | p8 | #126 | 5.2 학습 방법 설명 | 학습 파라미터 |
| 16 | p8 | #127 | 5.2 학습 방법 설명 | window = 6 프레임 bbox_scale = 3.0 |
| 17 | p8 | #128 | 5.2 학습 방법 설명 | num_classes = 8 optimizer = Adam, lr = 5e-4 |
| 18 | p8 | #129 | 5.2 학습 방법 설명 | epochs = 300 scheduler = CosineAnnealingLR |
| 19 | p8 | #130 | 5.2 학습 방법 설명 | class weight = 1/빈도 정규화 ← FORWARD 71~74% 편중 보정 |
| 20 | p8 | #131 | 5.2 학습 방법 설명 | seeds = 0, 1, 2 (다중 시드로 분산 확인) |
| 21 | p8 | #133 | 5.2 학습 방법 설명 | 모델을 학습하고 난 후에 ***.pth 파일이 결과로 나옴. |
| 22 | p9 | #137 | 6. Deploy the trained EdgeGround-VLA model on the robot | 학습된 EdgeGrouund-VLA 모델을 SerbotII에 탑재하는 방법 설명 |
| 23 | p9 | #141 | 7. Runtime 수행 | 로봇 수행 시 카메라로 한 프레임 입력값 전처리 -> 입력값 AI 모델에 입력 -> AI 모델 수행-> 결과값으로 후처리 과정 설명 |
| 24 | p9 | #142 | 7. Runtime 수행 | Serving control을 런타임시에 여기에서 threshold 값 설정 |
| 25 | p9 | #144 | 7. Runtime 수행 | has_bbox 채널의 의미 — 검출 실패 시 cx=0.5, cy=0.6, area=0.06의 고정 fallback 값이 들어가고 has_bbox=0으로 표시됩니다. 즉 헤드는 "지금 타겟을 못 보고 있다"는 신호를 입력으로 받습니다. 그런데 학습 데이터에는 has_bbox=False 프레임이 0.00%(0/16,599)여서, 모델은 이 신호에 대응하는 법을 배운 적이 없습니다(CH64 64-15). 실기에서는 이를 학습이 아니라 서빙 제어 로직으로 우회했습니다(4절). |
보완을 채우기 전에 이 두 곳을 고쳐야 합니다. 요구 원문(02~07)이 이미 정확한 값을 담고 있어서, 본문을 그대로 두면 같은 문서 안에서 서로 모순됩니다.
두 가지가 틀렸습니다 — 입력 차원과 layer 수. 요구 원문 06번이 "1560차원"을 명시하고 있어 같은 문서 안에서 값이 충돌합니다.
| 초안 | 실제 | |
|---|---|---|
| 입력 | 256차원 | 1560차원 (6프레임 × 260) |
| hidden layer | 4개 | 2개 (512 → 128 → 8) |
빠진 것: bbox 4채널이 서술에 없고, window=6이 반영되지
않았습니다. 시간 문맥을 쓴다는 점이 헤드 설명에서 사라진 셈입니다.
근거: MLPActionHead
in scripts/train_exp73_trackA_heads.py
기존 본문의 "융합된 256차원 특징"과 "4개의 hidden layer"가 모두 사실과 다릅니다.
| 기존 본문 | 실제 | |
|---|---|---|
| 입력 차원 | 256 | 1560 (6프레임 × 260) |
| hidden layer | 4개 | 2개 (512 → 128 → 8) |
행동 헤드는 1560차원 입력을 받는 2층 MLP로, 512와 128 크기의 은닉층을 거쳐 8개 클래스 로짓을 출력한다(각 은닉층 뒤에 ReLU와 드롭아웃 0.25/0.1을 둔다). 전체 파라미터는 0.866M이다. 행동 클래스는 정지(0), 직진(1), 횡이동(2, 3), 대각 직진(4, 5), 제자리 회전(6, 7)으로 구성된다.
연속 좌표 회귀나 diffusion/flow-matching 기반 action expert 대신 경량 분류기를 사용한 것은 두 가지 이유에서다. 첫째, 대상 로봇의 펌웨어가 속도 명령의 크기를 사용하지 않고 방향만 사용하는 상수 속도 구조이므로, 연속 출력의 표현력이 하드웨어 단계에서 소실된다. 둘째, 동일 조건에서 네 종류의 헤드를 비교한 결과 이산 분류가 연속 회귀 및
"두 인코더 특징을 같은 공간에 매핑해 융합"이 실제 구조와 다릅니다. OWL-v2 출력은 projection을 통과하지 않습니다.
projection 출력 256차원은 비전 경로만입니다. OWL-v2 출력은 스칼라 4개(cx, cy, area, has_bbox)로 직접 concat됩니다.
bbox 4ch (projection 미통과) + 비전 256ch (1024 → image_proj → L2norm) = 260ch → × bbox_scale 3.0 → window 6 flatten → 1560
기존 본문은 "두 인코더 특징이 동일한 차원의 임베딩 공간으로 매핑된 후 … 이 융합 표현이 행동 헤드의 입력으로 사용된다"고 서술하는데, 실제 구조와 다릅니다. OWL-v2 출력은 선형 사상을 통과하지 않습니다.
Kosmos-2 비전 타워가 산출한 1024차원 특징은 선형 사상(1024→256)과 L2 정규화를 거쳐 256차원 표현으로 축약된다. 정규화는 이 표현의 스케일을 고정해, 값의 범위가 전혀 다른 기하 정보와 함께 사용될 때 한쪽이 학습을 지배하지 않게 한다.
반면 OWL-v2가 산출한 기하 정보는 선형 사상을 거치지 않고 4개의 스칼라 값으로 그대로 결합된다. 따라서 본 구조의 결합 방식은 이종(heterogeneous) 특징을 공통 공간으로 사상하는 융합이 아니라, 서로 다른 성질의 두 표현을 병치하여 행동 헤드가 각각을 직접 참조하도록 하는 방식이다. 기하 정보를 축약하지 않고 원래 값으로 전달하는 것은, 조향 결정이 목표의
질문이 아니라 "여기에 이 내용을 넣어라"는 지시로 보입니다 — 값 자체가 이미 정확합니다. 문제는 본문 산문에 녹아 있지 않고 메모 형태로 떠 있다는 것, 그리고 같은 문서 1.2·1.3절 서술과 충돌한다는 것입니다(위 ⚠️ 블록).
값은 모두 정확합니다. 한 곳만 정정이 필요합니다.
bbox_scale=3.0은 area에만 적용되는 것이 아니라
bbox 4채널 전체(cx, cy, area, has_bbox)에 곱해집니다.
[v * bbox_scale for v in bboxes[idx]]
— scripts/exp73_held_aware_train.py추가로 넣을 것: 헤드 파라미터 0.866M이 학습되는 유일한 구성요소이고 OWL-v2 · Kosmos-2 · image_proj는 전부 frozen이라는 점. 이 한 문장이 "경량"의 실질적 근거입니다.
어디서 가져오는가 → 모델 구조 자료 1·2절에 산문 + 머메이드 다이어그램으로 이미 정리돼 있어 그대로 옮기면 됩니다.
[삽입] — 요구 원문의 메모를 산문으로 풀어 쓴 것입니다. 메모 자체는 지워도 됩니다.
제안 파이프라인의 한 프레임은 260차원 특징 벡터로 표현된다. 이 벡터는 서로 다른 두 인코더의 출력을 병치(concatenate)한 것으로, 앞의 4채널은 오픈 보캐블러리 검출기 OWL-v2가 산출한 기하 정보(
cx,cy,area,has_bbox)이고 뒤의 256채널은 Kosmos-2 비전 타워의 출력(1024차원)을 선형 사상(image_proj, 1024→256)한 뒤 L2 정규화한 시각 문맥 표현이다. 두 인코더의 출력은 동일한 임베딩 공간으로 사상되지 않으며, 저차원 기하 정보와 고차원 시각 문맥이 각자의 형태를 유지한 채로 결합된다. bbox 4채널에는 스케일 정합을 위해 배율 3.0을 곱한다.행동 헤드는 6개 시점(
window=6)의 프레임 특징을 이어붙인 1560차원 벡터를 입력받아 8개 행동 클래스의 로짓을 출력한다. 이때 6개 시점은 연속된 6프레임이 아니라 결정 간격 5프레임마다 하나씩 취한 것으로, 현재 시점 t에 대해 t−25, t−20, t−15, t−10, t−5, t의 여섯 지점을 참조한다. 즉 윈도우가 실제로 덮는 구간은 25프레임이다. 시간 문맥을 명시적으로 포함시킨 것은 그라운딩이 매 프레임 수행되지 않고 일정 주기로만 갱신되기 때문이며(1.4절), 간격을 두고 표집함으로써 인접 프레임의 중복 대신 실제로 변화가 누적된 구간을 보게 한다.전체 파이프라인에서 학습되는 구성요소는 행동 헤드(0.866M 파라미터)뿐이다. OWL-v2(0.155B), Kosmos-2 비전 타워(0.303B), 선형 사상(0.262M)은 모두 동결(frozen)되며 별도의 특화 파인튜닝을 수행하지 않는다. 즉 본 연구의 학습 비용은 전체 파라미터가 아니라 0.866M에 국한되고, 이것이 제안 구조가 온디바이스 환경에서 반복 실험을 감당할 수 있는 근거이다.
현재 초안 그림이 구버전 구조입니다 — 메인 페이지에 있던 것과 같은 계열로 PaliGemma2 SigLIP / 32-dim bbox history / ActionMLP를 그리고 있어 실제와 다릅니다.
현재 구조 도표는 이미 있습니다 — 모델 구조 자료의 머메이드 다이어그램이 지금 파이프라인(OWL-v2 0.155B → bbox 4ch / Kosmos-2 vision 0.303B → image_proj → 260-dim → window 6 → MLP 0.866M → 8클래스)을 정확히 반영합니다.
※ 참고로 초안에 이미 삽입된
image1.png는 현재 구조 도표입니다 — 교수님이 이미 넣어두신
것으로 보이므로, 어느 그림을 가리키는 지시인지 확인이 필요합니다.
요구 원문 02~07의 260차원 규격을 반영한 논문용 벡터 도표를 새로 그렸다. 파이프라인 그림 1개로 아래를 모두 표현한다: OWL-v2(0.155B, frozen) → bbox 4채널 · Kosmos-2 vision_model (0.303B, frozen) → image_proj(0.262M, frozen) → 비전 256채널 · 두 경로를 concat한 260차원 프레임 특징 · window=6 flatten → 1560차원 · MLP 행동 헤드(0.866M, 유일한 학습 대상) → 8클래스 로짓 · 서빙 제어 파라미터(threshold, skip_n, 회전 규칙) · 언어 디코더(1.361B)는 별도 열에 미사용으로 분리 표기.
PDF(논문 삽입용) · SVG(편집용) · PNG(2×)
즉 결과가 좋다는 서술은 있는데, 이 구조를 택하게 된 경위가 없습니다. 설계를 먼저 하고 결과를 얻은 것처럼 읽히면, 심사자 입장에서 "왜 이 조합인가"에 답이 없는 상태가 됩니다.
설명할 수 있고, 실측 이력 자체가 근거입니다. 시간 순서가 곧 논리입니다 — 설계가 아니라 측정에 밀려서 도달한 구조입니다.
| 단계 | 측정 | 그래서 |
|---|---|---|
| E2E VLA (Kosmos-2 + LoRA) |
text attention 0.000% (Exp17~41C, head-only에서도 재현) |
언어 경로가 이미 붕괴 — 우리 학습 탓이 아님 |
| E2E closed-loop | Exp11 PM 58.6%인데 주행 성공 0% (FPE 1.45m 누적) | offline 지표가 좋아도 주행이 안 됨 |
| Decomposition | Exp14 Step2 PM 75.9%, 주행 66.7% (FPE 0.55m) | TLD는 동일한데 방향 오차만 다름 → 명시적 좌표가 원인 |
핵심 문장: "언어 경로를 거치지 않고 공간 정보를 직접 꺼내 쓴다."
[삽입] — 기존 설명 문단 앞이나 뒤에 붙입니다.
본 구조는 설계를 먼저 확정한 뒤 검증한 것이 아니라, end-to-end VLA 구성에서 관측된 두 차례의 실패를 거쳐 도달한 것이다.
첫째, Kosmos-2에 LoRA를 적용한 end-to-end 구성에서 언어 경로의 어텐션 비중이 0.000%로 측정되었다. 이 값은 헤드만 학습시킨 조건에서도 동일하게 재현되었으므로, 학습 방식의 문제가 아니라 사용한 사전학습 모델의 상태에 기인한다. 즉 언어 입력이 행동에 기여하지 않는 상태였다.
둘째, 동일 구성에서 오프라인 지표와 실제 주행 성능이 어긋났다. 프레임 단위 행동 일치도가 58.6%였음에도 목표 도달 성공률은 0%였고, 최종 위치 오차가 1.45m까지 누적되었다. 궤적을 분석한 결과 이동 거리 자체는 목표와 유사했으나 방향 오차가 누적되는 양상이었다.
이에 목표의 위치를 모델 내부 표현에 맡기지 않고 명시적 좌표로 분리하는 구성을 시험하였다. 동일 데이터에서 프레임 일치도는 75.9%, 목표 도달 성공률은 66.7%로 개선되었고 최종 위치 오차는 0.55m로 감소하였다. 두 구성의 이동 거리 특성이 유사한 반면 방향 오차만 크게 달라졌다는 점에서, 개선의 원인은 좌표를 명시적으로 제공한 것에 있다고 판단하였다.
이 관찰이 본 구조의 근거다. 목표의 기하 정보는 오픈 보캐블러리 검출기가 제공하고, 장면의 시각 문맥은 시각-언어 모델의 비전 타워가 제공한다. 두 경로 모두 언어 디코더를 경유하지 않는다. 절 제목의 heterogeneous는 이처럼 성질이 다른 두 인코더를 각자의 강점에 맞게 분담시킨다는 의미다.
인코더 선택 근거 — 다수의 시각-언어 인코더 중 Kosmos-2를 택한 것은 선행연구 RoboVLMs의 인코더 비교에서 Kosmos-2가 가장 좋은 결과를 보였기 때문이며, 그 실측 결과를 승계한 것이다. 다만 본 구현에 RoboVLMs의 코드는 포함되지 않는다.
절에 제목만 있고 내용이 없습니다. 운영값이 무엇이며 왜 그 값인지가 비어 있어, 심사자가 "임의로 고른 값"으로 읽을 수 있습니다.
0.25이고 운영에서 0.20을
환경변수(VLA_OWLV2_THRESH)로 주입합니다. 7/23 세션 27건의
runtime_config에는 owlv2_thresh = 0.25로 기록돼 있습니다
(PG2-448 그라운더 시기). 0.20은 실기 담당자 보고와 CH64 64-17 기준이며,
100건 테스트 세션 원본 H5가 현재 로컬에 없어 직접
확인하지 못했습니다 → 논문 기재 전 재확인 필요.운영값 owlv2_thresh = 0.20. 값보다 결정 경위를
같이 써야 방어됩니다.
근거: OWL-v2 자료
· scripts/analyze_jetson_local_gap.py
검출기의 신뢰도 임계값은 코드 기본값이 0.25이고, 실기 운영에서는 환경변수로 0.20을 주입한다. 0.25는 사전 임계값 스윕에서 결정한 값이고 0.20은 실기 조건에 맞춰 완화한 값이다. 임계값 스윕 결과 0.25에서 정탐률 95.3%를 유지하며 목표 물체가 존재하지 않는 프레임에 대한 오탐률이 0%였고, 0.1에서는 오탐률이 74.7%로 증가해 물체 부재를 판정할 수 없었다.
실기에서는 동일 임계값에서 검출 실패가 더 빈번하여 0.20으로 낮추었다. 다만 실기에서 검출에 실패한 프레임을 동일 모델·동일 임계값으로 재실행한 결과 197개 중 155개(78.7%)가 다시 실패하였고 전체 판정 일치율은 86.6%였다. 따라서 실기와 오프라인의 검출률 차이는 연산 환경보다는 장면 자체의 난이도에 주로 기인한다.
임계값을 낮추는 조작은 검출률을 확보하는 대가로 물체 부재 판정 능력을 희생하는 성질을 가진다. 이 절충은 후술하는
has_bbox채널의 한계(7절)와 동일한 문제의 다른 측면이다.
skip_n=3의 의미파라미터 이름만 있고 무엇을 하는지, 왜 필요한지, 무엇을 잃는지가 없습니다. 이 값은 제어 주기를 결정하는 핵심 설정입니다.
grounding_skip_n=3 — 매 프레임 그라운딩하지 않고 3프레임마다 한 번
수행하고, 사이 프레임은 마지막 bbox를 유지합니다(zero-order hold).
실효 그라운딩 주기 약 1.3Hz.
왜 필요한가 — OWL-v2 검출이 젯슨에서 1901.7ms, 전체 지연의 약 97%입니다. 매 프레임 호출하면 제어 주기가 성립하지 않습니다.
무엇을 잃는가 — bbox가 최대 2프레임 낡습니다. 회전 중에는 이 지연이 조향 오차로 직결되므로 원문 11의 재그라운딩 규칙이 함께 있어야 성립합니다. 두 항목을 따로 쓰면 안 되고 한 묶음으로 서술해야 합니다.
검출기는 매 프레임 수행되지 않고 3프레임마다 한 번 수행되며, 그 사이 프레임은 직전 검출 결과를 유지한다(zero-order hold). 이에 따라 실효 그라운딩 주기는 약 1.3Hz이다.
이 설계가 필요한 이유는 검출 단계가 전체 지연을 지배하기 때문이다. 대상 하드웨어에서 검출 1회에 1901.7ms가 소요되어 전체 추론 지연의 약 97%를 차지하며, 매 프레임 호출 시 제어 주기를 확보할 수 없다.
대가로 기하 정보는 최대 2프레임만큼 낡은 값이 된다. 로봇이 회전하는 동안에는 이 지연이 조향 오차로 직결되므로, 다음 항의 재검출 규칙과 함께 사용해야 의미가 있다.
force_reground_on_miss이름과 한 줄 설명만 있습니다. 실제로는 회전 관련 보호 규칙 3개가 함께 걸린 묶음이라, 하나만 쓰면 동작을 재현할 수 없습니다.
미검출 시 skip 주기를 무시하고 즉시 재그라운딩합니다. 함께 걸린 규칙:
just_rotated = self._last_pred_class in (6, 7) 이면 skip_n과
무관하게 재검출합니다VLAControlManager(move_duration=0.4)
(robovlm_nav/serve/vla_control_utils.py).
제어 루프는 행동을 COAST 4.0초 동안 10Hz로 반복 발행하는데
회전만 예외로 move_and_stop_ramped()로 약 0.4초 돌고
자동정지합니다(이동·횡이동은 반복 발행 유지).
0.4는 무관하게 회전 방향을 정하는
cx 임계값(cx < 0.4 → ROT_L)입니다 — 같은 숫자가 두 곳에 있어
혼동하기 쉽습니다.blocked_second_rotation = (pred in (6,7) and last_pred in (6,7)) 이면
회전을 실행하지 않고 정지 명령([0,0])으로 대체합니다.
"차단"보다 정지로 치환이 정확합니다force_reground_on_miss는 상시 규칙이 아닙니다 —
VLA_FORCE_REGROUND_ON_MISS 기본값이 "0"(off)이고 코드 주석에
"A/B 테스트용, 기본 off"로 명시돼 있습니다. 7/23 세션 27건의
runtime_config에도 이 키가 없습니다 →
"항상 적용된다"고 쓰면 안 됩니다.has_bbox=False가 0/16,599 = 0.00%라
모델은 "지금 못 보고 있다"에 대응하는 법을 배운 적이 없습니다(CH64 64-15).
회전 동작에 대해서는 세 가지 보호 규칙이 적용되며, 이들은 추론 계층과 제어 계층에 나뉘어 있다. 세 규칙 모두 같은 실패 양상, 즉 회전이 과도하게 지속되어 목표가 시야에서 벗어나는 현상을 막기 위한 것이다.
제어 계층에서는 선택된 행동을 일정 시간 유지하며 반복 발행한다(약 4초, 10Hz). 그러나 제자리 회전만은 예외로, 약 0.4초 동안만 수행하고 자동으로 정지한다. 이 예외가 없으면 그라운딩 갱신에 걸리는 약 2초 동안 같은 회전 명령이 계속 재발행되어, 의도한 짧은 보정이 아니라 연속 회전이 되고 목표가 화면 밖으로 밀려난다. 반면 전후·횡 이동은 반복 발행을 유지한다.
추론 계층에서는 두 규칙이 적용된다. 첫째, 제자리 회전을 수행한 직후의 스텝에서는 시야가 변했으므로 갱신 주기와 무관하게 반드시 재검출한다. 회전 이전의 좌표를 계속 참조하면 같은 회전을 주기만큼 반복하게 된다. 둘째, 직전 스텝이 회전이었고 이번에도 회전이 선택되면 그 회전을 실행하지 않고 정지 명령으로 대체한다.
검출 실패 시 갱신 주기를 무시하고 즉시 재검출하는 기능도 구현되어 있으나, 기본값은 비활성이며 대조 실험용 선택 항목이다.
이 규칙들이 필요한 근본적인 이유는 검출 실패 상황이 학습으로 처리되지 않았다는 데 있다. 학습 데이터 16,599 프레임 중 검출 실패 프레임의 비율은 0.00%(0개)이므로, 모델은 목표를 관측하지 못하는 상태에 대응하는 행동을 학습한 적이 없다. 따라서 본 연구는 이 공백을 학습이 아니라 서빙 단계의 제어 규칙으로 우회하였다. 이는 제안 시스템의 한계이며, 학습 데이터에 검출 실패 사례를 포함시키는 것이 후속 과제이다.
stop_mode=learned + 콜드스타트 가드 3설정 이름만 있습니다. 특히 "콜드스타트 가드 3"이 왜 필요한지가 없으면 임의의 매직넘버로 보입니다.
정지 판단을 기하 규칙이 아니라 학습된 STOP 클래스(class 0)로 합니다.
콜드스타트 가드 3 — 첫 3회 추론까지 STOP을 무시합니다. 윈도우가 6프레임인데 시작 시점에는 과거가 없어 같은 프레임으로 패딩되고, 그 상태에서 STOP이 나오면 출발하자마자 멈추는 실패가 납니다. 즉 매직넘버가 아니라 window=6 구조에서 파생된 값입니다.
정지 판정 방식은 두 가지가 구현되어 있다. 기본값은 기하 규칙에 의한 근접 판정으로, 목표의 화면 점유 면적이 0.25 이상이고 수평 위치가 중앙에서 0.35 이내인 상태가 3프레임 연속 관측되면 정지한다. 다른 하나는 학습된 정지 클래스(class 0)의 예측을 사용하는 방식이며, 실기 운영에서는 후자를 사용하였다. 후자의 경우 에피소드 시작 직후 3회의 추론에 대해서는 정지 예측을 무시한다. 행동 헤드가 6프레임의 시간 문맥을 입력받는 구조에서 시작 시점에는 과거 프레임이 존재하지 않아 현재 프레임으로 패딩되며, 이 상태에서 정지가 예측되면 출발 직후 정지하는 실패가 발생한다. 따라서 이 값은 임의로 정한 상수가 아니라 윈도우 크기에서 파생된 값이다.
한편 정지 클래스는 원본 데이터에 존재하지 않아 각 에피소드의 마지막 프레임에 부여한 합성 라벨이다. 따라서 학습된 정지 판정의 신뢰도는 데이터에서 자연히 관측된 정지 행동에 근거한 것이 아니라는 점을 명시한다.
절 전체가 비어 있습니다. 질문의 취지는 "Droid/LeRobot 같은 표준 포맷을 따랐는지"로 읽힙니다 — 여기에 솔직하게 아니라고 답해야 하는 상황입니다.
바로 쓸 수 있는 사실
| 항목 | 내용 |
|---|---|
| 수집 방식 | 조이스틱 사람 원격조작(teleoperation), 로봇 온보드 기록 |
| 포맷 | HDF5(.h5), 에피소드 1개 = 파일 1개.
h['images'](BGR 1280×720), 액션,
attrs['runtime_config']에 실행 설정 |
| 규모 | V6 225 에피소드 · 16,599 프레임 |
| 구성 | 로봇 위치 중앙 고정 출발 × 타겟 물체 5개 상대 위치 = 15조합 × 각 15ep
타겟 위치: 정면(Center) · 약좌 · 강좌 · 약우 · 강우 (실기 100건의 5개 지점과 동일) 경로: 직진 · 좌곡선 · 우곡선 |
| 트랙 A | 중앙 외 4개 시작 위치 × 3경로 = 180ep — 목표가 화면 중앙에서 벗어나 조향으로 정렬을 회복해야 함 |
| 트랙 F | 중앙 시작 × 3경로 = 45ep
— 목표가 처음부터 중앙. 곡선 지시를 받아도 직진으로 도달 가능하므로
"경로 지시를 따르는가 vs 보이면 직진하는가"를 가르는 대조군
코드 근거: --exclude-trackf가 path_type.startswith("center")를 제외하고
"트랙A only"로 출력 (train_exp73_trackA_heads.py).
배포 체크포인트 이름의 trackF는 트랙 F를 포함해
전체 225ep로 학습했다는 표기 |
| 좌우 대칭성 | 좌 시작 90ep / 우 시작 90ep 동수, 프레임도 6,910 / 6,870 (0.6% 차), 라벨 cx 평균 0.4976 → 수집 설계 수준에서는 대칭 |
| 그라운딩 라벨 | OWL-v2 자동 라벨. LIVE & detected는 5,752,
나머지 65.3%는 grounding_cached 상속값이라 독립 표본이 아님 |
lerobot_export/v6_mixed에 LeRobot v3.0 내보내기가 존재합니다(2026-07-16).
robot_type mobile_base, fps 6, AV1 비디오, features는
observation.images.cam_front / action / action.event_type 등.
| 내보낸 것 | 학습에 쓴 것 | |
|---|---|---|
| 에피소드 | 420 (v6 스키마 180 + v5 레거시 240) | 225 (trackA 180 + trackF 45) |
| 프레임 | 18,409 | 16,599 |
Navigate a left curve approach from the weak
right extreme starting position toward the gray basket. 형태입니다.
"left curve"/"right curve"가 정답 행동을 자연어로 직접 지시합니다
— CH68 68-1의 라벨 누출과 같은 구조입니다.
언어 조건화 실험 입력으로 쓰면 안 되고, 공개 시에도 명시해야 합니다.| 묶음 | 좌계열 | 우계열 | 격차 |
|---|---|---|---|
| 트랙 A (좌우 시작 180ep) | 2,820 | 3,551 | +25.9% |
| 트랙 F (중앙 시작 45ep) | 564 | 571 | +1.2% |
데이터는 조작자가 조이스틱으로 로봇을 직접 원격조작하는 방식으로 수집하였다. 각 에피소드는 정해진 시작 위치에서 출발해 목표 물체(회색 바구니)에 도달할 때까지의 영상과 조작 명령을 로봇 내부에 기록한 것이다.
저장 형식은 에피소드 단위 HDF5 파일이다. 한 파일에 1280×720 RGB 영상 시퀀스와 각 프레임에 대응하는 조작 명령이 들어가며, 파일 속성으로 해당 세션의 실행 설정(사용한 체크포인트, 검출 임계값 등)을 함께 기록한다. 이 실행 설정 기록은 사후 분석에서 어떤 모델이 어떤 조건으로 동작했는지를 확인하는 유일한 근거가 되었다(5.2절).
수집 규모는 225 에피소드, 16,599 프레임이다. 구성은 시작 위치 5종 × 경로 3종의 15개 조합에 각 15 에피소드를 균등 배치한 것이다. 시작 위치는 중앙, 약좌, 강좌, 약우, 강우이고 경로는 직진, 좌곡선, 우곡선이다. 실기 평가에서 사용한 5개 고정 목표 지점이 이 시작 위치 5종과 동일하다(IV절).
학습·분석에서는 이 225 에피소드를 두 묶음으로 구분한다. 트랙 A는 시작 위치가 중앙에서 벗어난 4종(약좌·강좌·약우·강우)의 12개 조합, 180 에피소드이다. 트랙 F는 시작 위치가 중앙인 3개 조합, 45 에피소드이다. 두 묶음을 구분하는 이유는 과제의 성격이 다르기 때문이다. 트랙 A는 목표가 화면 중앙에서 벗어난 상태에서 출발하므로 조향으로 정렬을 회복해야 하고, 트랙 F는 목표가 처음부터 중앙에 있어 곡선 경로를 지시받더라도 직진으로 도달할 수 있다. 즉 트랙 F는 모델이 경로 지시를 따르는지, 아니면 목표가 보이면 직진해 버리는지를 가르는 대조군 역할을 한다.
| 시작 위치 | 에피소드 | 프레임 | 프레임/ep | 묶음 |
|---|---|---|---|---|
| 강좌 | 45 | 3,611 | 80.2 | 트랙 A |
| 약좌 | 45 | 3,299 | 73.3 | 트랙 A |
| 중앙 | 45 | 2,819 | 62.6 | 트랙 F |
| 약우 | 45 | 3,268 | 72.6 | 트랙 A |
| 강우 | 45 | 3,602 | 80.0 | 트랙 A |
| 합계 | 225 | 16,599 | 73.8 | A 180 / F 45 |
좌측 시작과 우측 시작은 각각 90 에피소드로 동수이고, 프레임 수도 6,910 대 6,870으로 0.6% 차이에 불과하다. 그라운딩 라벨의 화면상 수평 위치 평균도 0.4976으로 중앙에 가깝다. 즉 수집 설계 수준에서는 좌우가 대칭이다.
그럼에도 행동 클래스 분포는 대칭이 아니었다. 전체에서 좌측 계열 행동은 3,384 프레임, 우측 계열은 4,122 프레임으로 21.8% 차이가 있다. 이 차이를 두 묶음으로 분해하면 원인이 좁혀진다.
| 묶음 | 좌측 계열 | 우측 계열 | 격차 |
|---|---|---|---|
| 트랙 A (좌우 시작 180ep) | 2,820 | 3,551 | +25.9% |
| 트랙 F (중앙 시작 45ep) | 564 | 571 | +1.2% |
불균형은 트랙 A에서만 발생하고 트랙 F에서는 사실상 없다. 또한 정렬 회복에 필요한 조향 자체는 좌우가 대칭이었다 — 강좌 시작 에피소드의 우측 계열 비율 19.2%와 강우 시작 에피소드의 좌측 계열 비율 19.9%는 0.7%p 차이이고, 약좌·약우 쌍도 1.6%p 차이다.
실제로 다른 것은 직진의 비중이다. 좌측 시작 에피소드는 직진이 49~51%인데 우측 시작 에피소드는 40~41%로 약 10%p 낮고, 그만큼 조향 행동이 더 많이 사용되었다. 이 초과분이 우측 계열 총량을 키웠다. 따라서 이 불균형은 어느 한 방향의 조향을 회피한 결과가 아니라, 시작 위치에 따라 조작자가 사용한 조향의 총량이 달랐던 결과로 해석된다.
이 구분이 중요한 이유는 대응 방법이 달라지기 때문이다. 에피소드 수나 프레임 수는 이미 대칭이므로 좌측 데이터를 더 모으는 것으로는 해결되지 않는다. 실제로는 클래스 가중치와 좌우 미러 증강으로 대응하였다(5.2절, V절). 이 불균형은 후술하는 좌우 성능 비대칭의 출발점이 된다.
그라운딩 라벨은 OWL-v2로 자동 생성하였다. 전체 프레임 중 검출을 실제로 수행하여 성공한 것은 5,752 프레임이며, 나머지는 그라운딩 주기(1.4절)에 따라 직전 결과를 상속한 값이다. 따라서 그라운딩 정확도를 평가할 때는 상속된 프레임을 제외해야 한다.
파라미터 값은 정확하지만 재현에 필요한 것이 빠져 있습니다 — 특히 분할 방식이 없습니다. 분할을 안 쓰면 정확도 수치의 의미가 확정되지 않습니다.
추가해야 하는 3가지
SPLIT_SEED=42.
프레임 단위가 아니라 에피소드 단위인 점이 핵심 —
같은 에피소드 프레임이 train/val에 섞이면 누출입니다stride=5로 결정 시점마다 1샘플,
라벨은 [t, t+5) GT의 다수결.
서빙의 zero-order hold(원문 10)와 학습을 일치시키는 설계입니다optimizer = Adam이지만 코드는
AdamW(weight_decay=1e-4)입니다.
train_one(Xtr, ytr, Xtr, ytr, …)로
학습 데이터를 val로 넣는 버그가 있어 94.5%가 나왔고,
진짜 held-out으로 고치니 74.5%였습니다.
[유지] 기존 요구 목록을 그대로 표로 옮기고, 아래 3항목을 추가합니다.
| 항목 | 값 |
|---|---|
| window | 6 프레임 |
| bbox_scale | 3.0 (bbox 4채널 전체) |
| num_classes | 8 |
| optimizer | AdamW, lr = 5e-4, weight_decay = 1e-4 |
| batch size | 128 |
| epochs | 300 |
| scheduler | CosineAnnealingLR |
| class weight | 1/빈도 정규화 (직진 편중 71~74% 보정) |
| seeds | 0, 1, 2 |
| 검증 분할 | 에피소드 단위 15%, 분할 시드 42 |
| 샘플링 | 결정 간격 5프레임, 라벨은 구간 내 다수결 |
| 학습 대상 | 행동 헤드 0.866M만, 그 외 전부 동결 |
| 모델 선택 | 25 epoch 간격 검증 평가 중 최고 정확도 시점 (300 epoch 중 13개 후보) |
검증 분할은 프레임 단위가 아니라 에피소드 단위로 수행하였다. 같은 에피소드의 인접 프레임은 서로 매우 유사하므로 프레임 단위로 분할하면 사실상 동일한 관측이 학습과 검증에 함께 포함되어 성능이 과대평가된다.
분할 시드 42는 특별한 의미를 갖는 값이 아니라 재현을 위해 고정한 임의의 정수이다. 중요한 것은 값 자체가 아니라, 모든 실험 arm(원본 데이터·미러 증강·hold-aware 등)이 동일한 시드로 생성된 동일한 검증 집합을 공유한다는 점이다. 그래야 arm 간 정확도 비교가 검증 집합 차이가 아니라 방법 차이에서 비롯됨을 보장할 수 있다.
용어 표기 (선택) — "held-out validation" 대신 "episode-disjoint split", "held-out set" 대신 "independent validation set"으로 쓸 수 있다. 33개 에피소드가 학습 시 한 번도 관측되지 않는다는 점을 강조하려면 "unseen episodes"라는 표현도 쓸 수 있다. 다만 "held-out"도 ML/로보틱스 학회에서 표준적으로 쓰이는 용어이므로, 이는 대체가 필수라기보다 선호에 따른 선택이다. (
docs/notes/training_methodology_unseen_guide.md) 실측: 33 에피소드 · 2,431 프레임 · train/val 에피소드 중복 0건(재계산으로 확인).
운영 시 로봇은 매 프레임 판단하지 않는다. 그라운딩이 3프레임마다 한 번만 갱신되고(1.4절) 선택된 행동은 다음 판단까지 유지된다. 학습을 프레임 단위로 하면 이 구조와 어긋나므로, 판단 단위를 학습 단위로 맞추는 샘플링을 사용하였다. 세 가지가 함께 바뀐다.
① 표집 간격 — 학습 샘플은 5프레임 간격의 결정 시점 t에서만 하나씩 구성한다. 결과적으로 16,599 프레임이 3,401개 샘플로 줄어든다(4.88배). 인접 프레임은 거의 동일한 관측이므로, 프레임 단위 학습은 표본 수를 늘리는 대신 같은 장면을 반복 학습하게 되고 특히 정지에 가까운 긴 직진 구간이 과대 대표된다.
② 윈도우 구성 — 6개 시점도 같은 간격으로 취한다. 현재 t에 대해 t−25, t−20, t−15, t−10, t−5, t를 참조하므로 윈도우가 덮는 구간은 25프레임이다. 연속 6프레임을 쓰면 6프레임 사이의 변화량이 작아 시간 정보가 사실상 중복되는데, 간격을 두면 같은 6개 입력으로 더 긴 구간의 변화를 표현할 수 있다. 에피소드 시작 부근에서 음수 인덱스는 0으로 클램프되어 첫 프레임이 반복 입력되며, 이 구간에서의 오작동을 막기 위해 운영 시 초기 3회의 정지 예측을 무시한다(1.4절).
③ 라벨 정의 — 결정 시점 t의 라벨은 그 순간의 행동이 아니라 구간 [t, t+5)에서 조작자가 취한 행동의 다수결이다. 이는 "지금 무엇을 하고 있는가"가 아니라 "다음 판단까지 무엇을 유지할 것인가"를 학습 목표로 삼는다는 뜻이며, 행동이 일정 시간 유지되는 운영 구조와 정합한다.
다수결이 실제로 라벨을 얼마나 바꾸는가 — 데이터에서 직접 세었다.
| 항목 | 값 | 해석 |
|---|---|---|
| 다수결 ≠ 순간 라벨 | 10.56% (359/3,401) | 결정 시점 10개 중 1개는 순간 행동과 다른 라벨을 받는다 |
| 동표 발생 | 0.71% (24/3,401) | 구현은 동표 시 최소 클래스 인덱스를 택하는데, 빈도가 낮아 영향은 무시할 수준 |
| 동표 시 선택 | FWD 13 · LEFT 5 · RIGHT 4 · FWD+L 2 | 인덱스 0인 STOP이 선택된 경우는 0건 — 정지 쪽 편향 우려는 관측되지 않았다 |
클래스 분포 변화도 작다. 정지가 8.75%→10.35%(+1.60%p)로 늘고 직진이 46.03%→44.90%(−1.13%p)로 줄어 편중이 미세하게 완화되지만, 좌우 불균형은 그대로다: 좌계열 20.39%→20.14%, 우계열 24.83%→24.61%로 격차가 4.45%p→4.47%p로 유지된다. 즉 이 샘플링은 시간 구조를 정렬하는 장치이지 클래스 불균형 보정 장치가 아니다 (불균형 보정은 클래스 가중치가 담당한다).
⚠️ 서술 시 주의 — 학습 윈도우는 5프레임 간격으로 표집되는데, 운영 시 추론 서버는 히스토리 버퍼의 연속된 6개 항목을 사용한다. 두 구성이 시간 폭에서 일치하는지는 아직 확인하지 않았다. 운영 시 한 항목이 한 번의 추론 호출에 대응하고 그라운딩 지연이 크므로 실제 시간 폭은 학습 쪽과 유사할 가능성이 있으나, 프레임 타임스탬프로 검증한 바 없으므로 논문에 "학습과 운영의 시간 폭이 일치한다"고 쓸 수 없다. 검증 항목으로 남긴다.
hold-aware 샘플링을 도입한 실제 계기는 HELD(운영과 동일하게 결정 시점만 판단하고 그 사이는 직전 값을 유지한 상태에서의 프레임 판단 정확도, closed-loop 시뮬레이션 상의 오프라인 지표)였다. 3 seed로 측정한 결과는 다음과 같다.

| 학습 방식 | HELD Success (3 seed) |
|---|---|
| baseline (연속 프레임으로 학습 → HELD 평가) | 7.1±3.8% |
| stride=5 입력만 적용 | 24.2±2.5% |
| hold-aware (다수결 라벨) | 28.3±3.8% |
⚠️ 이 개선을 실기 성공률과 인과관계로 서술하지 않는다. HELD는 프레임 단위 판단 정확도의 오프라인 프록시이고, 89%는 에피소드 단위 실기 도달 성공률이다. 척도가 다른 두 지표를 맞춰 해석했다가 결론을 철회한 전례가 있다(CH64 64-11). 또한 HELD 28.3% 자체도 baseline의 순수 offline 수치(39~48%대)에는 크게 못 미치므로, hold-aware는 "재수집 없이 얻을 수 있는 저비용 완화책"이라고만 서술한다 — 근본 해결책이 아니다. 그라운더를 OWL-v2로 바꿔도 HELD 25.3±3.8%로 재현되어, 이 개선이 특정 그라운더에 종속된 결과가 아님은 확인되었다.
파라미터 목록(원문 15~20)은 있지만 학습 절차 자체가 없습니다. 특히 이 프로젝트의 학습은 2단계인데 그 구조가 드러나지 않습니다.
2단계로 쓰는 것이 정확합니다.
Stage 1 (오프라인, 1회) — 피처 캐시 생성
H5 프레임 → OWL-v2 "gray basket" → bbox 4채널
→ Kosmos-2 vision_model → image_proj(1024→256) → L2 norm
→ 에피소드 단위 캐시(exp73_v6_vis_cache.pt)로 저장, 이후 재사용
Stage 2 (반복) — 액션 헤드만 학습
캐시 → hold-aware 윈도우(window 6, stride 5, 다수결 라벨)
→ 1560차원 flatten → MLPActionHead(512→128→8)
→ class-weighted CE, Adam 5e-4, 300ep, cosine, seed 0/1/2
학습은 두 단계로 구성된다.
첫 단계는 특징 추출이며 전체 데이터에 대해 한 번만 수행한다. 각 프레임에 대해 OWL-v2로 목표 물체를 검출하여 기하 4채널을 얻고, Kosmos-2 비전 타워와 선형 사상을 거쳐 시각 문맥 256채널을 얻어, 에피소드 단위 캐시로 저장한다. 이 단계의 구성요소는 모두 동결되어 있으므로 재계산이 필요하지 않다.
두 번째 단계는 행동 헤드 학습이며 캐시를 입력으로 반복 수행한다. 캐시에서 결정 시점마다 6프레임 윈도우를 구성해 1560차원 입력을 만들고, 클래스 가중 교차엔트로피로 헤드를 학습한다.
이 분리가 제안 방법의 실용적 이점이다. 연산량이 큰 인코더를 한 번만 통과시키고 이후 반복 학습은 0.866M 파라미터에만 발생하므로, 제한된 자원에서 다수의 조건을 비교할 수 있다.
확장자가 실제와 다르고(.pth → .pt),
저장물이 state_dict뿐인 것처럼 읽힙니다. 실제로는 메타데이터를 함께 저장하며,
그 메타데이터가 이번 감사에서 결정적 역할을 했습니다.
실제 저장 형태:
{"model": state_dict, "head": "exp73_mlp", "window": 6, "bbox_scale": 3.0,
"arm": "v6_mirroraug", "grounder": "owlv2", "stride": 5,
"val_acc": 0.7505, "fixed_bias": 0.0088, "exp": "exp73"}
episode_log.csv의 체크포인트 열이 전부 NaN이라
어떤 모델이 돌았는지 알 수 없었고, H5의 attrs['runtime_config']만이
ground truth였습니다.
학습이 끝나면 체크포인트 파일(
.pt)이 생성된다. 이 파일에는 가중치뿐 아니라 재현에 필요한 설정이 함께 저장된다. 즉 헤드 종류, 윈도우 크기, bbox 배율, 결정 간격, 사용한 검출기, 데이터 구성, 검증 정확도가 하나의 파일에 기록된다.이 기록을 남기는 것이 실제로 필요했던 사례가 있다. 실기 세션의 별도 로그에는 사용 체크포인트 항목이 비어 있었고, 어떤 모델이 동작했는지는 각 세션 HDF5 파일의 실행 설정 속성으로만 확인할 수 있었다. 이 확인을 거치지 않은 초기 분석에서는 특정 구간의 성능 향상을 신규 모델의 효과로 해석하였으나, 실행 설정을 대조한 결과 해당 세션들이 신규 체크포인트 배포 이전에 수행된 것으로 확인되어 결론을 철회하였다. 실행 시점의 설정을 데이터와 같은 위치에 기록하는 것은 부수적인 편의가 아니라 결과 해석의 전제 조건이다.
절 전체가 비어 있고, 우리 쪽 자료만으로는 채워지지 않습니다. 서버 코드는 우리가 쓰지만 젯슨 환경 구성·배치·실행은 로봇 쪽(soda)에 있습니다. 이 항목은 25건 중 유일하게 외부 입력이 필수인 항목입니다.
우리가 아는 부분 (지금 쓸 수 있음) — 체크포인트 .pt(헤드) +
stage1_v2_projs.pt(image_proj)를 젯슨으로 전달 →
stage2_v2_inference_server.py가 로드 → HTTP API로 프레임 수신, 액션 반환.
이번에 Kosmos-2 언어 디코더(1.361B) 로드를 제거해 peak host RAM을 10.59GB → 3.20GB (−70%)로 줄였습니다.
[삽입] — 일부만 채웁니다. 나머지는 로봇 담당자 확인이 필요합니다.
학습된 행동 헤드 체크포인트와 선형 사상 가중치를 로봇에 전달하고, 로봇 내부에서 추론 서버를 실행한다. 서버는 카메라 프레임을 입력받아 행동 클래스를 반환하는 형태로 동작한다.
배포 시 언어 디코더는 로드하지 않는다. 제안 파이프라인에서 Kosmos-2의 언어 디코더는 한 번도 호출되지 않으므로, 해당 파라미터(1.361B)를 적재 대상에서 제외하였다. 이 조치로 호스트 메모리 최대 사용량이 10.59GB에서 3.20GB로 감소하였다. 다만 GPU 메모리 사용량은 0.607GB로 변화가 없다. 따라서 이 조치는 연산량 절감이 아니라 대상 하드웨어에서의 적재 가능성을 확보하는 성격의 최적화이다.
미확보 — 로봇 담당자에게 요청할 항목 - 젯슨 환경 구성 (JetPack / PyTorch 버전) - 모델 파일 배치 경로와 전달 절차 - 추론 서버 실행 및 자동 시작 방식 - ROS 노드와의 연결 구조 - 위 메모리 수치의 젯슨 실측값 (현재 값은 로컬 측정)
절 전체가 비어 있습니다. 학습 절(원문 14)과 별개로 런타임 1프레임 처리 경로를 써야 합니다 — 학습은 캐시 기반이고 런타임은 실시간이라 경로가 다릅니다.
[전처리] 1280×720 RGB 1프레임
→ OWL-v2 (1901.7ms, skip_n=3에 따라 3프레임마다) → bbox 4채널
→ Kosmos-2 vision_model → image_proj → L2 norm → 256채널
→ concat 260채널 × bbox_scale 3.0
→ 최근 6프레임 링버퍼에 push (부족하면 현재 프레임으로 패딩)
[추론] 1560차원 flatten → MLPActionHead → 8클래스 로짓 → argmax
[후처리] 콜드스타트 가드(3스텝) · 회전 직후 강제 재그라운딩(상시)
· 연속 회전 차단 → 정지 명령으로 대체 · STOP 판정
→ 로봇 속도 명령
운영 시 한 프레임의 처리 경로는 다음과 같다.
전처리 단계에서 1280×720 RGB 프레임을 입력받아, 그라운딩 주기에 해당하는 프레임에서만 OWL-v2를 수행해 기하 4채널을 갱신하고 그 외에는 직전 값을 유지한다. 동시에 Kosmos-2 비전 타워와 선형 사상을 통과시켜 시각 문맥 256채널을 얻는다. 두 결과를 이어붙여 260차원 프레임 특징을 만들고 배율을 적용한 뒤, 최근 6프레임을 유지하는 버퍼에 넣는다. 버퍼가 채워지지 않은 시작 시점에는 현재 프레임으로 패딩한다.
추론 단계에서 버퍼를 1560차원으로 펼쳐 행동 헤드에 입력하고, 8개 클래스 로짓의 최대값을 선택한다.
후처리 단계에서 1.4절의 제어 규칙을 적용한다. 시작 직후 정지 억제, 회전 직후 강제 재검출, 연속 회전 차단(정지로 대체)을 검사한 뒤 최종 행동을 로봇 속도 명령으로 변환한다.
변환된 명령은 제어 계층에서 약 4초 동안 10Hz로 반복 발행되며, 그 사이 새 추론 결과가 도착하면 갱신된다. 즉 추론 주기(약 1.3Hz)와 명령 발행 주기(10Hz)가 분리되어 있고, 이 구조 때문에 회전에 대해서만 시간 기반 단발 실행이 필요하다(1.4절).
속도 명령의 크기는 사용하지 않는다. 대상 로봇의 펌웨어가 방향만을 반영하는 상수 속도 구조이기 때문이며, 이 제약이 이산 행동 공간을 채택한 근거의 하나이다(1.3절).
런타임 순서도 — 위 서술을 3회 호출 단위로 표현하면 다음과 같다.
grounding_skip_n=3이므로 1회차만 OWL-v2와 Kosmos-2를 모두 호출하고, 2·3회차는 Kosmos-2(비전)만 호출하며 좌표는 1회차 값을 그대로 쓴다. 세 경로 모두 클래스 번호 → 3자유도 속도(x, y, z) → CAN 통신 → 바퀴 전달의 동일한 후반부를 거친다.
상단의 서빙 제어 파라미터 요약(검출 임계값·그라운딩 호출 간격·콜드스타트 가드·회전 규칙· 제어 계층의 명령 발행 방식)은 1절 모델 파이프라인 도표에서 분리해 이 도표로 옮긴 것이다 — 모델 구조와 런타임 동작은 별개 관심사이므로 도표도 분리한다.
회전(ROT_L/ROT_R)이 선택된 경우는 이 주기의 예외다 — 제어 계층에서 0.4초 후 자동정지하며, 동시에 다음 호출은 주기와 무관하게 강제로 1회차(전체 그라운딩)로 처리된다(1.4절).
"여기에서 설정"이라고만 되어 있어 실제 주입 경로와 기록 위치가 비어 있습니다. 재현성 측면에서 실행 시 어떤 값이 쓰였는지 확인하는 방법이 더 중요합니다.
환경변수 VLA_OWLV2_THRESH로 주입되며 기본값은 코드 상수입니다
(stage2_v2_inference_server.py).
실행 기록 — 실제로 어떤 값이 돌았는지는 각 세션 H5의
attrs['runtime_config']에 남습니다. 원문 21에서 말한 그 필드이고,
사후 검증의 유일한 ground truth입니다.
같은 방식으로 제어되는 것들:
VLA_MULTI_PROMPT(현재 off) ·
VLA_KOSMOS_VISION_ONLY(디코더 제거 스위치) · preview(현재 off).
검출 임계값을 포함한 서빙 제어 파라미터는 추론 서버 실행 시 환경변수로 주입되며, 지정하지 않으면 코드에 정의된 기본값을 사용한다. 동일한 방식으로 다중 프롬프트 사용 여부, 언어 디코더 적재 여부, 초기 정렬 동작 사용 여부를 제어한다.
실행 중 실제로 적용된 값은 해당 세션의 기록 파일 속성에 저장되므로, 사후에 어떤 설정으로 동작했는지를 데이터와 함께 확인할 수 있다(5.2절).
has_bbox 채널의 의미이 항목은 이미 작성돼 있고 내용도 정확합니다. 문제는 없고, 보강할 실측이 하나 생겼다는 것만 반영하면 됩니다.
그대로 유지 가능합니다. fallback 값(cx 0.5 / cy 0.6 / area 0.06), has_bbox=0 표시, 학습 데이터 0.00%(0/16,599), 서빙 우회 — 전부 실측과 일치합니다.
기존 요구 원문 문단이 이미 정확합니다. 아래 한 문단만 보태면 서술이 완결됩니다.
이 한계는 학습 데이터에만 있는 것이 아니다. 검출기 자체도 장면에 존재하지 않는 물체를 요청받았을 때 부재를 확정하지 못한다. 목표와 무관한 물체명을 질의한 대조 실험에서 200 프레임 중 5.0%에 대해 여전히 박스를 산출하였으며, 해당 신뢰도의 중앙값은 임계값 직상인 0.267이었다. 즉 "관측되지 않음"을 판정하는 능력의 부재는 학습 단계와 검출 단계 양쪽에 걸쳐 있고, 이것이 서빙 제어 규칙에 의존하게 된 구조적 이유이다.
has_bbox 및 bbox 처리 방식서빙 시 has_bbox=0 우회 로직은 써 있으나, 학습 때 실제 어떻게 들어갔는지가 기술되어 있지 않으면 심사자가 훈련 데이터 전처리의 일관성을 의심할 수 있습니다.
학습 1단계(Stage 1)에서는 전체 16,599개 프레임 100%(16,599/16,599)에 대해 검출 또는 전파 박스가 존재하여 has_bbox=1.0 상태의 유효 좌표\((c_x, c_y, \text{area})\)로 모델이 학습되었습니다.
has_bbox=0.0 샘플 부재(0.00%)라는 명백한 한계가 존재하기 때문에, 런타임 검출 실패 상황은 모델 학습 추론이 아닌 서빙제어 로직(강제 재그라운딩 + 연속 회전 차단 정지 치환)으로 완벽히 우회 조치했음을 증명합니다.학습(Stage 1) 시점에는 프레임 16,599개 전량에 대해 검출 또는 그라운딩 주기 상속으로 좌표가 채워진 상태였다. 즉 학습 데이터의
has_bbox는 전량 1.0이고, 좌표는 검출값 또는 직전 검출값의 상속값이다. 학습 데이터에has_bbox=0(검출 실패이자 상속도 없는 상태)인 프레임은 존재하지 않는다(0/16,599, 0.00%).이 사실이 뜻하는 바는 명확하다 — 모델은 목표를 전혀 관측하지 못하는 상태에 대응하는 행동을 학습한 적이 없다. 따라서 실기에서 검출이 완전히 실패하는 상황은 학습된 추론으로 처리되지 않으며, 대신 서빙 제어 로직(회전 직후 강제 재검출, 연속 회전 시 정지로 대체)으로 우회한다(1.4절). 이는 학습 데이터의 공백을 규칙 기반 안전장치로 메운 것이며, 후속 과제로 검출 실패 사례를 학습 데이터에 직접 포함시키는 것이 남아 있다.
로봇이 필요한지를 기준으로 나눴습니다.
| # | 항목 | 근거 / 상태 |
|---|---|---|
| 1 | 본문 사실오류 2건 정정 ✅ 교체안 작성 | 초고 문서의 1.2 · 1.3절 블록 — 붙여넣기만 하면 됨 |
| 2 | 22건 초고 작성 ✅ 완료 | docs/01.paper/redfill_draft_0805.md
— 절별 붙여넣기용 산문. 6절만 절반(젯슨 절차는 로봇 담당자 필요) |
| 3 | 파이프라인 그림 재작성 (벡터) ✅ 완료 | PDF · SVG · PNG — 260차원 규격 반영. 초안의 image1도 현재 구조 계열이므로 교체 대상인지 확인 필요 |
| 4 | Florence-2 언어부 검정 ✅ 완료 | 67-6 — 부재 판정 능력 0%. 없는 물체에도 200/200 검출(OWL-v2는 5.0%). 검출기 자리에는 쓸 수 없고 비전 타워만 떼어 쓰는 용도로 유효. CH59의 cx 0.559 상한은 재현되지 않음(0.9955) |
| 5 | 객체 전이 실험 (기존 chair 59ep 활용) | CH68 68-5 미해결 질문 ② |
| 6 | LeRobot 내보내기 재실행 (학습 집합 225ep 기준) | 상태 변경 — 변환은 이미 되어 있었으나 집합이 다름 (420ep, trackF 45 누락 · 레거시 240 포함). "할지 말지"가 아니라 집합을 맞춰 재내보내기가 과제 |
| # | 항목 | 왜 필요한가 |
|---|---|---|
| 7 | 미러증강 헤드 실기 100건 검정 | 68-9에서 배포 헤드가 어떤 cx에서도 좌측을 선호하지 않음을 확인했고, 미러증강 헤드는 cx 응답이 복구돼 있습니다. 실기 최저 구간이 좌측(80%)인 것과 방향이 맞습니다. 근거가 가장 두터운 다음 스텝 |
| 8 | 젯슨 배포 절차 문서화 | ⑥이 그것 없이는 채워지지 않습니다 |
| 9 | 디코더 제거 젯슨 실측 | ⑥의 −70% 수치가 로컬 측정뿐 |
| 10 | negative 프레임 300~500장 | has_bbox 학습 부재(원문 11 · 25)를 서빙 우회가 아니라 학습으로 풀려면 필요 |
| 11 | 기구 편향 검정 4항목 (주행 불필요) | CH66에서 미검증으로 남긴 항목 — 카메라 마운트 · 무게중심 · 휠 |
word/document.xml에서 w:color가 EE0000인 run만
골라내고, 같은 문서를 PDF로 변환해 각 텍스트가 나타나는 쪽을 매칭했습니다.
총 25건 · 페이지 4~9. 원본에 이미지·표가 포함돼 쪽 번호는 PDF 변환 기준입니다.
footnotes/endnotes/themeColor/highlight/
rStyle/삽입 이미지까지 확인해 25건이 전부임을 검증했습니다.