Real Robot Navigation Test

Robot Test Session Log

Exp66 Stage2 v2 SOTA 모델 실제 로봇 추론 세션 분석.
회색 바스켓 navigation task — 5개 세션, 66개 실수 카메라 프레임.

2026-05-29 / 2026-06-04 66 실수 프레임 Exp66 Stage2 v2 Goal: gray basket navigation

세션 개요

이미지가 저장된 3개 세션 (2026-05-29) + JSON 로그 세션 (2026-06-04)

❌ FAIL — Left Drift

2026-05-29 10:19:30 (29 frames)

29 frames
FWD+LEFT 누적 → 바스켓 시야 상실
의자 쪽 벽으로 완전히 이탈
✅ SUCCESS — Approach

2026-05-29 10:20:26 (20 frames)

20 frames
바스켓 프레임 가득 채울 때까지 직진
정확한 목표 접근 성공
✅ SUCCESS — Fast

2026-05-29 10:21:36 (17 frames)

17 frames
더 빠른 접근, 프레임 수 적음
B보다 효율적인 접근 궤적

2026-05-29 10:19:30 (29 frames) (29 frames)

2026-05-29 10:19 | 목표: gray basket | 결과: LEFT DRIFT → 타깃 상실 ❌

session_20260529_101930

Gray Basket Navigation — Left Drift Failure

❌ FAIL
좌우 스크롤

액션 타임라인 추정

FWD
FWD+L
← DRIFT
🚫 LOST
FORWARD
FWD+LEFT
Drift / 타깃 상실

바스켓 상대 크기 (시야 내 추정) — 프레임별

Frame 1→ 바스켓 사라짐Frame 29

관찰

  • F1~5: 바스켓 중앙, 거리 있음 — 정상 출발
  • F5~10: 바스켓 오른쪽으로 이동 → 로봇이 왼쪽 drift
  • F10~15: 왼쪽 벽에 의자 등장, 바스켓 오른쪽 끝으로
  • F15~29: 바스켓 완전 소실, 의자·서랍장 zone으로 이탈

원인 분석

  • FWD+LEFT 편향 — 데이터 수집 경로 특성 반영
  • 바스켓이 화면 중앙에 있어도 LEFT 성분 지속
  • 누적 오류: 각 스텝 작은 좌향 → 큰 이탈
  • Closed-loop FPE 1.45m (Exp11 기준) 와 동일 패턴

2026-05-29 10:20:26 (20 frames) (20 frames)

2026-05-29 10:20 | 목표: gray basket | 결과: 바스켓 직진 접근 ✅

session_20260529_102026

Gray Basket Navigation — Successful Approach

✅ SUCCESS
좌우 스크롤

액션 타임라인 추정

FWD
FWD±
FWD 근접
🎯 도달
FORWARD
FWD+L 보정
목표 도달

바스켓 크기 증가 (접근 지표)

Frame 1 (멀리)→ 꾸준히 접근Frame 20 (바스켓 꽉 참)

관찰

  • F1: 바스켓 중앙, 세션 A와 동일 출발 위치
  • F10: 바스켓 우측 치우침, 크기 커짐 → 근접 중
  • F15: 바스켓이 프레임 절반 이상 차지
  • F20: 바스켓 전체 화면 가득 — 목표 도달 지점

성공 요인

  • 출발 위치/각도가 세션 A보다 미세하게 유리
  • 초기 FORWARD 비율이 더 높아 직진 성분 우세
  • Decomposition Stage2 bbox 추적이 정상 작동
  • FPE 0.55m (Exp14 Step2 기준) 수준 일치

2026-05-29 10:21:36 (17 frames) (17 frames)

2026-05-29 10:21 | 목표: gray basket | 결과: 빠른 접근 성공 ✅

session_20260529_102136

Gray Basket Navigation — Efficient Approach

✅ SUCCESS
좌우 스크롤

접근 속도 — B보다 17% 빠름 (17 vs 20 frames)

Frame 1→ 빠른 접근Frame 17

관찰

  • F1: B와 거의 동일 출발 — 바스켓 중앙
  • F9~12: 이미 중간 거리에서 바스켓 크게 보임
  • F17: 바스켓 프레임 가득 — 목표 도달
  • B 대비 3 프레임 빠른 도달 (~1.3초 이득)

비교 포인트

  • 출발 위치가 B보다 약간 더 가까웠을 가능성
  • 또는 초기 FORWARD 속도 성분이 더 강함
  • 성공 패턴: B와 동일하게 drift 없이 직진
  • 이 두 세션이 실제 66.7% success 수치에 기여

June 4 세션 — 실험 조건 & 원인 분석

5개 세션 × 2 모델 비교. 각 세션별 실험 조건 / 액션 분포 / 실패 원인 분석.

세션 시각 모델 지시어 스텝 avg 레이턴시 전략 결과
D 01:34:59 checkpoints/best (Exp66 Stage2v2) "[FORWARD] the gray basket on right" 102 427ms single_action 🔴 순환
E 08:59:23 checkpoints/best (Exp66 Stage2v2) "[FORWARD] the gray basket" 21 412ms single_action 🟡 수동종료
F 13:30:07 checkpoints/best (Exp66 Stage2v2) "[FORWARD] the gray basket on right" 92 432ms single_action 🔴 순환
G 13:31:50 checkpoints/best (Exp66 Stage2v2) "[FORWARD] the gray basket on right" 17 429ms single_action 🟢 최우수
H 16:36:17 exp49/exp49_mlp.pt (GoalNav regression) "[FORWARD] the gray basket" 14 619ms receding_horizon 🚫 폐기
session_20260604_013459

D — 2026-06-04 01:34:59

🔴 순환 실패
checkpoints/best "[FORWARD] the gray basket on right" avg 427ms 102 steps gt: gray basket single_action

액션 시퀀스 (102 steps)

? FWD+L FWD+L LEFT FWD+L FORWARD FWD+L FWD+L FORWARD FORWARD FWD+L FWD+L FORWARD FORWARD FORWARD LEFT FORWARD FWD+R FWD+L FORWARD FORWARD FWD+L FWD+L FWD+L FORWARD FORWARD FWD+L FORWARD FWD+R FWD+R FWD+L FORWARD FWD+L FORWARD FWD+L FORWARD FORWARD FORWARD FWD+R FWD+R FWD+L FORWARD FWD+L FWD+L FWD+L FWD+L ROT_R FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FORWARD FORWARD …+42스텝

액션 분포

FWD+L
50%
FORWARD
32%
FWD+R
11%
LEFT
7%
ROT_R
1%
⚡ 문제점

FWD+L 50% 지배 → 지속적 좌편향 이동. 102스텝에도 목표 미달성. grounding 매 스텝 새로 실행 (cached=0%), 지시어 "on right"에도 우회전 보정 없음.

🔬 가설

바스켓이 항상 왼쪽에 있어 좌회전 bias가 정당화됨. 그러나 순환 루프 탈출 조건 없음 → 무한 접근 시도. Stop rule 부재가 주원인.

다음 액션: bbox area 임계값 기반 stop 조건 추가 필요
session_20260604_085923

E — 2026-06-04 08:59:23

🟡 단기 테스트
checkpoints/best "[FORWARD] the gray basket" avg 412ms 21 steps gt: gray basket single_action

액션 시퀀스 (21 steps)

? FWD+L FWD+L FWD+L FORWARD RIGHT FORWARD FWD+L FWD+L FWD+L FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FORWARD LEFT FORWARD FORWARD

액션 분포

FWD+L
60%
FORWARD
30%
RIGHT
5%
LEFT
5%
⚡ 문제점

지시어 단순화 ("on right" 제거). FWD+L 60% 여전히 지배. 21스텝 후 수동 중단. D 세션 대비 지시어 변경 효과 불명확.

🔬 가설

지시어 변형만으로는 action bias 변화 없음. 모델이 지시어 텍스트보다 이미지 bbox cx에 더 의존. 바스켓 위치가 cx<0.5이면 FWD+L이 지속됨.

다음 액션: 바스켓 상대 위치별 action 분포 추가 분석 필요
session_20260604_133007

F — 2026-06-04 13:30:07

🔴 순환 실패
checkpoints/best "[FORWARD] the gray basket on right" avg 432ms 92 steps gt: gray basket single_action

액션 시퀀스 (92 steps)

? FWD+L FORWARD FWD+L FORWARD FWD+R FORWARD FORWARD FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FWD+L LEFT FORWARD FWD+L FORWARD FWD+L FORWARD FWD+L FWD+L FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FWD+R FORWARD FORWARD FWD+L FWD+L FWD+L FORWARD FWD+L FORWARD FWD+L FORWARD FORWARD FWD+L FORWARD FWD+L FORWARD FWD+R FWD+L FWD+L FWD+L FWD+L FORWARD FWD+L FWD+L FORWARD FWD+L FWD+L FORWARD FWD+L FWD+L …+32스텝

액션 분포

