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
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)
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)
카메라 버그
원인
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% 빈 이미지
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
5
TINY (area<0.01)
4-filter 未적용
3
near-goal
n=5,11,13 비연속
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 전멸
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)
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
노이즈 bbox
tiny/full/xfull 전멸
0.687
area 최대 (근접)
avg 0.093 · cx 0.522
1264ms
평균 latency
전부 정상 PG2 추론
OK BBOX AREA 분포 (54건)
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는 "이상한 크기/위치"는 걸러내지만 "그럴듯하지만 틀린 위치"는 못 걸러냄 — 다음 우선 보완 대상.
OK BBOX AREA 분포 (34건)
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 |
✅ 신뢰 |
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 필터 필요.
PG2 해상도 업그레이드 검토 — 224 → 448/896 정량 분석
검토중
현재 배포 체크포인트는 paligemma2-3b-mix-224 — 카메라 1280×720 입력을 PG2 내부에서
무조건 224×224로 강제 리사이즈(center-crop/padding 없이 스트레치)한다. 해상도를 올리면 인식이 개선될지, 비용은 얼마나 늘지 숫자로 검토.
| 체크포인트 |
이미지 토큰 수 |
토큰 배수 |
grounding latency (실측) |
GPU 메모리 (실측) |
출처 |
| mix-224 (배포중) |
256 |
1× |
1246~1264ms (soda) / 489ms (GB10) |
6.73GB (soda) / 6.14GB (GB10) |
S6/S7 jsonl 190건 + 로컬 7프레임 |
| mix-448 |
1024 |
4× |
~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) 메모리 여유가 거의 없음
13GB 사용중
현재 (mix-224 + dashboard 등)
현재도 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/메모리 실측 후 표 갱신 → ⑤ 운영 서버 재시작.
운영 서버를 켜둔 채로 재시도하면 또 재부팅된다.
검증 절차 — 전부 완료
- ✅ 운영 서버 종료 후 mix-448 단독 로드 — 성공 (동시로드 시 크래시했던 것과 달리 단독 교체는 정상 로드)
- ✅ mix-448로 운영 서버 재기동 → 실로봇 데이터 수집(S8 세션, n=47) →
유효율 34.0% (224의 51.4%보다 하락), latency ~2.1s/프레임
- ✅ S8 유효 검출 6건 스폿체크 — 6/6 전부 실제 바스켓 위치와 불일치 (근접-미스 패턴 재현)
- ✅ 로컬(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와 동일 패턴), 바스켓은 좌측에 또렷
결론 — 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 |
결과 |
| 09 | OK | a=0.258 cx=0.603 | a=0.012 cx=0.041 | ⚠ IoU=0.00 — 다른 객체 감지 |
| 10 | FULL | a=0.987 cx=0.499 | FULL필터 → 차단 | ✅ 노이즈 차단 정상 |
| 01 | XFULL | a=0.481 cx=0.498 | XFULL필터 → 차단 | ✅ 노이즈 차단 정상 |
| 24 | OK | a=0.234 cx=0.552 | a=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) — 바구니 부재 구간
오프라인 재평가 결론
- PG2 결정론적 확인 — S6 51.4%가 오프라인 재평가에서 정확히 재현.
do_sample=False로 동일 이미지 → 동일 결과 보장.
- 4-filter 유효성 입증 — S4 구 서버(필터 없음)에서 24/24 노이즈 통과 → 신 서버 재평가 시 75% 차단. XFULL 6개 + FULL 7개 정상 차단.
- 구 서버와 신 서버의 bbox 불일치 — 같은 이미지에서 IoU 평균 0.081. 4-filter 패치 전후 PG2 동작 패턴 변화 확인.
- 세션별 유효 감지율 — 신 서버 기준: S4≈29%, 163535≈28%, 165212≈33%, S6≈51%. S6이 가장 높은 이유: 조명/각도/거리 조건이 PG2에 유리한 세션.