본문 바로가기
AIML 분야/Depth, Camera Pose, VO, SLAM 등

[Libelas 파이썬 버전] Depth Estimation 하는데 GT가 없을때 사용하는 툴?!

by 포숑은 맛있어 2022. 7. 20.
반응형
Depth Estimation을 하고싶은데 GT가 없어요

몇가지 생각해볼수 있다.

 

1. 뭔가 GT처럼 활용할 수 있는걸 고전 알고리즘으로 뽑고, supervised learning 알고리즘을 활용해 학습

2. 그냥 self/unsupervised learning 할게요

3. transfer learning?

 

이전 포스팅의 Mono-depth-and-Motion이 유사한 상황이다.

- Hamlyn Dataset을 사용

- 그런데 GT depth가 없는 데이터셋

- 그래서 저자는 GT depth를 Libelas Tool을 사용하여 생성했음! (학습은 self-supervised로 하고 GT는 정량적 평가용도로만 썼지만)

 

그런데 Libelas 툴은 C++ 기반인가 그래서 우리 신세대 파이썬 인간들이 쓰기 좀 어렵다.

하지만 역시 누군가가 파이썬 버전을 만들어놨다.

 

Libelas 특징?

  • 이미지 grayscale로 변환해야함
  • 이건 고전적인 스테레오 방식이라 학습 기반이 아닌 것 같음.

 

[삽질 1] 이건 실패했으니 스킵하면 됩니다

https://github.com/PieroV/PyElas

 

GitHub - PieroV/PyElas: Python version of libelas: library for Efficient Large-scale Stereo Matching

Python version of libelas: library for Efficient Large-scale Stereo Matching - GitHub - PieroV/PyElas: Python version of libelas: library for Efficient Large-scale Stereo Matching

github.com

 

 

 

 

git clone 귀찮아서 pip으로 설치하려고 시도했는데 잘 안되었다.

https://lsjsj92.tistory.com/592 이 블로그에서 설명하는 규칙처럼 되어있어야 가능한데, 저기도 setup.py 있긴 하던데 뭐가 안맞나?

 

pip install git+https://github.com/PieroV/PyElas.git      하려는데 에러 발생

 

...

암튼 잘 안되길래 https://github.com/jlowenz/pyelas 이걸로 레포 바꿨더니 해결

 


[삽질 2]

 https://github.com/jlowenz/pyelas 

 

GitHub - jlowenz/pyelas: A simple SWIG-wrapped Python module for the Efficient LArge Scale C++ stereo matching library (http://w

A simple SWIG-wrapped Python module for the Efficient LArge Scale C++ stereo matching library (http://www.cvlibs.net/software/libelas/). - GitHub - jlowenz/pyelas: A simple SWIG-wrapped Python modu...

github.com

 

굿. 이건 빌드 된다.

이제 import 해서 써보자

 

import os
import cv2
import matplotlib.pyplot as plt 
import numpy as np 


import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'pyelas', 'src'))

import elas


gastrec_path = "../kitti/input/2011_09_26/2011_09_26_drive_0001_sync"
ch_names = ["image_02", "image_03"]
fname = lambda x : "data/" + str(x).zfill(10) + ".png"

number = 50

# Images can be loaded with any library, as long as they can be accessed with buffer protocol
left_path = os.path.join(gastrec_path, ch_names[0], fname(number))
right_path = os.path.join(gastrec_path, ch_names[1], fname(number))
print(left_path)
print(right_path)
left = cv2.imread(left_path)
right = cv2.imread(right_path)
print(left.shape)

left_rgb = cv2.cvtColor(left,cv2.COLOR_BGR2RGB)
right_rgb = cv2.cvtColor(right,cv2.COLOR_BGR2RGB)


f, axarr = plt.subplots(2,2)
f.set_size_inches(30, 10)
axarr[0,0].imshow(left_rgb)
axarr[0,1].imshow(right_rgb)

###################
left = cv2.cvtColor(left, cv2.COLOR_BGR2GRAY)
right = cv2.cvtColor(right, cv2.COLOR_BGR2GRAY)

disp_left = np.empty_like(left, dtype=np.float32)
disp_right = np.empty_like(right, dtype=np.float32)

params = elas.Elas_parameters()
params.postprocess_only_left = False
elas = elas.Elas(params)
elas.process_stereo(left, right, disp_left, disp_right)

scaled_depth_left = (disp_left / np.amax(disp_left) * 255.0).astype(np.uint8)

axarr[1,0].imshow(disp_left)
axarr[1,1].imshow(disp_right)

plt.savefig("my_tools/kitti.png")

 

대략 이정도 성능

 

grayscale인데다 딥러닝도 아닐테니까 안좋을줄 알았는데 생각보단 괜찮은 듯

그래서 Mono-depth-and-motion에서 이걸 가지고 GT를 만들었나봄.

반응형

댓글