FWD+L
52%
FORWARD
42%
FWD+R
3%
LEFT
2%
RIGHT
1%
⚡ 문제점

D 세션과 동일 지시어 재시도. FORWARD 비율 42%로 증가(D: 32%) — 더 직진적이지만 여전히 목표 미달. 92스텝, grounding 전부 uncached.

🔬 가설

바스켓이 항상 화면 중앙~좌측에 위치 → FWD+L이 정답처럼 출력. bbox cx 추적은 되지만 "충분히 가까워졌다"는 stop 판단이 없어 무한 루프.

다음 액션: F세션은 D보다 FORWARD 비율 높음 → 바스켓 위치가 더 중앙적이었을 가능성
session_20260604_133150

G — 2026-06-04 13:31:50

🟢 최우수 분포
checkpoints/best "[FORWARD] the gray basket on right" avg 429ms 17 steps gt: gray basket single_action

액션 시퀀스 (17 steps)

? FORWARD FWD+L FWD+L FORWARD FORWARD FWD+L FWD+L FORWARD LEFT FORWARD FORWARD FORWARD FORWARD FWD+L FWD+L FWD+L

액션 분포

FORWARD
50%
FWD+L
44%
LEFT
6%
⚡ 문제점

FORWARD 50%, FWD+L 44% — 가장 균형잡힌 분포. 17스텝으로 짧게 종료. F 세션 직후 동일 조건 재시도.

🔬 가설

초기 포즈에서 바스켓이 비교적 정면에 위치 → FORWARD 비율 상승. checkpoints/best의 잠재력 확인. 단 stop 조건 없어 인간이 개입.

다음 액션: 이 조건(바스켓 정면)이 재현 가능하다면 성공률 높을 것
session_20260604_163617

H — 2026-06-04 16:36:17

🚫 모델 폐기
exp49/exp49_mlp.pt "[FORWARD] the gray basket" avg 619ms 14 steps gt: gray basket receding_horizon

액션 시퀀스 (14 steps)

? STOP REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0 REG≈0

액션 분포

REGRESSION
92%
STOP
8%
⚡ 문제점

exp49 regression 헤드 전 스텝 출력 ≈ −0.015, −0.007 → 사실상 정지. receding_horizon 전략, 레이턴시 619ms(checkpoints/best 대비 +44%). 분류 헤드 없는 순수 regression은 동작 불가.

🔬 가설

exp49 EMA 누적으로 regression output이 소수점 근처로 수렴. 분류(argmax) 없이 연속값만으로 속도 매핑 시 zero-crossing 문제 발생. discrete classification이 필수임을 실증.

다음 액션: → exp49 폐기, checkpoints/best(discrete 8-class) 계속 사용

모델 발전 경로

2026-05-29
Proxy Server (Kosmos-2 Grounder)
이미지 기반 navigation 첫 실사 테스트. grounding bbox cx → left/right 판단. 세션 A 실패(좌편향), B/C 성공(정면 접근).
2026-06-04 (D, E)
checkpoints/best Stage2v2 — 장시간 세션
D: 102스텝, FWD+L 50% 지배. E: 지시어 단순화 시도. 공통 문제: stop 조건 없어 무한 순환. grounding은 정상 동작.
2026-06-04 (F, G)
checkpoints/best — 조건 재시도 & 개선 확인
G 세션: FORWARD 50%, FWD+L 44% — 가장 균형 잡힌 분포. 바스켓이 정면에 있을 때 모델이 올바르게 FORWARD를 선택함을 실증. 초기 포즈가 핵심 변수임을 확인.
2026-06-04 (H)
exp49 regression — 실패 확인 후 폐기
regression 출력 ≈ −0.015 수렴. 619ms 레이턴시. discrete 8-class classification이 필수임을 실증. exp49 regression 방식 폐기 결정.

핵심 발견 & 모델 발전 결론

May 29 + June 4 세션 전체에서 도출된 실사 결론

Decomposition 모델 실사 접근 가능

Session B·C(May 29) 모두 바스켓에 성공적으로 접근. 시뮬레이션 66.7% success rate 실사 재현. checkpoints/best Stage2v2가 현재 유일한 동작 모델.

⚠️

초기 포즈가 성패의 핵심 변수

Session G(Jun 4): FORWARD 50% — 바스켓 정면 배치 시 균형 잡힌 출력. Session A(May 29): FWD+L 누적 → 이탈. 동일 모델이 초기 각도 ±10°에 따라 완전히 다른 결과.

🚫

exp49 regression 완전 비동작 → 폐기

Session H: regression 출력 ≈ −0.015 수렴. 619ms 레이턴시. discrete 8-class classification이 실사 제어에 필수임을 실증. exp49 폐기 결정.

🔁

Stop 조건 부재 = 무한 순환

Session D(102스텝), F(92스텝) 모두 목표 미달. 바스켓에 가까워져도 멈추지 않고 순환. bbox area threshold stop 조건이 실사에서 필수. 현재 대시보드에 0.18 기준 구현됨.

📡

Grounding 정상 동작 — 레이턴시 허용 범위

checkpoints/best 평균 427ms. grounding 매 스텝 uncached(0/102)임에도 실사 제어에 문제 없음. 0.5s 타이머 + 0.43s API = 0.93s/step. post-move 캡처 도입 후 학습 분포 일치.

💡

지시어 변형보다 포즈 제어가 효과적

"on right" → "the gray basket"으로 지시어 단순화(Session E)했으나 action bias 변화 없음. 텍스트 attention이 낮은 모델 특성상 포즈/거리 표준화가 더 효과적인 개입점.

2026-06-04 세션 — Action 시퀀스 분석

이미지 저장 없이 action log만 기록된 세션. proxy inference server (checkpoints/best) 사용. Exp49 직접 실행 세션(H)에서 EMA 붕괴로 REGRESSION 출력 확인.

2026-06-04 01:34:59 2026-06-04 01:34:59 — 102스텝
Basket on right — FWD+L 50회 좌편향
FWD+L bias
Action Sequence (step 2→102)
FWD+LFWD+LLEFTFWD+LFWDFWD+LFWD+LFWDFWDFWD+LFWD+LFWDFWDFWDLEFTFWDFWD+RFWD+LFWDFWDFWD+LFWD+LFWD+LFWDFWDFWD+LFWDFWD+RFWD+RFWD+LFWDFWD+LFWDFWD+LFWDFWDFWDFWD+RFWD+RFWD+LFWDFWD+LFWD+LFWD+LFWD+LRRFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWDFWDFWDLEFTFWDFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWDLEFTFWD+RFWD+LFWD+LFWD+RFWD+LFWD+LFWDFWDFWD+RFWD+LFWD+LLEFTFWD+LFWD+LFWD+LFWDFWD+RFWD+LFWD+LFWD+LFWD+LLEFTFWD+LFWD+RFWDFWD+RLEFT
Distribution
FWD+L
50 (50%)
FORWARD
32 (32%)
FWD+R
11 (11%)
LEFT
7 (7%)
ROT_R
1 (1%)
2026-06-04 08:59:23 2026-06-04 08:59:23 — 21스텝
FWD+L bias 지속 확인
FWD+L bias
Action Sequence (step 2→21)
FWD+LFWD+LFWD+LFWDRIGHTFWDFWD+LFWD+LFWD+LFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWDLEFTFWDFWD
Distribution
FWD+L
12 (60%)
FORWARD
6 (30%)
RIGHT
1 (5%)
LEFT
1 (5%)
2026-06-04 13:30:07 2026-06-04 13:30:07 — 92스텝
FWD+L 47회 — bias 재현
FWD+L bias
Action Sequence (step 2→92)
FWD+LFWDFWD+LFWDFWD+RFWDFWDFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWD+LLEFTFWDFWD+LFWDFWD+LFWDFWD+LFWD+LFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWD+RFWDFWDFWD+LFWD+LFWD+LFWDFWD+LFWDFWD+LFWDFWDFWD+LFWDFWD+LFWDFWD+RFWD+LFWD+LFWD+LFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWDFWD+LFWD+LFWD+LFWDFWDFWDFWD+LFWDFWDFWDFWDRIGHTFWD+LFWDFWD+LFWDFWD+LFWD+LFWDFWDFWD+LFWD+LFWDFWD+LFWD+LFWDFWDFWDFWDLEFTFWD
Distribution
FWD+L
47 (52%)
FORWARD
38 (42%)
FWD+R
3 (3%)
LEFT
2 (2%)
RIGHT
1 (1%)
2026-06-04 13:31:50 2026-06-04 13:31:50 — 17스텝
수동 중단
FORWARD
Action Sequence (step 2→17)
FWDFWD+LFWD+LFWDFWDFWD+LFWD+LFWDLEFTFWDFWDFWDFWDFWD+LFWD+LFWD+L
Distribution
FORWARD
8 (50%)
FWD+L
7 (44%)
LEFT
1 (6%)
2026-06-04 16:36:17 2026-06-04 16:36:17 — 14스텝
Exp49 직접 실행 → REGRESSION 출력 / EMA 붕괴
EMA 붕괴
Action Sequence (step 2→14)
STOPREGREGREGREGREGREGREGREGREGREGREGREG
Distribution
REGRESSION
12 (92%)
STOP
1 (8%)

