No-Hallucination Empirical Audit 최종 업데이트: 2026-08-05

EdgeGround-VLA 논문 25개 보완항목 실측 코드/실험 검증 리포트

초안 내 빨간 지시문 25건에 대한 [문제(빨간질문) | 대응책 | 실답변및작성 | 근거 코드·실험 | 작성시점 | 출처(파일:라인) | 실행위치] 7대 항목 정밀 대조 표

📌
검증 상태 및 원칙: 본 리포트는 MoNaVLA 리포지토리의 현행 실제 코드베이스, 훈련 스크립트, 서빙 서버 및 HDF5 실기 세션 메타데이터를 직접 대조하여 환각(Hallucination) 없이 작성되었습니다.
# 문제 (빨간질문) & 대응책 & 실답변(작성문장) 근거 코드 / 실험 작성/수정 시점 출처 (파일 경로 및 라인 수) 실행 위치 / 명령어
01
p4#39
🔴 -> 이 그림을 다시 그려야 될 것 같음.
대응책: 구버전 파이프라인(PaliGemma2/ActionMLP)을 현행 실측 파이프라인(OWL-v2 + Kosmos-2 + 260dim + window 6 + MLP 0.866M) 규격 도표로 새로 렌더링.
📄 "본 연구의 EdgeGround-VLA 파이프라인 구조는 [그림 1]과 같다. 입력 1프레임은 OWL-v2 Detector와 Kosmos-2 Vision Encoder로 동시 전달되며, 추출된 260차원 특징을 윈도우 6으로 링버퍼에 누적하여 1560차원으로 경량 MLP 헤드에 전달한다."
edgeground_vla_architecture 벡터 재렌더링 (PDF/SVG/PNG) 2026-08-05
python scripts/render_architecture_diagram.py --out docs/v5/figures/
02
p4#40
🔴 프레임 특징 벡터 — 260차원
대응책: 단일 프레임 특징(bbox 4채널 + 비전 256채널) 산문 기술.
📄 "단일 프레임 특징 벡터 f_t ∈ R^260 은 4차원 위치 기하 벡터와 256차원 시각 문맥 임베딩의 결합으로 구성된다."
MLPActionHead 입력 프레임 규격 정의 2026-08-01
📄 scripts/train_exp73_trackA_heads.py (L48-L65)
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L985-L1000)
python scripts/train_exp73_trackA_heads.py --window 6 --bbox-scale 3.0
03
p4#41
🔴 FRAME_DIM = 4 + 256 = 260
대응책: 차원 결합 수식을 산문으로 기재.
📄 "FRAME_DIM = D_bbox + D_vision = 4 + 256 = 260 수식을 따르며, 저차원 위치 정보와 high-level 시각 문맥을 직접 Concatenate한다."
FRAME_DIM 상수 선언 및 Tensor Concat 코드 2026-08-01
📄 scripts/train_exp73_trackA_heads.py (L42)
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L987)
pytest tests/test_inference_pipeline.py
04
p4#42
🔴 ├ bbox 4채널 : cx, cy, area, has_bbox ← OWL-v2 출력 (area는 bbox_scale=3.0 배율 적용)
대응책: [오류정정] area만이 아니라 cx, cy, area, has_bbox 4채널 전체에 bbox_scale=3.0이 곱해짐을 명시.
📄 "위치 벡터는 OWL-v2의 바운딩 박스 출력 (cx, cy, area, has_bbox) 4개 채널에 배율 스케일링(bbox_scale=3.0)을 전체 적용하여 계산된다."
bbox_scale 4채널 전체 곱 처리 코드 2026-08-01
📄 scripts/exp73_held_aware_train.py (L98-L102)
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L988, L1004)
python scripts/exp73_held_aware_train.py --bbox-scale 3.0
05
p4#43
🔴 └ 비전 256채널: Kosmos-2 vision_model(1024) → image_proj → L2 normalize
대응책: Kosmos-2 비전 타워 특징 L2 Normalization 과정 기술.
📄 "시각 특징 벡터는 Kosmos-2의 Frozen vision_model(1024차원)에서 추출된 후, 단층 Linear Projection(1024→256)과 L2 Normalization을 거쳐 단위 벡터로 정규화된다."
image_proj + F.normalize(p, p=2, dim=-1) 2026-08-01
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L545-L560)
📄 scripts/exp73_extract_features.py (L112-L125)
python scripts/exp73_extract_features.py --model kosmos2
06
p4#45
🔴 헤드 입력 : window=6 프레임을 flatten → (6 × 260) = 1560차원
대응책: 6프레임 시간 윈도우 Flatten 매핑 산문 표기.
📄 "MLP 행동 헤드의 입력은 최근 6개 프레임의 특징 벡터를 시간 순서대로 Flatten한 1,560차원 벡터 X_t ∈ R^(6×260) = R^1560 을 사용한다."
window=6 슬라이딩 윈도우 Flatten 루틴 2026-08-01
📄 scripts/train_exp73_trackA_heads.py (L50, L108)
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L1175)
python scripts/train_exp73_trackA_heads.py --window 6
07
p4#46
🔴 헤드 출력 : 8클래스 로짓
대응책: 8클래스 이산 로짓 출력 및 865,928 파라미터 구조 명시.
📄 "행동 헤드는 2개의 Hidden Layer(512→128)를 거쳐 8개 이산 행동 클래스에 대한 로짓을 출력하며, 전체 학습 파라미터는 865,928개로 제한된다."
MLPActionHead (865,928 params) 체크포인트 실측 2026-08-01
📄 scripts/train_exp73_trackA_heads.py (L58-L64)
📄 checkpoints/exp73_trackA_best.pt (meta: head=exp73_mlp)
python -c "import torch; m=torch.load('checkpoints/exp73_trackA_best.pt'); print(sum(p.numel() for p in m['model'].values()))"
08
p5#55
🔴 이 것이 이구조를 생각한 이유를 설명할 수 있나?)
대응책: 1) E2E VLA의 어텐션 붕괴(Text Attention 0.000%) 및 주행 실패 극복, 2) 실기 100회 테스트 89% 성공(89/100, 5개 위치별 100/95/90/80/80%) 입증, 3) 0.866M 경량 MLP 헤드의 3대 장점(Frozen 백본 기반 모듈식 고속 2단계 학습, 엣지 서빙 sub-ms 연산 속도, 1.3Hz zero-order hold 지연 환경에서 이산 8클래스 래칭 안정성) 서술.
📄 "End-to-End VLA 방식은 fine-tuning 과정에서 언어-시각 어텐션 붕괴(Text Attention 0.000%)가 발생하여 오프라인 지표가 높아도 실시간 주행 성공률이 0%에 그쳤다. 이를 극복하기 위해 OVD 명시적 기하 좌표(4ch)와 VLM 비전 문맥(256ch)을 Concatenate하는 Heterogeneous Decomposition 구조를 도입하였다. 무거운 백본을 Frozen시킨 채 단 0.866M 파라미터의 경량 MLP 헤드만을 2단계로 학습시키는 본 모듈식 설계는 무거운 백본 재학습 없이도 225ep 데이터 효율성과 sub-ms 추론 속도를 확보하였으며, 실제 실기 100회 평가(5개 목표 위치 × 20회)에서 89%의 실주행 성공률(89/100, FPE 0.55m)을 달성하여 그 구조적 당위성을 증명하였다."
Exp17~41C 어텐션 붕괴 실험 및 실기 100회 평가 실측(89/100, 89%) 2026-06-25
📄 docs/index.html (L205, L288)
📄 docs/v5/exp54_v1_vs_v2_comparison.md
📄 docs/v5/research_story.html#ch68
python scripts/analyze_attention_collapse.py --exp exp17_41c
09
p5#63
🔴 threshold 설정 내용 기재
대응책: ROC 최적 0.25에서 젯슨 온보드 환경 완화를 위해 운영 0.20으로 결정한 경위 기재.
📄 "OWL-v2 검출 임계값은 ROC 실측 최적치인 0.25(오탐율 0%, 정탐율 95.3%)를 기준으로 설정하였으며, 엣지 하드웨어(Jetson Orin)의 실시간 정밀도 보정을 위해 운영 시 0.20으로 완화 적용하였다."
ROC Curve 분석(Exp60) 및 Jetson Gap 분석 스크립트 2026-07-04
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L706)
📄 scripts/analyze_jetson_local_gap.py (L45-L88)
📄 docs/v5/exp60_report.md
VLA_OWLV2_THRESH=0.20 python robovlm_nav/serve/stage2_v2_inference_server.py
10
p5#64
🔴 skip_n=3 의미
대응책: Jetson 지연(1901.7ms) 상쇄를 위한 zero-order hold 및 1.3Hz 실효 제어 주기 서술.
📄 "grounding_skip_n=3 설정을 적용하여 무거운 OWL-v2 검출 연산(Jetson 기준 프레임당 1,901.7ms 소모)을 3프레임마다 1회만 수행하고, 중간 프레임은 이전 바운딩 박스를 유효하게 유지(Zero-order hold)함으로써 1.3Hz의 실효 제어 주기를 확보한다."
`VLA_GROUNDING_SKIP_N` 지연 상쇄 실측 (CH49) 2026-07-23
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L765, L1111-L1115)
VLA_GROUNDING_SKIP_N=3 python robovlm_nav/serve/stage2_v2_inference_server.py
11
p5#65
🔴 force_reground_on_miss - 회전 후 강제 재그라운딩
대응책: 회전 직후 재그라운딩, 회전 0.4초 제약(`vla_control_utils.py`), 연속 회전 정지 치환을 한 묶음으로 통합 서술.
📄 "회전 조향 시 타겟 객체가 카메라 시야를 벗어나는 문제를 방지하기 위해 1) 회전 완료 직후 skip_n을 무시하고 즉시 재그라운딩을 실행하며, 2) 제어 계층에서 회전 동작 지속시간을 0.4초로 엄격히 제한(move_and_stop_ramped)하고, 3) 2회 연속 회전 명령 발생 시 정지 명령([0,0])으로 대체하는 안전 제어 기법을 적용한다."
회전 제어 안전 가드 3종 구현 코드 2026-07-30
📄 robovlm_nav/serve/vla_control_utils.py (L18, L21, L103)
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L1115-L1130)
python robovlm_nav/serve/stage2_v2_inference_server.py
12
p5#66
🔴 stop_mode=learned + 콜드스타트 가드 3
대응책: 학습된 STOP 클래스 활용 및 패딩 초기 조기정지 방지를 위한 Cold-start Guard 3 원리 기재.
📄 "정지 판정은 기하 규칙 대신 학습된 STOP 클래스(Class 0)를 사용하며, 주행 초반 과거 프레임 패딩으로 인한 오정지를 방지하기 위해 초기 3회 추론까지 STOP 판정을 무시하는 Cold-start Guard(가드 3)를 적용한다."
stop_mode=learned 및 initial infer guard 코드 2026-08-01
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L1200-L1212)
VLA_STOP_MODE=learned python robovlm_nav/serve/stage2_v2_inference_server.py
13
p6#78
🔴 데이터 포맷 ( Manipulator 같은 경우 Droid, LeRobot 같은) 으로 어떻게 데이터를 모았는지 설명
대응책: 로봇 중앙 출발 고정 및 타겟 물체 5개 상대 위치(정면, 약좌, 강좌, 약우, 강우 각 45ep, 총 225ep/16,599프레임) 배치 구조 명시. 우측 타겟 조향 편향(+21.8%, 4,122 vs 3,384) 보정 방안 및 LeRobot v3.0 export 파이프라인 구축 기재.
📄 "로봇은 항상 중앙 위치에서 출발하며, 타겟 물체(Basket)의 상대 위치를 5개 지점(정면, 약좌, 강좌, 약우, 강우)에 균등하게 배치(각 45ep, 총 225ep / 16,599프레임)하여 HDF5 파일 규격으로 데이터를 수집하였다. 수집 설계상 좌/우 타겟 에피소드(각 90ep) 및 프레임 수(6,910 vs 6,870)는 대칭이었으나, 사람이 조작할 때 우측 타겟을 향한 조향 반응(4,122 프레임)이 좌측 타겟 조향 반응(3,384 프레임)보다 +21.8% 더 길게 입력되는 편향이 존재하였다. 이를 보정하기 위해 손실 가중치(Class Weight) 및 미러 증강(Mirror Augmentation)을 적용하였으며, 외부 재현성을 위해 LeRobot v3.0 포맷 내보내기 파이프라인을 구축하였다."
V6 225ep 데이터셋 및 LeRobot v3.0 export 디렉터리 2026-07-16
📄 lerobot_export/v6_mixed/meta/info.json
📄 scripts/convert_h5_to_lerobot.py
python scripts/convert_h5_to_lerobot.py --in-dir data/v6/ --out-dir lerobot_export/v6_mixed/
14
p8#125
🔴 데이터를 이용하여 어떻게 학습을 진행 했는지 기술
대응책: Stage 1(피처 1회 사전 추출 캐싱) → Stage 2(MLP 헤드 고속 학습) 2단계 학습 파이프라인 기술.
📄 "학습은 2단계 파이프라인으로 진행된다. Stage 1에서는 무거운 백본 인코더의 출력 특징을 1회 사전 추출하여 에피소드 캐시(.pt)로 저장하고, Stage 2에서는 사전 추출된 특징을 바탕으로 0.866M 파라미터의 MLP 행동 헤드만을 고속으로 반복 학습한다."
Stage 1 캐싱 스크립트 및 Stage 2 학습 루프 2026-08-01
📄 scripts/exp73_extract_features.py (Stage 1)
📄 scripts/train_exp73_trackA_heads.py (L70-L150, Stage 2)
python scripts/train_exp73_trackA_heads.py --data-dir data/exp73_v6_vis_cache.pt
15
p8#126
🔴 학습 파라미터
대응책: Episode-level 15% Val Split (`SPLIT_SEED=42`) 및 hold-aware 5-stride 다수결 라벨링 명시.
📄 "에피소드 단위 15% 검증 집합 분할(SPLIT_SEED=42) 환경에서, 5-stride 이동 윈도우 내 다수결 라벨링을 적용하여 hold-aware 데이터셋을 구성하였다."
Held-out Split 및 Hold-aware 라벨 변환 알고리즘 2026-08-01
📄 scripts/exp73_held_aware_train.py (L80-L118)
python scripts/exp73_held_aware_train.py --split-seed 42
16
p8#127
🔴 window = 6 프레임 bbox_scale = 3.0
대응책: W=6 및 bbox 4채널 전체 3.0 스케일 배율 규격 명시.
📄 "시간 문맥 윈도우 크기는 W=6으로 설정하며, 기하 박스 4채널 벡터에는 3.0의 스케일 배율을 적용하여 시각 임베딩과의 수치적 가중 밸런스를 맞췄다."
Window/Scale 파라미터 주입 부분 2026-08-01
📄 scripts/train_exp73_trackA_heads.py (L35-L40, L98-L102)
python scripts/train_exp73_trackA_heads.py --window 6 --bbox-scale 3.0
17
p8#128
🔴 num_classes = 8 optimizer = Adam, lr = 5e-4
대응책: [오류정정] 요구 원문은 Adam이나 실제 코드는 AdamW(weight_decay=1e-4)임을 명시하여 본문 정정.
📄 "행동 공간은 8개 이산 클래스로 구성되며, Optimizer는 AdamW(Learning Rate = 5e-4, Weight Decay = 1e-4)를 사용한다."
AdamW 선언 코드 실측 2026-08-01
📄 scripts/train_exp73_trackA_heads.py (L140)
grep -n "AdamW" scripts/train_exp73_trackA_heads.py
18
p8#129
🔴 epochs = 300 scheduler = CosineAnnealingLR
대응책: 300 Epoch, CosineAnnealingLR, 25 Epoch 간격 평가 중 최고 성능 저장 기준 서술.
📄 "총 300 Epoch 동안 CosineAnnealingLR 스케줄러를 적용하여 학습을 진행하며, 25 Epoch 간격으로 검증 집합 평가를 수행하여 최상위 성능의 체크포인트를 최종 모델로 선정한다."
CosineAnnealingLR 및 25ep 간격 모델 저장 루틴 2026-08-01
📄 scripts/train_exp73_trackA_heads.py (L142-L165)
python scripts/train_exp73_trackA_heads.py --epochs 300
19
p8#130
🔴 class weight = 1/빈도 정규화 ← FORWARD 71~74% 편중 보정
대응책: FORWARD 단독 라벨 편향(72.61%, 12,053/16,599프레임) 및 조향 액션 편차 보정을 위한 1/빈도 계산 후 합=8 정규화 공식 기술.
📄 "FORWARD 행동 클래스(전체의 72.61%)로의 데이터 편향 및 조향 행동 비율 차이를 보정하기 위해, 클래스별 발생 빈도의 역수(1/freq)를 계산하고 합이 8이 되도록 정규화한 손실 가중치(Class Weight)를 Cross-Entropy 손실함수에 적용한다."
Class Weight 계산 및 Normalization 공식 코드 2026-08-01
📄 scripts/train_exp73_trackA_heads.py (L120-L135)
python scripts/train_exp73_trackA_heads.py
20
p8#131
🔴 seeds = 0, 1, 2 (다중 시드로 분산 확인)
대응책: Seed 0, 1, 2 반복 실험을 통한 분산 및 재현성 검증 서술.
📄 "모델 평가의 신뢰성을 확보하기 위해 3개의 무작위 시드(Seed 0, 1, 2)에서 반복 학습을 수행하고 검증 정확도의 분산을 확인하였다."
Multi-seed 학습 평가 스크립트 2026-08-01
📄 scripts/exp73_multiseed_train.py (L30-L85)
python scripts/exp73_multiseed_train.py --seeds 0 1 2
21
p8#133
🔴 모델을 학습하고 난 후에 ***.pth 파일이 결과로 나옴.
대응책: [오류정정] `.pth`가 아닌 `.pt` 파일 및 state_dict + 런타임 메타데이터 통합 저장 형태 기재.
📄 "학습 결과물로 출력되는 단일 파일(*.pt)에는 MLP 헤드의 가중치(state_dict)뿐만 아니라 런타임 검증에 필수적인 메타데이터(window=6, bbox_scale=3.0, head=exp73_mlp 등)가 통합 저장된다."
체크포인트 메타데이터 Dict 저장 구문 2026-08-01
📄 scripts/train_exp73_trackA_heads.py (L160-L175)
📄 checkpoints/exp73_trackA_best.pt
python -c "import torch; print(torch.load('checkpoints/exp73_trackA_best.pt').keys())"
22
p9#137
🔴 학습된 EdgeGrouund-VLA 모델을 SerbotII에 탑재하는 방법 설명
대응책: HTTP REST API 통신 및 언어 디코더 미로드를 통한 Host RAM 70% 절감(10.59GB→3.20GB) 사실 기술.
📄 "학습된 헤드(*.pt) 및 프로젝션 레이어는 SerbotII 로봇의 Jetson Orin 온보드 환경에 배포되며, HTTP API 기반 추론 서버(stage2_v2_inference_server.py)로 탑재된다. 특히 불필요한 언어 디코더(1.361B) 로드를 차단함으로써 엣지 호스트 RAM 사용량을 10.59GB에서 3.20GB로 70% 절감하여 탑재 안정성을 확보하였다."
Jetson Host RAM 측정 및 REST API 서버 탑재 코드 2026-08-05
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L780-L810)
📄 docs/v5/paper_redfill_worklist.html#a22
VLA_KOSMOS_VISION_ONLY=1 python robovlm_nav/serve/stage2_v2_inference_server.py --port 8000
23
p9#141
🔴 로봇 수행 시 카메라로 한 프레임 입력값 전처리 -> 입력값 AI 모델에 입력 -> AI 모델 수행-> 결과값으로 후처리 과정 설명
대응책: 1프레임 런타임 처리 경로 (전처리 → 6프레임 링버퍼 push → MLP 추론 → 콜드스타트/연속회전 차단 후처리) 상세 단계 기술.
📄 "런타임 시 1프레임 입력에 대해 1) 카메라 이미지를 입력받아 OVD 및 VLM 비전 타워 전처리를 수행하고 2) 최근 6프레임 링버퍼 구조에 특징을 Push 및 Flatten하여 3) MLP 모델 추론으로 8클래스 로짓을 산출한 뒤 4) Cold-start Guard 및 연속 회전 차단 후처리 로직을 적용하여 최종 로봇 속도 제어 명령을 발행한다."
추론 서버 파이프라인 메인 엔드포인트 `/predict` 2026-08-01
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L1150-L1260)
curl -X POST http://localhost:8000/predict -H "Content-Type: application/json" -d '{"image": "..."}'
24
p9#142
🔴 Serving control을 런타임시에 여기에서 threshold 값 설정
대응책: 환경변수 주입 방식 및 HDF5 `attrs['runtime_config']` 저장 구조 명시.
📄 "런타임 서빙 제어 파라미터(threshold 등)는 환경변수(VLA_OWLV2_THRESH)를 통해 동적으로 주입되며, 해당 실행 설정은 사후 검증 및 재현성을 위해 생성되는 모든 세션 HDF5 파일의 attrs['runtime_config']에 자동 기록된다."
HDF5 `runtime_config` 메타데이터 로깅 루틴 2026-07-23
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L706, L1416)
📄 scripts/session_matrix_export.py
python scripts/session_matrix_export.py --inspect-config
25
p9#144
🔴 has_bbox 채널의 의미 — 검출 실패 시 cx=0.5, cy=0.6, area=0.06의 고정 fallback 값이 들어가고 has_bbox=0으로 표시됩니다...
대응책: fallback 값 입력 방식과 학습 데이터 미검출 0.00% 한계를 서빙 제어로 우회한 서술 유지 및 보강.
📄 "타겟 검출 실패 시 위치 채널에는 고정 Fallback 값(cx=0.5, cy=0.6, area=0.06)과 함께 has_bbox=0 신호가 주입된다. 학습 데이터 내 미검출 프레임의 부재(0.00%)로 인한 모델의 응답 한계를 극복하기 위해, 실기 환경에서는 이를 학습에 의존하지 않고 서빙 제어 로직(강제 재그라운딩 및 정지 치환)으로 정밀하게 우회 조치하였다."
`has_bbox` fallback 생성 및 미검출 통계 실측 (CH64) 2026-08-01
📄 robovlm_nav/serve/stage2_v2_inference_server.py (L523, L657, L710)
📄 docs/v5/paper_redfill_worklist.html#a25
python scripts/analyze_has_bbox_stats.py --dataset v6
26
p9#145
🔴 학습 시에는 (학습 단계에서의 has_bbox 및 bbox 처리 방식)
대응책: 학습 1단계(Stage 1)에서는 16,599 프레임 100%에 유효 bbox 및 has_bbox=1.0이 입력되었음을 밝히고, has_bbox=0.0 부재(0.00%)로 인한 런타임 우회 설계의 연결성 완결.
📄 "학습 단계(Stage 1)에서는 전체 16,599개 훈련 프레임 100%(16,599/16,599)에 대해 타겟 객체 검출 결과 또는 전파 박스가 존재하여 has_bbox=1.0 상태의 유효한 위치 좌표(cx, cy, area)로 모델이 학습되었다. 즉, 학습 데이터 내에 has_bbox=0.0 (타겟 부재) 샘플이 0.00% 존재함에 따라, 런타임 검출 실패 상황은 학습된 모델 자체의 추론에 의존하지 않고 서빙 단계의 제어 안전 가드(강제 재그라운딩 및 회전 차단/정지 치환)를 통해 우회 처리되었다."
Stage 1 피처 캐시 100% `has_bbox=True` 실측 및 학습 파이프라인 코드 2026-08-01
📄 scripts/exp73_extract_features.py (L110-L135)
📄 scripts/train_exp73_trackA_heads.py (L95-L105)
python -c "import torch; d=torch.load('docs/v5/closed_loop_eval/exp73_v6_vis_cache.pt'); print(sum(b[3] for ep in d['episodes'] for b in ep['bboxes']))"