FlowNet: Learning Optical Flow with Convolutional Networks
저자 : Philipp Fischer, Alexey Dosovitskiy, Eddy Ilg, Philip Hausser, Caner Hazırbas, Vladimir Golkov
출간 : CVPR 2017
주제 : Optical Flow
출처 : 1504.06852.pdf (arxiv.org)
Github : ClementPinard/FlowNetPytorch: Pytorch implementation of FlowNet by Dosovitskiy et al. (github.com)
- 참고하면 좋은 영상
PR-214: FlowNet: Learning Optical Flow with Convolutional Networks - YouTube
: 액기스만 딱딱 잘 정리해서 설명해주십니다.
- 요약
CNN으로 optical flow estimation을 합니다. 충분히 학습을 할만한 데이터가 없어서 Flying Chairs라는 데이터 셋을 만들었습니다. flownet2는 flownet을 여러 방법으로 변형하고 합친 것이기 때문에 본 논문을 이해하면 flownet2까지 수월하게 이해가 될겁니다.
1. Introduction
optical flow estimation은 기존의 CNN과 다르게 픽셀 단위의 정보 뿐만 아니라, 두 이미지 간의 관계를 찾아내야 합니다.
본 논문은 correlation layer를 통해 두 이미지를 matching합니다. 근데 놀랍게도 correlation layer 없이 두 이미지를 concat하여 학습해도 정확도는 비슷하기 때문에 꼭 필요하진 않다고 하네요.
추가로 optical flow estimation은 충분히 큰 데이터셋이 필요하다고 합니다. 그래서 Flying chairs Dataset을 만들었네요.
2. Related Work
Optical flow estimation 분야에서 Variational approach는 Horn-Schunck 알고리즘을 필두로 시작되었습니다. 이외의 다양한 알고리즘들이 있으나, Deep learning을 이용한 end-to-end 방법이 없었다네요. Flownet은 CNN을 사용하여 end-to-end로 만들어진 기술입니다.
그리고 이전의 여러 머신러닝 기법들을 소개하네요.
3. Network Architectures
optical flow estimation은 per-pixel prediction입니다. 따라서 per-pixel prediction을 하는 segmentation, keypoint 등등의 CNN 모델에서 많은 영감을 받았습니다.
coarse to fine 방식을 채택하였습니다. upconvolve(deconvolution) layer로 upsample을 하였고, 결과로 나온 피쳐맵들을 다 concat 했다고 합니다. 자세한건 refinement 부분에서..
- 모델 전체 구조 그림
그림의 상단, FlowNetSimple은 두 이미지를 concat해서 학습하는 모델이고, 하단의 FlowNetCorr은 Correlation layer를 통해 두 이미지를 matching시켜 correspondence를 찾아내서 학습하는 모델입니다.
- Correlation layer
correlation layer는 식 (1)처럼 K의 크기를 가진 patch를 서로 내적합니다.
이미지의 모든 부분을 계산하는 것은 비효율적이므로 displacement라는 숫자를 기준으로 이미지에서 일정 부분만 짤라낸 뒤 patch matching을 하게 됩니다. 전체 correlation은 (w,h)의 크기일 것이고, 한 픽셀마다 displacement 크기 만큼의 계산이 들어가니 (h,w,D,D) --> (h,w,\(D^{2}\)) 이 됩니다. 아래 그림을 참조하세요.
- Refinement
모델 아키텍쳐를 보시면 마지막 아웃풋 전에 초록색으로 refinement 과정을 거칩니다. 기존의 optical flow estimation task들은 large displacement에 대해 잘 잡지 못했었습니다. 본 논문은 coarse to fine 기법을 적용하여 low resolution부터 high resolution까지 결과를 이어 받습니다. 중간에 upconvolution은 deconvolution, 또는 tranposedconvolution이며 필터를 통과하기 전의 크기로 다시 복원하는 layer입니다.
upscaling을 할 때 variational approach 방법을 사용해서 결과를 더 좋게 만들었다고 합니다. 26번 논문(Efficient Closed-Form Solution to Generalized Boundary Detection)의 방법을 사용했다고 하는데 정확히 어떤 방식인지는 저 논문을 봐야할 것 같네요. (image boundaries를 찾아서 smooth 하게 resampling 한다는 내용이네요.) 적용한 결과가 꽤 좋게 보입니다.
4. Training
pass
5. Experiments
정확도는 기존의 알고리즘들과 비슷하지만, 속도가 훨씬 뛰어납니다.
pass
6. Conclusion
본 연구는 optical flow task에서 convolutional network의 가능성을 보여줬습니다. 또한 직접 만든 Flying Chairs Dataset 처럼 인공적으로 만든 데이터셋으로도 본 논문의 결과가 좋았기 때문에 앞으로 더 현실적인 데이터셋이 나왔을 때의 optical flow가 기대 된다고 합니다.
Code 디버깅 :
- 조금 시간이 지난 논문이라 도커로 하는게 좋을 것 같은데 아직은 WSL에서 cuda 지원이 안됩니다. 21H2 패치에서 가능하니 그 땐 되겠네요.
- 그냥 일반적인 환경에서도 디버깅 가능 합니다. 굳이 옛날 쿠다 버전 다시 설치하지 않아도 가능하구요.
- 근데 가장 중요한 correlation layer가 cuda로 코딩되어 있어서 다른 optical flow 기술을 디버깅 해보는게 레이어를 직접 이해하기엔 더 좋아보이네요.
- linux 환경 : 안해봄.(그냥 수월하게 될 것 같음.)
- windows 환경
먼저 코드 실행할 때 cuda로 된 layer들을 따로 설치해야하는데 windows에선 당연히 bash install.sh이 불가능합니다.
(또 cuda 파일들이라 cuda 없으면 안됩니다.)
install.sh 에 있는 코드 따라서, 3개의 레이어마다 폴더 들어가서 설치하시면 됩니다.
단 설치할 때 compiler 문제가 발생하니 아래의 방법을 따라하세요.
1. VS 네이티브 도구 명령 프롬프트 실행
2. set DISTUTILS_USE_SDK=1 입력
3. 각 레이어 폴더 들어가서 setup.py 실행 (python setup.py install --user)
다 설치하고 나서 log찍는 몇몇 예전 함수들만 없애주면 바로 실행 가능합니다.