2026-06-18 세션 — stop_N1 첫 실전 테스트

NEW

모델: stop_N1.pt (L3b N=1, CL 96.6%)  |  STOP 모드: VLA_STOP_MODE=learned  |  서버: stage2_v2_inference_server (포트 8001)

실험 조건
모델 stop_N1.pt — 마지막 1프레임 STOP 주입 (val_acc 0.799)
STOP 모드 learned latch — 모델이 class 0 예측 시 reset 전까지 유지
Instruction "the gray basket"
Grounder PG2 (stage2_v2_inference_server)
장소 실험실 — 바구니 정면 (중앙 배치)
2026-06-18 09:01:19 09:01:19 — 17스텝
바구니 정면 중앙 배치 — STOP 미발동, 좌우 편향 혼재
PG2 grounding 전체 실패 STOP 미발동
Action Sequence (step 2→17)
FWD+R FWD+L FWD+R FWD+R FWD FWD+R FWD FWD FWD FWD FWD FWD FWD FWD FWD FWD
⚠️ PG2 Grounder 전체 실패 (17/17 프레임)
모든 프레임에서 has_bbox=False — Fallback bbox 고정값 사용
cx=0.50, cy=0.60, area=0.060 (방향 정보 없음)
→ 모델이 이미지 피처만으로 액션 결정 (Stage1 16×16 feature)
Action Distribution (16 steps)
FORWARD
11 (69%)
FWD+R
4 (25%)
FWD+L
1 (6%)
STOP
0 (0%)
Latency
평균 406 ms / step
원인 분석
① Grounding 완전 실패
PG2가 "the gray basket" 검출 실패 → has_bbox=False 17/17.
Stage2 MLP 입력의 bbox 채널이 fallback 고정값(area=0.06, cx=0.5)으로 채워짐.
실질적으로 Stage1 이미지 피처만 동작.
② Learned STOP 미발동
stop_N1 모델은 바구니가 가까울 때(area 크기) STOP을 학습함.
그러나 grounding 실패로 area=0.06 고정 → 모델 입장에서 "바구니 멀리 있음" 판단.
→ STOP class 한 번도 예측 안 함.
③ 초기 FWD+R 편향
step2~5에 FWD+R 연속 — grounding 없이 이미지 피처만으로 오른쪽 편향.
이후 FORWARD 수렴은 "방향 정보 없을 때 직진" 패턴으로 해석 가능.
결론 — 핵심 병목
PG2 grounding이 실패하면 learned STOP도 동작 안 함.
다음 테스트 전 PG2가 바구니를 제대로 검출하는지 먼저 확인 필요.
대시보드 bbox area 실시간 표시로 검출 여부 사전 확인 가능.

2026-06-18~20 PG2 Grounding — S1~S7 전체 세션 분석

grounding

모델: paligemma2-3b-mix-224 (base, 파인튜닝 없음)  |  총 597프레임 (S1=7 + S2=247 + S3=14 + S4=24 + S5=115 + S6=105 + S7=85)  |  카메라 버그 → 4종 필터 → PNG → temporal N=3 순서로 패치 누적, S7에서 "근접-미스 bbox" 신규 발견

S1 — imgmsg_to_cv2 버그 (14:23:13~19, n=7)
카메라 버그
0%
유효율 (0/7)
7/7
fast 기록 (~361ms)
0.06
area (모두 fallback)
0.5
cx (모두 fallback)
7
연속 NO_BBOX
원인
ROS imgmsg_to_cv2(CompressedImage) 호출 → 빈 이미지 (blank array) → PG2에 검은 프레임 입력 → <eos> 즉시 반환 (latency ~360ms, fast path) → has_bbox=False + area=0.06/cx=0.5 (기본 fallback 값)
수정
compressed_imgmsg_to_cv2() 로 교체 → S3 이후 fast=0건 확인 (완전 해결). area=0.06, cx=0.5 fallback 패턴 = 버그 지문으로 활용 가능.
ⓘ 프레임 필름스트립 없음 — mp4 영상이 저장되지 않은 세션(카메라 decode 버그로 빈 이미지만 들어와 영상 녹화 가치 없음)
S2 — 장시간 로봇 테스트, 버그 지속 (14:23:20~14:46:46, n=247)
카메라 버그
1.2%
유효율 (3/247)
slow path만 유효
244
fast 기록 (~361ms)
98.8% 빈 이미지
195
최장 연속 NO_BBOX
0.360
OK area 평균
(3건만 유효)
2
near-goal 프레임
비연속 → 발동 0
3건 slow(유효) 상세
n=196: area=0.073 cx=0.511 lat=1298ms
n=209: area=0.505 cx=0.500 lat=1235ms  ★near-goal
n=216: area=0.501 cx=0.498 lat=1242ms  ★near-goal
→ n=209~216 사이 6프레임 fast(NO_BBOX) 분리 → temporal 불발 (정상)
NO_BBOX 연속 구간
195연속 / 31연속 / 12연속 / 6연속
총 23분 세션 — 로봇이 바스켓을 대부분 찾지 못함
(카메라 버그 + 탐색 실패 복합)
ⓘ 프레임 필름스트립 없음 — mp4 영상이 저장되지 않은 세션(카메라 decode 버그로 빈 이미지만 들어와 영상 녹화 가치 없음)
S3 — 카메라 버그 수정 직후 첫 테스트 (15:16:02~41, n=14)
카메라 수정 직후
64.3%
필터 후 유효 (9/14)
has_bbox=14/14
0
fast 기록
카메라 버그 해결!
5
TINY (area<0.01)
4-filter 未적용
3
near-goal
n=5,11,13 비연속
4
중복 프레임
n=1~4 완전 동일
14프레임 상세 (후처리 분류)
n=1~4: OK area=0.050 cx=0.514 (4프레임 완전 동일 — 버퍼 중복)
n=5: OK area=0.454 cx=0.500 ★near-goal
n=6: OK area=0.068 cx=0.683
n=7~10: TINY area=0.001~0.002 (4-filter 없음 → 통과)
n=11: OK area=0.505 cx=0.500 ★near-goal
n=12: OK area=0.064 cx=0.544
n=13: OK area=0.482 cx=0.498 ★near-goal
n=14: TINY area=0.001
발견 & 미적용
near-goal 3건: n=5 / n=11 / n=12(사이 gap있음) / n=13
n=11→n=12→n=13: n=12가 area=0.064(미달) → 3연속 불성립
이 세션 시점엔 4종 필터 未적용 → TINY 5건이 has_bbox=True로 통과
latency 전부 1270~1335ms (정상 PG2 추론)
ⓘ 프레임 필름스트립 없음 — mp4 영상이 저장되지 않은 세션(15프레임 미만, 영상 미녹화)
S4 — 4종 필터 前 구버전 서버 (15:26:30~15:27:39, n=24)
29.2%
유효율 (7/24)
XFULL 제외 시
6
XFULL (cx≈0.5)
n=1,3,4,16,21,22
6
FULL (area≥0.987)
n=10~14,23
5
TINY (area≤0.001)
n=2,5,6,7,8
7
near-goal
area 0.26~0.55
24건 전부 has_bbox=True (min_new_tokens=1 적용, <eos> 없음) — 하지만 4종 필터 未적용 → TINY 5건(area<0.001), FULL 6건(area≥0.987), XFULL 6건(x방향 전체폭) 포함. OK 7건: n=9(area=0.258) / n=15(0.056) / n=17(0.074) / n=18(0.105) / n=19(0.078) / n=20(0.078) / n=24(0.234). max_ok_consec=8 (n=15~22, 하지만 내부에 FULL/XFULL 포함). 필름스트립 아래 참조.
24/24
검출률 100%
min_new_tokens=1 적용 후
5/24
Micro-bbox (area < 0.01)
바스켓 일부만 포착
6/24
Giant bbox (area > 0.95)
전체 화면을 바스켓으로
1/24
False Positive
바스켓 없는데 검출
BUG 1 Micro-bbox — 바스켓 일부(≈3%)만 포착, area≈0.001
Record #2 — area=0.0011, cx=0.498
Record #6 — area=0.0014, cx=0.471
원인: base PG2가 바스켓 전체가 아닌 특정 feature(손잡이, 격자 패턴)에만 반응
raw 예시: <loc0528><loc0496><loc0568><loc0524> → 4%×3% 크기
영향: cx는 우연히 중앙값이나 area 기반 stop 판단 불가. area < 0.01 프레임은 필터링 필요
BUG 2 Giant bbox — 전체 화면을 바스켓으로 인식, area≈0.987
Record #10 — area=0.987, cx=0.499 (바스켓 근접 시)
Record #19 — area=0.078, cx=0.490 (정상 케이스)
원인: 바스켓이 근접(~0.5m)했을 때 PG2가 전체 이미지를 bbox로 출력. 파인튜닝 없이 min_new_tokens=1로 강제 생성 시 발생
raw 예시: <loc0000><loc0000><loc1022><loc1022>
영향: area 기반 stop threshold (≥0.4)가 항상 발동. area > 0.95 프레임도 필터링 또는 클램핑 필요
BUG 3 ⚠️ 심각 False Positive — 바스켓 없는 장면에서 검출 (cx=0.33)
Record #17 — 바스켓 없음, has_bbox=True, area=0.074, cx=0.33
상황: 카메라가 책상/의자 방향을 바라보고 있었음. 바스켓은 화면에 없음.
원인: min_new_tokens=1로 강제 생성 → PG2가 항상 무언가를 검출. base 모델은 "없음" 판단 불가.
영향: has_bbox 필드는 더 이상 신뢰 불가. goal_near 판단을 area 단일값으로 하면 오작동 위험.
→ 탐지 신뢰도 지표가 필요함 (confidence score, 복수 프레임 합산 등)
Area 분포 — 24프레임
Micro (area < 0.01)
5 / 24
Records: #2, 5, 6, 7, 8
cx 평균: 0.490 (우연히 정확)
유효 (0.01 ≤ area ≤ 0.95)
13 / 24
Records: #9, 15, 17~20, 24 등
cx 평균: 0.488 (대체로 정확)
Giant (area > 0.95)
6 / 24
Records: #10~14, 23
cx 평균: 0.499 (전체화면이라 항상 0.5)
S5 — 4종 필터 적용 신버전 서버 (16:35:35~16:54:35, n=115)
33.9%
유효율 (39/115)
↑ S4 29.2% +4.7%p
0
노이즈 bbox
FULL/TINY/XFULL 전멸
76
NO_BBOX
max_consec=24
0.076
OK area 평균
range: 0.013~0.297
2
near-goal
n=44(0.262) n=45(0.297)
area 분포 (39건 OK)
0.01~0.05: 13건 / 0.05~0.10: 19건 ★최다 / 0.10~0.20: 5건
0.20~0.30: 2건 (n=44, n=45) / 0.30+: 0건
→ area 상한 0.297 → stop 판단 아슬아슬
OK 연속 구간: [15, 6, 4, 4, 2, 1]
near-goal & temporal
n=44(area=0.262) → n=45(area=0.297): 2연속
n=45 다음: NO_BBOX → temporal 3연속 불성립 → goal_near 발동 0회
cx 이상치: n=43 cx=0.128 (좌측 끝 오탐 가능성)
잔존: temporal N=3 미적용 (다음 세션 S6에서 적용)
ⓘ S5(16:35:35~16:54:35)는 idle-gap으로 2개 mp4로 분리 녹화됨(gnd_163535.mp4 47프레임 + gnd_165212.mp4 49프레임 = 96, 원본 jsonl 115건과는 idle 구간 차이로 약간 다름) · 아래 bbox는 신 서버 오프라인 재평가 기준(PG2 오프라인 재평가 섹션과 동일 데이터)
Part 1 — gnd_163535 (47프레임, 16:35:35~)
Part 2 — gnd_165212 (49프레임, 16:52:12~16:54:35)
4종 필터 패치 + min_new_tokens=1 적용 후 — 신버전 서버 (16:22~, n=115)
115
총 프레임
39
유효 bbox (33.9%)
구버전 29.2% → +4.7%p
0
노이즈 bbox
tiny/giant/xfull 전멸
25
바스켓없음 fast
raw=' ; <eos>' ~660ms
개선사항
  • tiny/giant/xfull bbox → fallback 처리 (has_bbox=False)
  • 유효율 29.2% → 33.9%
  • 유효 39건 area: 0.013~0.297, cx: 0.128~0.712
  • area 평균 0.076 (1~3m 거리 정상 범위)
  • false positive 0건 (구버전 1건 → 0건)
