video 3D pose estimation
이미지에서만 하던 3D Pose estimation에서 한 차원 더 나아가, 영상에서의 3D Pose Estimation에 대해 알아보겠습니다.
가장 쉬운 방법
- 매 프레임마다 단일 이미지에서 inference
- motion blur가 심할 때는 단일 이미지만 보고 3D human pose estimation을 하기가 매우 어려움
- 단일 이미지에서의 3D human pose estimator는 주변 프레임 정보를 활용할 수 없기 때문에,
주변 프레임 정보를 활용할 수 있는 temporal module이(LSTM, GRU, GraphCNN, Transformer, …) 필요
temporal module
- 여러 시간대의 정보를 조합할 수 있는 모듈
- 단일 프레임 + 주변 프레임 정보까지 활용 가능
- 같은 데이터셋이면 비디오를 입력으로 하는 게 당연히 더 높은 성능
- 대신 여러 프레임을 GPU에 올려야 하니 GPU 메모리가 매우 부족해짐
- 비디오 베이스는 보통 10프레임은 기본으로 함
데이터셋
- mocap based : 대부분 automatic annotation 사용
(여러 카메라에서 2d pose 추정하고 그걸 triangulation) - in-the-wild : 대부분 single RGB, data annotation이 매우 어려움
(매 프레임마다 포즈를 annotation해야 하기 때문)
단일 이미지 기반 방법들은 in-the-wild를 추가로 학습에 사용할 수 있기 때문에 비디오보다 더 높은 성능 나옴 - insta variety : 2D pose estimation 결과를 GT로 사용
여러 트릭
- 입력을 이미지 말고 2D pose로 대체(lifting) : 메모리 사용량도 적음
- image feature vector를 disk에 저장해두고 로드하는 방식 (TCMR에서도 사용).
ResNet : Global Average Pooling해서 2048 vector로 만들고 디스크에 저장한다.
학습 시 추출한 feature를 입력으로 받는다. (end-to-end 학습 불가, data augmentation 불가한 단점)
TCMR (2021)
- 기존 방식의 문제점 : 기존의 방식들은 static feature에 크게 의존하기 때문에 영상에서 떨림(jittering) 현상 발생
- TCMR : 같은 에러가 나더라도 temporal data 사용하면, 전후프레임과 비슷한 에러의 방향이라 보기좋음
- 영상을 입력으로 받고, ResNet으로 feature 추출해서 disk에 저장한다.
3개의 temporal encoder가 있어서, temporal feature를 추출한다.
- poseForecast#1 (위 그림의 상단 영역, g_past)
현재 프레임의 이전 프레임들을 입력으로 받아서, past frame들로 부터 온 feature를 만든다.
> 과거만 보고 미래가 뭐였을지 예측한다. - 현재 feature (위 그림의 중간 영역, g_all)
> temporal encoder에서만 오는 거 사용 (residual connection 미사용) - poseForecast#2 (위 그림의 하단 영역, g_future)
미래 프레임의 전 프레임들 입력으로 받아서, 미래 frame들로 부터 온 feature를 만든다
> 미래만 보고, 과거가 뭐였을지 예측한다.
- 위 3개의 모듈을 integration (Attention module 사용)
- static feature를 봤을 땐 못하지만, temporal feature를 봤을 때 할 수 있는 걸 모델에 강제하면서 static feature에 대한 강한 의존도를 낮췄다.
- pose forecast로 미래 프레임 혹은 과거 프레임으로부터 현재 프레임을 추정하도록, 흐름을 보도록 디자인했다.
pose forecast
- current frame을 없애면, TCMR이 static feature만을 선호하는 걸 방지하고, temporal feature에만 집중할 수록 해서 temporal error(Accel)가 더 감소했다.
- 우측 이미지를 봤을 때, per frame accuracy는 기존 SOTA 대비 약간 개선이 되지만, temporal consitency에는 큰 개선을 했다 (acceleration error).
- VIBE, MEVA는 동작 변화 크면 acc error가 컸음(오른쪽 그림, acc error spikes) : TCMR이 기존 방식보다 효과적이라는 결과
- 보통 average filter를 많이 쓴다. (표-5. window 5개짜리 필터, 에버리지해서 current frame output사용)
: MEVA, TCMR에 적용하면 에러 더 커짐 (contextual information을 고려하지 않기 때문, 무조건 5개 에버리지) - TCMR은 엄청 부드러운 결과 : accel error
Code
https://github.com/hongsukchoi/TCMR_RELEASE/blob/master/lib/models/tcmr.py
- h36m 데이터셋 처리하는 부분인데, read_data_train 메서드에서 extract_feature로 feature를 추출한 뒤, joblib.dump로 파일로 추출한 feature들을 저장하고 있다.
- 위와 같은 소스(h36m_utils.py)인데, feature 추출하는 모델은 SPIN의 pretrained hmr을 사용한다.
- Temporal encoder : GRU 사용
- gru_bef, gru_aft : 이전(before), 이후(after)에 기반한 pose forecast 모듈
- gru_cur : 현재 프레임 기반의 temporal encoder
- x_bef : mid_frame 전까지
- x_aft : mid_frame 이후
- y : temporal feature concat (y_before, y_current, y_after)
- 마지막 integration : attention (코드 상의 scores 부분)
TemporalAttention : softmax하고 score output
- activation의 크기에 기반하여 weighted average하기 위해 attention 사용
- attention score에 기반한 average
참고자료
https://github.com/facebookresearch/VideoPose3D
GitHub - facebookresearch/VideoPose3D: Efficient 3D human pose estimation in video using 2D keypoint trajectories
Efficient 3D human pose estimation in video using 2D keypoint trajectories - GitHub - facebookresearch/VideoPose3D: Efficient 3D human pose estimation in video using 2D keypoint trajectories
github.com
https://arxiv.org/pdf/2011.08627.pdf
https://github.com/hongsukchoi/TCMR_RELEASE
GitHub - hongsukchoi/TCMR_RELEASE: Official Pytorch implementation of "Beyond Static Features for Temporally Consistent 3D Human
Official Pytorch implementation of "Beyond Static Features for Temporally Consistent 3D Human Pose and Shape from a Video", CVPR 2021 - GitHub - hongsukchoi/TCMR_RELEASE: Official Pytorch...
github.com