在電腦視覺相關的研究中,我們常常需要在一些公開的數據集上做實驗,這樣才能確保我們的演算法是可以與其他人的研究成果進行比較的,並且提供他人驗證我們提出的方法的機會。
舉例來說,在 3D 重建和相機姿態估計的研究問題上,常常被拿來使用的有 TUM RGB-D Dataset 數據集,和 ScanNet 數據集。這些數據集包含了 RGB-D 圖像,以及相機的姿態資訊,可以拿來訓練,或是測試我們的演算法正確性。
在接下來的介紹與實作中,我們會使用 TUM RGB-D Dataset 作為範例。
首先我們要來下載數據集,這裡我們選擇 Freiburg2 Desk 這個場景作為範例 [連結] 。
以下是該場景的一些圖片,基本上這個相機沿著桌子的周圍拍了一圈,總共含有大約 3000 張圖片。
解壓縮後,我們可以看到以下的資料夾結構:
rgbd_dataset_freiburg2_desk/
├── rgb/ # RGB 圖像
├── depth/ # 深度圖像
├── rgb.txt
├── depth.txt
├── groundtruth.txt # 相機的姿態
└── accelerometer.txt # IMU 相關資訊
其中,rgb.txt
列舉了每一幀的 timestamp 和 RGB 圖像檔名,類似像這樣:
# Timestamp filename
1311868165.199145 rgb/1311868165.199145.png
1311868165.231193 rgb/1311868165.231193.png
1311868165.263005 rgb/1311868165.263005.png
其中 groundtruth.txt
也是按照這個格式,列舉了每一幀的 timestamp 和相機的姿態資訊,類似像這樣:
# Timestamp tx ty tz qx qy qz qw
1311868163.8697 -0.1357 -1.4217 1.4764 0.6453 -0.5498 0.3363 -0.4101
1311868163.8731 -0.1357 -1.4218 1.4764 0.6454 -0.5497 0.3361 -0.4102
1311868163.8764 -0.1358 -1.4219 1.4764 0.6455 -0.5499 0.3358 -0.4101
tx ty tz
就是相機的位置,qx qy qz qw
則是相機的旋轉(用四元數表達)。
我們可以用以下的程式碼來轉換成我們熟悉的 4x4 extrinsic matrix:
import numpy as np
from scipy.spatial.transform import Rotation
def to_matrix(qx, qy, qz, qw, tx, ty, tz):
r = Rotation.from_quat([qx, qy, qz, qw])
t = np.array([tx, ty, tz])
matrix = np.eye(4)
matrix[:3, :3] = r.as_matrix()
matrix[:3, 3] = t
return matrix
也就是說,我們看透過讀取 rgb.txt
和 groundtruth.txt
來讀取對應的圖片和相機的姿態。