잔존 이슈
  • 필터차단 51건: 주로 xfull(cx≈0.5 area>0.4)
  • cx=0.128 이상치 — 좌측 끝 오탐 가능성
  • 바스켓 근접 시 area 상한 0.297 — stop 판단 아슬아슬
  • false positive 기하필터 불가 → temporal 필터 미구현
S6 — 4종 필터 + PNG + temporal N=3 전부 적용 (17:26~17:31, n=105)
최신
51.4%
유효율 (54/105)
↑ 33.9% → +17.5%p
0
fast 기록
카메라 버그 완전 해결
0
노이즈 bbox
tiny/full/xfull 전멸
0.687
area 최대 (근접)
avg 0.093 · cx 0.522
1264ms
평균 latency
전부 정상 PG2 추론
OK BBOX AREA 분포 (54건)
0.01~0.05
21건
0.05~0.10
24건 ★ 최다
0.10~0.20
3건
0.20~0.30
1건
0.30~0.50
4건 (근접 구간)
0.50+
1건 (area 0.687 최대근접)
연속 OK 구간
n=2~25  24프레임 연속 — area 0.034~0.687
n=32~44  13프레임 연속 — area 0.047~0.320
n=48~52  5프레임 연속
n=98~105  8프레임 연속
temporal N=3 분석
near-goal(area≥0.25) 프레임: 6건
· n=23(0.276) → n=24(0.687) — 2연속, 3번째 없음
· n=33(0.320) → n=36→37(0.314→0.320) — 비연속
goal_near 발동 0회 (correct — 로봇이 충분히 접근 안 함)
연속 NO_BBOX 최대: 41프레임 (n=56~94)
⚠️ 41프레임 dead zone 원인 — "시야 이탈"도 "초근접 collapse"도 아님 (실제 프레임 확인)
n=56 — raw=풀프레임, 실제 바스켓은 중거리·또렷
n=70 — 동일 패턴, 카메라 거의 정지 상태
n=85 — 30프레임 뒤에도 똑같은 collapse
raw 전부 동일: <loc0000><loc0000><loc1010~1014><loc1022> (풀프레임 주장), latency 1250~1330ms로 정상 생성(fast <eos> 패턴 아님). 그런데 실제 사진엔 바스켓이 중간 거리에서 화면의 20~30%만 차지 — 근접도 가림도 아님.
카메라가 거의 정지한 채 같은 장면을 반복 입력하자 PG2가 동일한 풀프레임 환각으로 deterministic하게 수렴한 것 (do_sample=False greedy decode라 입력이 거의 동일하면 출력도 고정됨). 이 특정 각도·거리·조명 조합에서 base PG2가 구조적으로 약함을 시사.
진짜 "바스켓 없음"은 n=95 1건뿐 (lat=664ms, raw=' ; <eos>').
gnd_20260618_172556.jsonl · 105레코드 · 17:26:21~17:31:32 · fast 기록 1건 (camera decode 버그 해결 확인, n=95) · temporal filter 로그 [near N/3] 실서버 확인됨 · NO_BBOX 51건 중 50건은 정지 장면 풀프레임 환각(거리 무관) — filter는 정확히 작동, base PG2의 특정 장면 불안정성이 근본 원인
S7 — 06-20 신규 세션 (11:09~11:13, n=85) — "근접 미스" bbox 발견
신규
gnd_20260620_110911.jsonl — idle-gap 자동 롤오버 버그로 누락됐던 세션을 gnd_20260620_110911.mp4에서 ffmpeg 1fps로 강제 추출(85프레임, jsonl 85건과 정확히 매칭)
40.0%
유효율 (34/85)
↓ S6 51.4%보다 낮음
0
노이즈 bbox
tiny/full/xfull 전멸
8
최대 연속 NO_BBOX
S6(41) 대비 훨씨 짧음
8
최대 연속 "근접"(f39~46)
⚠ 시각검증 결과 전부 오탐
0.157
area 평균 (max 0.723)
cx평균 0.558
⚠️ 신규 실패 유형 발견 — "근접-미스(near-miss)" bbox
f39~46(8연속)이 PROXIMITY STOP 조건(area≥0.25, |cx-0.5|≤0.35)을 전부 만족 — 4-filter도 전부 통과한 "유효" 검출. 하지만 실제 프레임을 확인하면 PG2가 바스켓이 아니라 바스켓 옆 빈 바닥/벽 영역에 bbox를 그렸다. 기하학적으로는 멀쩡한 bbox(너무 크지도 작지도 않고, 중앙 근처)라서 4-filter로는 절대 걸러지지 않는다.
n=39 — bbox(녹색)가 의자 옆 바닥에 위치, 실제 바스켓(우측)은 박스 밖
cx=0.67 area=0.297 — PROXIMITY 조건 통과(오탐)
n=41 — 동일 오탐 패턴, bbox는 빈 바닥, 바스켓은 프레임 우측 끝에 살짝 보임
cx=0.69 area=0.259
→ 실로봇 CL 배포 시 이 패턴이 나오면 로봇이 바스켓에 도달하지 않은 상태에서 PROXIMITY STOP이 잘못 발동할 수 있음. 4-filter + temporal N=3는 "이상한 크기/위치"는 걸러내지만 "그럴듯하지만 틀린 위치"는 못 걸러냄 — 다음 우선 보완 대상.
전체 85프레임 보기 ← → 스크롤
OK BBOX AREA 분포 (34건)
0.01~0.10
12건
0.10~0.25
10건
0.25~0.40
11건 ★ 근접-미스 의심군 포함
0.40+
1건 (area 0.723 — basket+wall 통합 loose bbox)
gnd_20260620_110911.jsonl · 85레코드 · 11:09:24~11:13:39 · 연속 NO_BBOX 8건 구간 다수 (S6의 41연속 정지-환각과는 다른 패턴 — 로봇이 계속 이동 중이었던 것으로 추정) · HSV 교차검증 결과는 아래 별도 섹션 참조
S7 CL 파이프라인 시뮬레이션 — S6와 정반대 패턴
0
STOP 발동 횟수
S6은 f024에서 발동+latch
55 / 30
FWD+R / FORWARD
85프레임 내내 전진만
61
NO_BBOX (재추론 기준)
71.8% — 원본로그 60%보다 높음
1
최대 연속 NEAR
f053 단발 (area=0.297)
액션 타임라인 (f001→f085, hover로 상세)
FWD+R(NO_BBOX) FWD+R(OK) FORWARD(NO_BBOX) FORWARD(OK) 근접-미스 클러스터(f39~46) NEAR(area≥0.25)
S6 vs S7 대조: S6은 f024에서 action MLP가 자체적으로 STOP을 결정하고 즉시 latch — 이후 81프레임 내내 멈춤. S7은 정반대로 85프레임 전체에서 STOP이 단 한 번도 나오지 않음 — NO_BBOX가 61건(71.8%)으로 더 많은데도 계속 FWD+R/FORWARD만 예측. 즉 학습된 STOP 판단은 거리(area)가 아니라 8-frame window 안의 특정 시퀀스 패턴에 반응하는 것으로 보임 — 두 세션 모두 PROXIMITY STOP(area≥0.25 연속 3프레임)은 발동하지 않음.

