개발 일지/자율주행 개발일지

자율주행 개발일지 04

Woouuk 2026. 5. 31. 20:15

또 다시 문제가 발생했다!! ㅎㅎ,

 

기본적으로 pi0-FAST는 CE로 출력을 뽑는데, 이게 fine-tuning하면서 출력 시 10개의 waypoint가 아닌, 하나의 waypoint로 출력되는 문제가 발생했다..! (근데 왜 앞전의 poc 단계에서는 10개를 뽑았을까? 이건 도저히 모르겠다,, 나중에 교수님께 여쭤보던가 해야지. 혹시 아는 분 계시면 댓글좀..)

 

위와 같이 출력된다..

 

그래서 부득이하게 pi0.5로 전환했다. 코드 다시 짜기 힘들다,,

 

이후 이번에는 poc 단계에서 10개의 waypoint가 찍히는 것을 확인하고, 1000개의 에피소드를 필터링해 각 앞의 2hz씩, 약 38프레임씩 총 38000 프레임을 10epoch 학습시켰다. 소요시간은 무려 30시간..! 가난한 학생은 어쩔수 없지 싶다.

 

그래서 하루 정도 휴식 시간을 갖기로 하고, 돌아와서 확인한 결과는,

 

 

 

 

 

 

 

 

 

 

 

실망스러웠다.. ㅠㅠ

 

 

위와 같이 궤적을 어느 정도 잘 추론한 경우도 있었지만 (최우측 그래프는 좌우를 좀 더 벌려놓은 것이다.)

 

 

이렇게 trajectory를 전혀 예측하지 못한 경우도 있었다.

데이터들을 쭉 살펴보며 무슨 차이가 있나 봤더니 로봇 팔을 학습시킨 것을 생각했을 때, 특정 에피소드의 instruction을 넘겨주면. 예를 들어 "두 팔을 들어 컵을 집어라 "라고 했을 때 만약 camera image 상 두 팔을 이미 든 상태라면 instruction에서 '두 팔'의 가중치를 낮게 주게 된다. 이런 식으로 출력인 action을 chunk 형태로, 사이클마다 주게 될 것이고 이에 맞게 로봇이 action을 취하는 것이다.

 

하지만 어쩐 이유에선지 위의 추론하지 못한 상황을 예로 들면 "직진한 후 우회전해라"에서 이제 우회전해야 하는 상황인데, '직진한'에 낮은 가중치를 주지 못한 것으로 보인다. 그래서 정말정말 마지막으로, 각 에피소드를 앞의 2hz씩 자르는 것이 아닌 1000개의 에피소드의 시작하는 첫 프레임만 가지고, 1000개의 데이터로 학습시켜보기로 했다. 

 

 

 

-> 학습 결과

 

큰 변화는 없었다. 아니, 애초에 에피소드 index가 전혀 다른 상황이 아니라 연속적인 주행에서 촬영한 데이터셋인듯 하다.

그래서 앞전의 결과와 거의 동일하므로, 따로 결과사진을 올리진 않겠다.

다만 Loss는 줄어들었는데, minADE와 minFDE가 전혀 줄어들지 않는다. 아무래도 내가 설계한 학습 파이프라인 자체가 collapse를 유발하는 형태로 보인다. 이를 어떻게 고치면 좋을지는 좀 더 딥하게 아는 분들의 자문이 필요할 듯 해서, 교수님께 자문을 구하고 와야겠다..

 

우선 pi0 모델을 사용하여 차량의 미래 주행 궤적을 예측해내는 프로젝트는 여기서 마치도록 하겠다. 

 

이 프로젝트를 통해

 

- 데이터 전처리와 정제 작업의 중요성

- 데이터를 시각적으로 처리하고 남겨두는 것

- 입력값과 출력값의 관계의 정합성의 중요성

- poc 단계의 중요성

에 대해 깨달았다. 뭔가 하다보니 좀 더 학구열이 생기는데, vla 모델을 좀 더 깊게 파보고 다시 학습시켜보도록 하겠다.

 

 

--- 추가 업데이트

 

codex와 씨름한 결과 이렇다고 한다.

 

전제가 일부 잘못됐고, 현재 세팅의 pi0.5는 waypoint predictor로 거의 "평균 궤적"을 내는 상태이다. 

train mean trajectory baseline on val을 보면, ADE = 10.97, FDE = 22.98

최종 모델의 1250 step(마지막 스텝)을 보면 ADE = 10.97, FDE = 21.07 

zero-baseline: ADE = 50.27, FDE = 93.66

 

즉, 모델은 zero보다는 훨씬 낫지만 train set의 평균 baseline과 거의 동일하다. 그래서 로스는 감소했지만 FDE와 ADE는 줄지 않는 것.

모델이 조건부로 장면을 읽고 궤적을 잘 예측한다기 보다, 대충 앞으로 8~90m를 가는 평균 패턴을 학습한 쪽에 가깝다,,

 

이런 일이 생긴 이유로는

1. loss와 metric이 서로 다른 vector이다. (다른 공간을 본다)

학습 loss는 quantile-normalized된 [10, 32] action denoising/regression loss인데 나는 [x, y] waypoint를 32차원에 각각 반반씩 넣었고, 추론 때 다시 평균을 냈다. 이 구조에서는 loss가 줄어도 실제 ADE/FDE가 줄지 않을 수 있다. 실제로, action_replica_std_mean은 12.63 -> 2.09로 크게 줄었다. 즉, 32개 replica channel consistency는 좋아졌으나, waypoint 위치 정확도는 별로 안 좋아진 것.

 

2. 평균으로 수렴하기 쉬운 문제이다.

waypoint 예측은 장면/route ambiguity가 크다. MSE류 loss는 불확실할 때 평균 궤적을 선호한다.(즉, 불확실해서 평균 궤적으로 수렴했다는 것..) 최종 예측의 final waypoint 분산도 traget보다 작다. traget final std는 대략 [22.2, 23.7]인데 prediction final std는 [12.0, 11.2]이다. 출력이 덜 다양하고 평균 쪽으로 눌린 상태인 것..

 

3. train/val 분포가 다르다. -> 이것도 중요해보인다,, 데이터 전처리에서 중요해보임!

train은 각 에피소드 첫 프레임 1000개만 사용했다. 그런데 val은 100개 에피소드에서 2Hz로 뽑은 3800개, 즉 중간 frame이 대부분이다. 첫 프레임만 보고 배운 모델을 주행 중간 frame들에 평가하면 평균 궤적으로 버티는 쪽으로 가기 쉽다.

 

4. minADE/minFDE 이름도 지금은 약간 오해의 소지가 있다. (?)

현재 num_sample = 1이라서 minADE/minFDE는 ADE/FDE와 같다. 여러 궤적 샘플 중 best를 고르는 일반적인 minADE/minFDE가 아니다.

 

즉, 현재 pi0.5 + 32D 반복 action encoding + first-frame-only 1000개 + normalized loss 조합은 waypoint 예측에 적합하지 않다. 지금 결과는 모델이 쓸만하거나를 판단하기보다, 평균 baseline에 수렴했다고 봐야 한다..