테스트셋은 라벨·미래 궤적 비공개이며, 학습 데이터(시나리오 단위)와 달리 clip 단위로 제공한다.
참가자는 각 clip을 추론하여 미래 3초 ego 궤적을 하나의 파일로 제출한다.
Test Dataset
각 clip = 예측 시점(현재) 기준 과거 3초 + 현재(10Hz · 31프레임) 관측과, 여기서 파생된 입력들로 구성된다.
camera_* (6개 카메라, 31프레임=현재+과거 3초) - BEV Encoder 입력 (Multi-view Images)
calibration.parquet (intrinsic/distortion/extrinsic) BEV Encoder가 이미지→BEV 변환에 반드시 필요한 카메라 파라미터
ego_pose.parquet (과거 궤적 + frame=0 원점) - Planning Transformer의 Ego Status 입력
ego_pose.parquet의 frame=+50 (5초 목표점) - Planning Transformer에 줄 수 있는 목표 지점(goal)
command.parquet의 command(meta 6종) - UniAD/VAD의 Driving Command("Turn Left" 등)와 동일 역할
command.parquet의 vad_cmd (3-way one-hot) - VAD 논문이 원래 쓰는 3-way 명령 포맷(right/left/straight)
알 수 있는 점은 test 셋은 범용 자율주행 데이터가 아니라,
필드명·포맷이 VAD 전용으로 맞춰져 설계되어 있다는 점이다.
meta 6종과 별개로 vad 논문의 3-way 포맷이 따로 있기 때문이다..
따라서 nuScenes로 사전학습된 VAD model도 바로 추론이 가능하다.
Test
1. Data download
https://drive.google.com/drive/folders/1sP297-8-w9HxOSYlG5jfcaYDro6yclQm
2. Setting
nvidia-smi 확인
Docker Desktop install
https://www.docker.com/products/docker-desktop/
> cd ~/ETRI_Challenge > docker load -i etri-vad_cu128.tar > docker images | Select-String etri-vad |
컨테이너 실행 (powershell ver)
> docker run --gpus all -it --ipc=host ` -v C:\Users\airlab\ETRI_Challenge\ETRI_E2E_Driving_Challenge:/workspace/VAD ` -v C:\Users\airlab\ETRI_Challenge\data:/workspace/VAD/data ` -v C:\Users\airlab\ETRI_Challenge\work_dirs:/workspace/VAD/work_dirs ` -w /workspace/VAD etri-vad:cu128 bash |
clip -> pkl 변환
> python tools/data_converter/etri_test_converter.py \ --test-root data/etri/test --out-dir data/etri --extra-tag vad_etri |
추론 -> 제출 파일 생성
python tools/etri_test_submit.py \ projects/configs/VAD/VAD_etri_base.py \ ckpts/VAD_base.pth \ --ann-file data/etri/vad_etri_infos_temporal_test.pkl \ --out submission.json |
FLOPs 측정
> python tools/measure_flops.py \ projects/configs/VAD/VAD_etri_base.py \ --ann-file data/etri/vad_etri_infos_temporal_test.pkl \ --out submission.json |
Visualization
현재 사용 중인 체크포인트(VAD_base.pth)는 nuScenes 데이터셋(객체 클래스 10종, 맵 클래스 3종)으로 학습된 가중치인데,
ETRI config(VAD_etri_base.py)는 객체 클래스 3종(Vehicle/Pedestrian/Cyclist), 맵 클래스 1종으로 설계되어 있다.
pts_bbox_head.cls_branches와 pts_bbox_head.map_cls_branches의
출력 차원(shape)이 서로 다르고, 체크포인트 로드 시 이 두 레이어는 shape mismatch로 인해
로드에 실패해 무작위 초기화 상태로 남아있으며,
이 랜덤 초기화된 레이어가 그대로 추론에 사용되면서 객체 박스와 맵(차선) 예측이 학습된 정보 없이
무작위에 가까운 값을 출력하기 때문에 시각화 결과에서 박스가 흩어져 있고 맵이 지저분하게 나오는 것이고,
반면 ego 궤적을 예측하는 planning head는 mismatch 경고 목록에 없어 정상적으로 로드되었을 가능성이 높아
궤적만 상대적으로 일관된 형태로 나온 것이다.
따라서 ckpt만 학습 데이터에 맞게 학습하면 아래와 같이 시각화 결과가 나올 것 같다..
첫댓글 1. 베이스라인 모델을 nuscenes 데이터셋으로 선행학습한 가중치로 초기화후 훈련하는게 가능한가요? 위결과보면 데이터 포맷이 안맞는거 같은데 그려면 모델구조도 다른게 아닌지?
2. 훈련시간이 너무 길면 훈련데이터중 테스트데이터셋과 유사한것으로 훈련하는건 어떤지?
1. 데이터 포맷이 다르기 때문에 ETRI 데이터를 VAD가 원하는 텐서 shape(카메라 6장, 특정 해상도, 특정 클래스 라벨 체계)으로 맞춰서 변환할 수 있다면, 모델 구조는 그대로 두고 nuScenes 가중치를 초기화값으로 쓸 수 있습니다.
또한 전체 가중치가 전부 안 맞더라도 mmcv ckpt loader는 shape이 일치하는 레이어만 로드하고, 나머지는 건너뛰도록 설정할 수 있습니다.. Backbone은 거의 그대로 재사용되고, 클래스 관련 head만 새로 학습되는 형태일 것 같습니다.
2. EDA 진행해서 데이터셋 포맷에 meta정보로 구분할 수 있는지 확인해보겠습니다.
베이스라인 모델이 VAD이고 깃허브에서 그대로 가져왔으면 대회 데이터셋도 nuscenes 데이터셋포맷과 동일하게 만든거 아닌가요?
만약 대회데이터셋과 누신데이터셋 포맷이 다르다면 VAD모델의 구조도 깃허브모델에서 변경되었다는 건가요?
대회 데이터셋이랑 nuScenes 데이터셋 포맷은 다릅니다.
nuScenes와 다른 원본 데이터를, VAD 모델이 원래 기대하던 입력 텐서 shape에 맞도록 변환하는 코드가 있는 거라서 데이터 포맷이 nuScenes와 같은게 아니라 VAD 모델의 입력에 맞춘 거라고 보시면 될 것 같습니다..
https://github.com/hustvl/VAD/tree/main/tools/data_converter
기존 VAD에서도 nuScenes 데이터 포맷을 VAD 모델 입력에 맞추는 코드가 있습니다.
바뀐 건 config의 숫자 값(num_classes: 10->3, map_classes: 3->1) 뿐이고, 구조상 config로 변경하도록 설계된 부분이라 원본 코드(모델 구조) 수정 없이 그냥 구분할 클래스 개수만 달라지는 것 같습니다
모델의출력의 형태를 조사할것 언어모델처럼( 단어사전에 있는 모든 단어의 확률을 출력하고 가장높은확률의 토큰을 출력) 가능한 좌표사전을 만들고 각 좌표의 확률을 출력하는지 아니면 회귀모델처럼 좌표를 실수형태로 출력하는지 조사, 코드에서 분석해볼것
논문 상으로는 회귀 방식으로 좌표를 실수형태로 출력하는 형태입니다.
코드 분석해서 추가로 작성하겠습니다.