※ 이 재추론 NO_BBOX 비율(71.8%)은 원본 실시간 로그(60%, 34/85 valid)보다 높음 — mp4 1fps 추출 시 재인코딩으로 픽셀이 미세하게 달라져 PG2 bbox decode가 일부 프레임에서 다르게 나온 것으로 추정 (PNG/JPEG 이중압축이 PG2 출력에 영향을 준다는 기존 패치 이슈와 동일한 메커니즘). 따라서 정확한 수치보다 "STOP 0회 vs S6의 STOP 발동" 같은 정성적 대조가 더 신뢰할 수 있는 결론.
HSV classical detector 교차검증 — PG2 fallback 프레임 재검출 시도
목적: PG2가 NO_BBOX로 처리한 프레임에 독립적인 HSV 기반 검출기(patch_hsv_annotations.py 동일 로직, S∈[0,20]·V∈[70,230]·area≥400px)를 재적용해 라벨 보강이 가능한지 검증. PG2 self-labeling은 PG2의 collapse 자체를 학습데이터로 순환참조하므로 독립 검출기 교차검증이 필요함.
⚠️ 1차 필터(cx>0.85 & area<0.01) → 시각검증 후 폐기, area 단일 기준으로 재설계
최초 가설: HSV가 오른쪽 멀리(cx>0.85) 작게(area<0.01) 잡으면 배경 장비(우산 리플렉터 등) 오탐일 것 → 1차로 S6에서 "진짜 복구 10건(19.6%)"으로 분류.
실제 프레임 시각검증(n=25, n=30, n=44, n=52) 결과: cx가 왼쪽(0.02~0.47)이라 필터를 통과했지만 전부 의자 다리/벽 얼룩 오탐 — 실제 바스켓은 화면 중앙에 또렷이 보이는데 HSV는 구석의 작은 잡음을 잡았음.
cx 위치가 아니라 area 크기가 핵심: area<0.04인 검출은 거의 전부 잡음, area≥0.04만 신뢰 가능 (근접 촬영 시 바스켓이 화면을 크게 채움).
S6 — area≥0.04 재검출
fallback 51건 중 area≥0.04: 4건(7.8%) — n=26·27·28(연속 클러스터, cx≈0.40)·n=96(cx=0.332)
시각검증: n=26, n=96 직접 확인 ✅ 진짜 바스켓(근접 촬영). n=27·28은 n=26과 연속 프레임·동일 cx대로 신뢰
나머지 47건(92.2%)은 area<0.04 의심군 — 의자/벽 얼룩 등 잡음으로 제외
PG2 51.4% → PG2+HSV 55.2% (58/105)
S7 — area≥0.04 재검출, 그래도 오탐 1건
fallback 51건 중 area≥0.04: 3건(5.9%) — n=6·84·85
시각검증: n=84·85(연속, cx≈0.35) ✅ 진짜. n=6(area=0.203)은 area 기준 통과했지만 시각확인 결과 왼쪽 벽 변색(crack/stain) 오탐 — 실제 바스켓은 cx≈0.65인데 HSV는 cx=0.270
→ area 단일 기준도 완벽하지 않음. 큰 벽 얼룩은 area를 통과할 수 있음
PG2 40.0% → PG2+HSV(n=6 제외) 42.4% (36/85)
최종 결론 — HSV 자동 라벨링은 보류, 수동 시각검증 필수
area 기준 필터로 1차 오탐(cx>0.85 휴리스틱)은 크게 줄였지만, n=6처럼 큰 면적의 배경 잡음(벽 얼룩)도 area 기준을 통과할 수 있음을 확인 — 즉 단일 수치 임계값(cx든 area든)으로 100% 신뢰 가능한 자동 필터는 없음. 가장 신뢰도 높은 신호는 "area 충분히 크다 + 인접 프레임들과 cx가 일관되게 클러스터링"(n=26-28, n=84-85처럼) 인데, 이마저도 n=39~46처럼 PG2 자체가 8연속으로 동일한 오탐을 내는 경우엔 무력화됨(위 S7 근접-미스 섹션 참조).
→ 결론: HSV/classical 검출기로 PG2 fallback을 일괄 자동 보강하는 것은 보류. 다음 단계는 GroundingDINO 등 학습 기반 검출기로 독립 교차검증하거나, 소량 프레임을 수동 라벨링해 PG2 LoRA 파인튜닝 데이터로 사용하는 것.
세션별 유효율 진행 (패치 누적)
⚠️ 세션마다 길이가 다름(24~115프레임, 수동 정지) — 이 %는 절대 벤치마크가 아니라 패치 전후 경향 비교용. 같은 세션 안에서도 거리·구간별로 검출력이 크게 달라짐(아래 거리 구간별 분석 참조).
S1/S2
0.4% imgmsg_to_cv2 버그 → 빈 이미지
S3
42.9% 카메라 버그 수정 직후 첫 세션
S4
29.2% full/xfull/tiny 포함 — 4종 필터 前
S5
33.9% 4종 필터 적용 후 (+4.7%p)
S6
51.4% PNG + temporal N=3 (+17.5%p)
S7 ★
40.0% 同 패치 — 세션별 변동(−11.4%p), 근접-미스 신규 발견
S8 ★
34.0% mix-448 (224→448, −17.4%p) — 가설 반증, latency도 악화
패치 완료 상태 (2026-06-18 기준)
항목 상태 세션 확인
compressed_imgmsg_to_cv2 버그 수정 ✅ 완료 S3 이후 fast=0
area>0.9 full-frame 필터 ✅ 완료 S6 FULL=0
area<0.01 tiny noise 필터 ✅ 완료 S6 TINY=0
x1<0.02 & x2>0.98 xfull 필터 ✅ 완료 S6 XFULL=0
cy<0.35 상단오탐 필터 ✅ 완료 S6 TOP=0
PNG 인코딩 (JPEG 이중압축 제거) ✅ 완료 S5 이후 적용
temporal N=3 goal_near 필터 ✅ 완료 GOAL_CONSEC_FRAMES=3, strict
실로봇 closed-loop 재테스트 🔲 대기 전체 패치 완료 → 다음 단계
근접-미스 bbox 필터 (S7 신규 발견) 🔲 미착수 f39~46 — 4-filter 통과하지만 바스켓 아닌 빈 공간 박싱
S6 거리(area proxy) 구간별 분석 — 단일 비율보다 의미있는 지표
6
근접 (area≥0.25)
cx평균 0.638 (우측 치우침)
27
중간 (0.05≤area<0.25)
cx평균 0.499 (중앙)
21
원거리 (0.01≤area<0.05)
cx평균 0.518
51
미검출(fallback)
50건 giant-bbox + 1건 진짜 없음
시간 흐름 narrative (실제 프레임 확인 후 정정): #1~50 바스켓 접근 중 (area 0.04→0.245, 검출 안정적) → #21~30 근접 피크(area 0.245, cx 0.638 우측) → #56~94 정지 장면 풀프레임 환각 41프레임 (카메라 거의 고정, 바스켓 또렷이 보이는데도 동일 collapse 반복) → #95 카메라 이탈(진짜 미검출) → #96~105 재검출.
결론: 근접 여부와 무관하게 특정 정적 장면에서 PG2가 deterministic하게 무너지는 게 핵심 약점이지 전체 유효율 숫자가 아님. 거리 조건만으론 재현 안 됨 — 장면/각도 의존적 실패라서 LoRA 파인튜닝 시 다양한 정지 자세 데이터도 포함해야 함.
결론 (2026-06-18 최종)
완료된 것
  • 카메라 decode 버그 수정 → fast=0 ✅
  • PG2 bbox 필터 4종 → 노이즈 bbox 완전 차단 ✅
  • PNG 인코딩 → 학습/추론 이미지 조건 일치 ✅
  • temporal N=3 → goal_near false positive 차단 ✅
  • 유효율 0.4% → 51.4%
  • async 10Hz 연속 이동 (bang-bang 제거) ✅
다음 단계
  • 실로봇 closed-loop 재테스트 — 전체 패치 통합 후 첫 네비게이션
  • goal_near 발동 확인 — area≥0.25 연속 3프레임
  • NO_BBOX 41연속 원인 파악 ✅ — 정지 장면 풀프레임 환각(거리 무관), 시야이탈/초근접 아님
  • PG2 파인튜닝 시 정지 자세·다양한 각도 데이터 포함 — 장면 의존적 불안정성 보강
  • 근접-미스 bbox 대응 (S7 신규) — 기하학적으로 정상이지만 바스켓이 아닌 위치를 박싱하는 경우 차단 필요
  • HSV classical 검출기 교차검증 보류 → GroundingDINO 등 학습기반 검출기 검토

S4 유효 bbox 실제 분석 — "13/24 정상"은 과장

area 0.01~0.95 필터를 통과한 13건을 x1/x2/y1/y2 좌표 기준으로 재분류. 통과한 레코드 중 절반 가까이가 x 방향 full-width collapse — 실질 신뢰 bbox는 7건.

S4 유효 판정 13건 좌표 상세 (area 0.01–0.95)
n area cx cy x1 x2 y1 y2 판정
1 0.4815 0.498 0.758 0.000 0.995 0.516 1.000 🔴 X-FULL-WIDTH
3,4 0.4514 0.498 0.773 0.000 0.995 0.546 1.000 🔴 X-FULL-WIDTH
16 0.5506 0.498 0.723 0.000 0.995 0.447 1.000 🔴 X-FULL-WIDTH
21,22 0.5054 0.500 0.747 0.000 1.000 0.495 1.000 🔴 X-FULL-WIDTH
9 0.2581 0.603 0.411 0.326 0.879 0.178 0.645 ✅ 신뢰
15 0.0564 0.505 0.603 0.334 0.675 0.520 0.685 ✅ 신뢰
17 0.0741 0.331 0.884 0.171 0.491 0.768 1.000 ⚠️ y2=1 (하단 컷)
18 0.1051 0.518 0.592 0.249 0.787 0.495 0.690 ✅ 신뢰
19,20 0.0779 0.490 0.577 0.253 0.727 0.495 0.659 ✅ 신뢰
24 0.2335 0.552 0.416 0.326 0.777 0.157 0.675 ✅ 신뢰
7
실제 신뢰 bbox
6
X-full-width collapse
(x1=0, x2≈1.0)
5
Tiny (area<0.01)
(노이즈 탐지)
6
Full-frame (area>0.9)
(서버 필터 추가됨)
X-FULL-WIDTH Collapse 원인
x1=0.000, x2=0.995~1.000 패턴 — PG2가 수평 위치를 특정하지 못하고 "x 방향 전체를 bbox로 잡는" 절반 붕괴 상태. x=<loc0000>, x=<loc1023>는 PaliGemma2가 1024-grid 중 경계값을 출력한 것으로, 학습 데이터에서 바구니가 카메라 가까이 있는 상황에서 종종 발생 (area>0.9와 동일한 원인).

cx는 항상 0.498~0.500으로 수렴 — x1=0, x2=1.0이면 cx=(0+1)/2=0.5가 되므로 cx 값이 0.5라는 것 자체가 X-full-width 신호다. 학습 annotation의 경우 이 레코드는 area<0.9 필터를 통과하므로 MLP 학습에 오염됨.
왜 학습 서버와 추론 서버 결과가 다른가 — 항목별 비교
항목 학습 annotation
gen_base_pg2_annotation.py
추론 서버 grounding탭
stage2_v2_inference_server /ground
실제 로봇 추론
dashboard → /predict
이미지 소스 H5 저장 프레임
(수집 시 환경)
ROS 카메라 실시간
(현재 실험실)
ROS 카메라 실시간
(현재 실험실)
이미지 디코더 h5py → numpy (lossless) compressed_imgmsg_to_cv2
S1/S2는 버그(imgmsg_to_cv2)
compressed_imgmsg_to_cv2
api_client_node 기준 올바름
JPEG 압축 횟수 0회
H5 → numpy uint8 lossless (JPEG 없음)
0회
카메라 raw(bgr8) + 대시보드 PNG 인코딩 ✓
0회
PNG 수정 완료 (2026-06-18)
구: JPEG → train/infer 불일치
PG2 모델 base PG2 bfloat16
HF cache 동일 snapshot
base PG2 bfloat16
HF cache 동일 snapshot
base PG2 bfloat16
동일
area>0.9 필터 ✓ 있음 ✓ 추가됨
(2026-06-18 이번 커밋)
✗ 없음
(predict 내부 별도 경로)
area<0.01 필터
(tiny noise)
✓ 있음 ✓ 추가됨
(2026-06-18 4종 패치)
✗ 없음
cy<0.35 필터
(상단 오탐)
✓ 있음 ✓ 추가됨
(2026-06-18 4종 패치)
✗ 없음
x-full-width 필터
(x1≈0 & x2≈1)
✗ 없음
(area<0.9 이면 통과)
✓ 추가됨
→ 6건 필터됨 (n=1,3,4,16,21,22)
✗ 없음
이미지 환경 수집 시 특정 조명·거리 현재 실험실
(조명·거리 다를 수 있음)
현재 실험실
(동일 문제)
실제 동작 여부 bbox_dataset.json 생성 완료 S4: 4종 필터 적용
신뢰 입력 7/24 (29%) — false pos 1건 잔존
09:01 세션: 0% 탐지
(camera decode 버그)
4종 필터 패치 — 2026-06-18 inference-integration 머지 완료 ✅
# stage2_v2_inference_server.py PG2Grounder.run() 내부
if area > 0.9: → ✅ 적용됨 (full-frame collapse)
if area < 0.01: → ✅ 적용됨 (tiny noise)
if cy < 0.35: → ✅ 적용됨 (상단 오탐)
if x1 < 0.02 and x2 > 0.98: → ✅ 적용됨 (x-full-width)
4개 필터 적용 후 S4 기준: 24 레코드 중 신뢰 7건만 통과, 나머지 17건은 fallback(area=0.06, cx=0.5). 미해결: false positive 1건(#17 책상)은 기하 필터로 불가 — temporal N-frame 필터 필요.

S4 전체 24프레임 — Bbox 시각화 Filmstrip

← → 스크롤
OK — 신뢰 bbox XFULL — x방향 전체폭 collapse FULL — area > 0.9 (full-frame) TINY — area < 0.01 (noise)
#1 XFULL  a=0.482
cx=0.498 cy=0.758  |  x0→1.0
#2 TINY  a=0.001
cx=0.499 cy=0.536  |  noise
#3 XFULL  a=0.451
cx=0.498 cy=0.773  |  x0→1.0
#4 XFULL  a=0.451
cx=0.498 cy=0.773  |  x0→1.0
#5 TINY  a=0.001
cx=0.471 cy=0.519  |  noise
#6 TINY  a=0.001
cx=0.471 cy=0.519  |  noise
#7 TINY  a=0.001
cx=0.499 cy=0.519  |  noise
#8 TINY  a=0.001
cx=0.502 cy=0.519  |  noise
#9 OK  a=0.258
cx=0.603 cy=0.412  |  ✅ 신뢰
#10 FULL  a=0.987
cx=0.500 cy=0.494  |  서버 필터됨 ✓
#11 FULL  a=0.998
cx=0.500 cy=0.500  |  서버 필터됨 ✓
#12 FULL  a=0.998
cx=0.500 cy=0.500  |  서버 필터됨 ✓
#13 FULL  a=0.986
cx=0.500 cy=0.494  |  서버 필터됨 ✓
#14 FULL  a=0.986
cx=0.500 cy=0.494  |  서버 필터됨 ✓
#15 OK  a=0.056
cx=0.505 cy=0.603  |  ✅ 신뢰
#16 XFULL  a=0.551
cx=0.498 cy=0.723  |  x0→1.0
#17 OK⚠  a=0.074
cx=0.331 cy=0.884  |  y2=1.0 (하단 컷)
#18 OK  a=0.105
cx=0.518 cy=0.592  |  ✅ 신뢰
#19 OK  a=0.078
cx=0.490 cy=0.577  |  ✅ 신뢰
#20 OK  a=0.078
cx=0.490 cy=0.577  |  ✅ 신뢰
#21 XFULL  a=0.505
cx=0.500 cy=0.747  |  x0→1.0
#22 XFULL  a=0.505
cx=0.500 cy=0.747  |  x0→1.0
#23 FULL  a=0.986
cx=0.500 cy=0.494  |  서버 필터됨 ✓
#24 OK  a=0.234
cx=0.552 cy=0.416  |  ✅ 신뢰

PG2 해상도 업그레이드 검토 — 224 → 448/896 정량 분석

검토중

현재 배포 체크포인트는 paligemma2-3b-mix-224 — 카메라 1280×720 입력을 PG2 내부에서 무조건 224×224로 강제 리사이즈(center-crop/padding 없이 스트레치)한다. 해상도를 올리면 인식이 개선될지, 비용은 얼마나 늘지 숫자로 검토.

체크포인트 이미지 토큰 수 토큰 배수 grounding latency (실측) GPU 메모리 (실측) 출처
mix-224 (배포중) 256 1246~1264ms (soda) / 489ms (GB10) 6.73GB (soda) / 6.14GB (GB10) S6/S7 jsonl 190건 + 로컬 7프레임
mix-448 1024 ~2.1s (soda 실서버) / 858ms (GB10) 6.32GB (GB10) — 224와 거의 동일 S8 세션(n=47) + 로컬 7프레임 ablation
mix-896 4096 (16×) 3B "mix"(downstream 튜닝) 버전 자체가 없음 — pt-896(순수 사전학습)만 존재, <loc> grounding 포맷 보장 안 됨 → 미시도
핵심 실측 발견 (2026-06-20): 같은 7개 프레임(S6 baseline/dead-zone×3, S7 near-miss×2, S7 correct)을 224/448로 각각 추론한 결과 bbox(area/cx)가 거의 동일했다 — 예: S6 n=56 224(a=0.218,cx=0.289) vs 448(a=0.218,cx=0.290), S7 n=39 224(a=0.078,cx=0.685) vs 448(a=0.078,cx=0.689). 해상도를 올려도 PG2가 보는 "정답"은 거의 안 바뀜. latency는 224 대비 GB10에서 ~1.75배(489→858ms, 토큰 4배인데 비용은 그보다 덜 늚), 메모리는 +0.18GB뿐로 이전 추정(4~16배 latency, +6GB 메모리)보다 실제로는 훨씬 가벼웠음. 하지만 soda 실서버 배포(S8) 결과 정확도는 오히려 하락(51.4%→34.0%) — 비용은 추정보다 가벼웠지만 효과가 없다는 게 최종 결론.
⚠️ 가장 중요한 제약 — soda(Jetson Orin) 메모리 여유가 거의 없음
15GB
전체 통합 메모리 (Orin)
13GB 사용중
현재 (mix-224 + dashboard 등)
1.1GB
남은 여유 (free)
현재도 PG2-3B(mix-224)만으로 6.73GB를 쓰고, dashboard/기타 프로세스 포함 시스템 전체가 13/15GB. mix-448은 이미지 토큰 4배(256→1024) → 비전 인코더 activation + LLM KV-cache가 더 필요해 현재 free 1.1GB로는 부족할 가능성이 높음 — 다른 프로세스(gradio dashboard 등) 종료 후 테스트 필요. mix-896(16배)은 이 Jetson Orin 사양에서는 OOM 가능성이 매우 높아 비현실적.
✗ 실측 결과 (2026-06-20, minum 서버) — mix-448 동시 로드 시 Jetson 통째로 재부팅
운영 서버(stage2_v2_inference_server.py, mix-224, 6.73GB)를 켜둔 채로 test_pg2_resolution.py로 mix-448(5.7GB)을 추가 로드 시도 → 두 번 모두(기본 로드 / low_cpu_mem_usage=True + device_map 수정 버전) 동일하게 시스템 재부팅 재현. uptime 확인으로 OOM 추정 확정 — "free 1.1GB로는 부족할 가능성이 높음" 추정이 실측으로 검증됨. mix-896은 448에서 이미 죽었으므로 시도하지 않음(더 위험). 운영 서버는 재시작 후 정상 복구(GPU 6.728GB).
다음 시도 시 필수 순서: ① 운영 서버(port 8001) 먼저 종료 → ② free -h로 메모리 확보 확인 → ③ mix-448 단독 로드 테스트 → ④ 성공 시 latency/메모리 실측 후 표 갱신 → ⑤ 운영 서버 재시작. 운영 서버를 켜둔 채로 재시도하면 또 재부팅된다.
검증 절차 — 전부 완료
  1. 운영 서버 종료 후 mix-448 단독 로드 — 성공 (동시로드 시 크래시했던 것과 달리 단독 교체는 정상 로드)
  2. mix-448로 운영 서버 재기동 → 실로봇 데이터 수집(S8 세션, n=47) → 유효율 34.0% (224의 51.4%보다 하락), latency ~2.1s/프레임
  3. S8 유효 검출 6건 스폿체크 — 6/6 전부 실제 바스켓 위치와 불일치 (근접-미스 패턴 재현)
  4. 로컬(GB10) 독립 ablation — 같은 7프레임(S6/S7 실패+정상 케이스)을 224/448로 직접 비교 → bbox가 거의 동일하게 나옴(위 표 참조), S8 결과를 독립적으로 재확인
최종 결론: 해상도 업그레이드(224→448)는 비용은 예상보다 가벼웠지만(latency +75%, 메모리 +3%) 효과가 없었다 — PG2가 보는 "정답"이 해상도와 무관하게 거의 동일하므로, 근접-미스/풀프레임 환각은 해상도 문제가 아니라 PG2가 우리 환경(회색 바스켓, 특정 거리/각도)에 충분히 파인튜닝되지 않은 문제로 추정. 다음 단계는 GroundingDINO 등 다른 검출기 검토 또는 소량 수동 라벨링 기반 PG2 LoRA 파인튜닝.
S8 — mix-448 단독 로드 실측 (17:44~17:48, n=47) — 가설 반증
신규
gnd_20260620_174429.jsonl — 운영 서버(mix-224)를 내리고 동일 설정(VLA_S2V2_STAGE1/STAGE2, head=mlp, STOP=proximity)에서 VLA_PG2_PATH만 mix-448로 교체해 재기동 — 224 baseline과 apples-to-apples 비교. env 직접 확인(/proc/<pid>/environ)으로 다른 설정 변경 없음을 검증함.
34.0%
유효율 (16/47)
↓ S6 51.4%보다 낮음
12
풀프레임 환각(fallback 31건 중)
224의 정지-환각과 동일 패턴
6/6
스폿체크 — has_bbox=true인데 오탐
⚠ 검증한 6건 전부 위치 불일치
~2.1s
latency/프레임 (콜드스타트 제외)
10Hz 제어 루프엔 비현실적
⚠️ "토큰 수가 늘면 디테일을 더 본다" 가설 반증 — has_bbox=true 6건 스폿체크 전부 오탐
4-filter를 통과해 "유효"로 표시된 검출 6건(n=7,8,20,27,37 + 1건)을 직접 프레임과 대조한 결과 전부 바스켓과 무관한 위치였다 — 빈 바닥/벽(n=7,27), 노트북+우산 리플렉터가 있는 책상(n=20, HSV 테스트에서도 동일 오탐이 나온 가구), 바스켓 위쪽 빈 벽(n=8,37). 기하학적으로는 정상적인 박스(너무 크지도 작지도 않음)라 4-filter로는 걸러지지 않음 — S7의 "근접-미스" 문제가 448에서도 그대로 재현되며 개선되지 않음.
n=7 — bbox(녹색)는 빈 바닥, 바스켓은 우측 별도 위치
cx=0.50 area=0.097 — 필터 통과(오탐)
n=20 — bbox가 책상/노트북/우산 리플렉터를 덮음, 바스켓은 좌측 끝
cx=0.68 area=0.532
n=1 — fallback 예시: 정지 장면 풀프레임 환각(224와 동일 패턴), 바스켓은 좌측에 또렷
전체 47프레임 보기 ← → 스크롤
결론 — mix-448 업그레이드는 이번 실측에서 정확도를 개선하지 못했다. 유효율은 224(51.4%, S6)보다 오히려 낮고(34.0%), latency는 ~2초/프레임으로 224보다 훨씬 느리며, "유효"로 표시된 검출조차 스폿체크한 6건 전부 실제 바스켓 위치와 불일치했다. 해상도 업그레이드가 근접-미스/풀프레임 환각 문제를 해결한다는 가설은 이 표본에서 반증됨 — 다음 단계는 GroundingDINO 등 다른 아키텍처 검토 또는 소량 수동 라벨링 기반 PG2 LoRA 파인튜닝.

학습 vs 추론 파이프라인 — 플로우 비교

학습 Annotation 파이프라인
gen_base_pg2_annotation.py
STEP 1 — 이미지 소스
H5 파일 → h5py numpy direct
lossless, 수집 시 환경 그대로
STEP 2 — PG2 입력
BGR→RGB 변환 후 PaliGemma2 detect gray basket
lossless — H5 numpy uint8 직접 (JPEG 없음)
STEP 3 — <loc####> 파싱
y1,x1,y2,x2 → 좌표 정규화
STEP 4 — 필터 3종 ✅
PASS cy < 0.35 → REJECT (상단 오탐)
PASS area < 0.01 → REJECT (tiny noise)
PASS area > 0.90 → REJECT (full-frame)
STEP 5 — X-FULL WIDTH
MISS x1<0.02 & x2>0.98 → ? (미적용)
area 0.45~0.55로 위 필터 통과 → 학습 데이터 오염
bbox_dataset.json
794 frames / 45 episodes
⚠ X-FULL WIDTH 포함 가능성
실시간 추론 파이프라인
stage2_v2_inference_server.py /ground + /predict
STEP 1 — 이미지 소스
ROS 카메라 → sensor_msgs/Image (bgr8)
raw 전송 (CompressedImage 아님) — 현재 실험실 조명·거리
STEP 2 — 디코딩
compressed_imgmsg_to_cv2 → BGR→RGB
✓ 수정 완료 (S1/S2는 imgmsg_to_cv2 → blank image)
PNG 인코딩 — JPEG 이중압축 제거 ✓ (2026-06-18)
STEP 3 — PG2 입력
PaliGemma2 detect gray basket
~1285ms (정상) / ~365ms (blank → <eos>)
STEP 4 — 필터 현황 (4종 모두 적용 ✅)
PASS cy < 0.35 → REJECT 추가됨 ✓
PASS area < 0.01 → REJECT 추가됨 ✓
PASS area > 0.90 → REJECT 추가됨 ✓
STEP 5 — X-FULL WIDTH
PASS x1<0.02 & x2>0.98 → REJECT 추가됨 ✓
S4 6건(n=1,3,4,16,21,22) fallback 처리 완료
MLP Stage2 입력
cx, cy, area, has_bbox → goal_near 판단
4종 필터 적용 후 신뢰 입력: 7/24 (29%)
미해결: false pos #17 (temporal 필터 필요)
필터 패치 적용 완료 (stage2_v2_inference_server.py) — 2026-06-18 inference-integration 머지 ✅
# PG2Grounder.run() 내부 — locs 파싱 후
y1, x1, y2, x2 = locs[:4]
x1, x2 = min(x1, x2), max(x1, x2)
y1, y2 = min(y1, y2), max(y1, y2)
area = (x2 - x1) * (y2 - y1)
cx, cy = (x1 + x2) / 2, (y1 + y2) / 2

✓ 적용됨
if area > 0.9:
    return fallback  # full-frame collapse
✓ 적용됨
if area < 0.01:
    return fallback  # tiny noise
✓ 적용됨
if cy < 0.35:
    return fallback  # 상단 오탐 (바구니가 상단에 있을 수 없음)
✓ 적용됨
if x1 < 0.02 and x2 > 0.98:
    return fallback  # x-full-width collapse
S6 — CL Pipeline Simulation
S6 전체 105프레임 · 실제 CL 파이프라인 재현
2026-06-19 · gnd_20260618_172621.mp4 1fps 추출 → POST /reset → /predict × 105 순차 호출 · temporal N=3 history 누적 · 실제 배포와 동일 코드 경로
f024
Learned STOP 발동 프레임
→ 이후 전 프레임 STOP latch
23
접근 구간 (FWD+R / FORWARD)
basket 추적 중
0
PROXIMITY STOP (area≥0.25)
근접 임계 미달 — 충분히 가깝지 않음
51.4%
PG2 유효 감지율 (54/105)
area 0.06~0.16 (중거리)
FWD+R (basket 우측, 우회전 접근) FORWARD (basket 정면) STOP (latch) f024 — STOP 최초 발동 NO_BBOX
CL 파이프라인 시뮬레이션 분석
f001 ~ f023 — 접근 구간 (23초)
  • FWD+R 14회 + FORWARD 9회: basket을 우측에서 추적하며 접근
  • bbox area 0.06~0.16 (중거리) — 항상 유효 감지
  • cx 0.52~0.60: basket이 중앙~우측에 위치
  • PROXIMITY STOP 조건(area≥0.25) 미달 — 가깝지 않음
f024 — Learned STOP 발동 ⚡
  • 액션 모델 class 0 (STOP) 예측 → stop_latched=True
  • area=0.073, cx=0.539 — 여전히 중거리, PROXIMITY 조건 미충족
  • 8-frame window에 누적된 접근 패턴이 STOP 트리거
  • f025~f105: latch 지속 (bbox 유무 무관하게 STOP 유지)
실로봇 CL 배포 시 예상 동작: 로봇은 f024 (24초) 시점에 멈췄을 것. PROXIMITY STOP(area≥0.25)은 한 번도 발동되지 않음 — 로봇이 충분히 가깝게 접근하기 전에 액션 모델이 먼저 학습된 STOP을 선택. → 다음 실로봇 테스트 핵심 관찰: Learned STOP vs Proximity STOP 중 어느 쪽이 먼저 발동하는가.
PG2 Offline Re-evaluation
신 서버(4-filter) 기준 전 세션 재평가
2026-06-19 · S4 24 JPEG + 4개 MP4(1fps) → /ground API 재호출 · do_sample=False 결정론적
S6 51.4% — 오프라인 재평가에서 완벽 재현
원래 기록: gnd_172556.jsonl 105프레임 → 54/105 OK (51.4%) · 재평가: gnd_172621.mp4 1fps 105프레임 → 54/105 OK (51.4%) · 100% 일치 — PG2 그라운딩 결정론적 재현 확인
S4 24 JPEG — 구 서버 vs 신 서버(4-filter) 비교
구 서버 (S4 당시 · 필터 없음)
24/24
has_bbox=True — 전부 통과
XFULL 6개 · FULL 7개 · TINY 6개 · OK 5개
→ 실제로는 노이즈 100% (구 서버는 필터 없음)
신 서버 (4-filter 적용)
6/24 (25%)
4-filter 통과 · 노이즈 75% 제거
XFULL→차단 6 · FULL→차단 7 · 나머지 일부 통과
→ IoU 평균 0.081 (위치 불일치 — 구 서버와 감지 패턴 다름)
프레임별 비교 요약 (일부)
n 카테고리 구 서버 area/cx 신 서버 area/cx 결과
09OKa=0.258 cx=0.603a=0.012 cx=0.041⚠ IoU=0.00 — 다른 객체 감지
10FULLa=0.987 cx=0.499FULL필터 → 차단✅ 노이즈 차단 정상
01XFULLa=0.481 cx=0.498XFULL필터 → 차단✅ 노이즈 차단 정상
24OKa=0.234 cx=0.552a=0.109 cx=0.494⚠ IoU=0.45 — 근접 감지
* has_bbox 일치율 25% (6/24) · IoU 평균 0.081 · area 오차 평균 0.245 · cx 오차 평균 0.266
→ 구 서버와 신 서버는 같은 이미지에서 다른 bbox를 출력. 4-filter 패치 이후 PG2 동작 패턴이 변경됨을 확인.
MP4 세션별 재평가 — 신 서버 기준
gnd_152630 · S4구간
29.2%
7/24 OK · 17 NO_BBOX
원래 기록(구 서버): 전부 XFULL/FULL/TINY로 필터됨 → 유효 0%
신 서버 재평가: 29.2% 유효
gnd_163535
27.7%
13/47 OK · 34 NO_BBOX
f003~f007: 연속 OK 구간 (cx≈0.60~0.71)
f021~f022: OK 클러스터
f025~f028: OK 클러스터
gnd_165212
32.7%
16/49 OK · 33 NO_BBOX
f001~f007: 초반 연속 OK 구간
f013~f014: OK 클러스터
중반 이후 NO_BBOX 우세 → 로봇 이탈 구간 추정
gnd_172621 · S6 ✓
51.4%
54/105 OK · 51 NO_BBOX
원래 기록: 51.4% ✓
재평가: 51.4% — 완벽 일치
f086~f094: 빠른 경로(~1320ms) — 바구니 부재 구간
오프라인 재평가 결론