一、参考资料
Make3d数据集使用方法
二、相关介绍
1. 简介
Make3D 数据集的每帧图像的深度值均由激光雷达进行采集,相较于 Kinect 相机采集的深度信息,该测距仪可以得到室外图像更加精确的深度信息,而且测距范围更大,与普通的深度传感器相比还具有分辨率高、抗干扰能力强等特点。
注意说明:由于 Make 3D 图像中深度层次区分不明显,所以采用热力图表示其深度估计结果。
2. 训练集与测试集
Make3D 数据集是一个单目深度估计数据集,包含 534 对 RGB-D 图像对(包括 RGB 图像及其对应的深度图像)。其中,400 对图像对用于训练,134 对图像用于测试。 RGB 图像具有高分辨率,而深度图是低分辨率的。
注意:通常,Make3D 数据集只用来测试在KITTI数据集上训练好的权重的性能,也就是只作为测试集,因此只下载134张图片与对应的深度mat。
3. 下载链接
-
Make3D数据集官方网站,由Cornell University提供:Make3D — Range Image Dataset
-
Make3D数据集在超神经(HyperAI)平台上的介绍页面,提供了数据集的详细信息和下载选项:Make3D 单目深度估计数据集 - 超神经
三、常用操作
1. 提取.mat
文件
import scipy.io
# 加载.mat文件
mat_data = scipy.io.loadmat('path_to_make3d_data.mat')
# 假设Position3DGrid是存储在mat_data中的一个变量
if 'Position3DGrid' in mat_data:
position_3d_grid = mat_data['Position3DGrid']
# position_3d_grid 是一个三维数组,每个元素是一个三维坐标点
# 访问第一个点:
first_point = position_3d_grid[0, 0, :] # (H, W, Z)的结构
print(first_point) # 输出第一个点的三维坐标
else:
print("Position3DGrid not found in the .mat file.")
# 注意:这里的索引和维度可能需要根据实际的Position3DGrid数据结构来调整
一个 .mat
文件对应一张深度图,解析 .mat
文件,得到数据维度为 (55, 305, 4)。
- 第一个维度(55):Height高度,图像的垂直方向像素数量。
- 第二个维度(305):Width宽度,图像的水平方向像素数量;
- 第三个维度(4):
- X坐标:网格点在三维空间中的X位置。
- Y坐标:网格点在三维空间中的Y位置。
- Z坐标:网格点在三维空间中的Z位置(对应于深度或距离)。
- 额外信息:最大有效深度,设置为80。
2. 深度图可视化
import h5py
import scipy.io
import os
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
# 定义颜色映射
# cmap = plt.cm.jet
# cmap = plt.cm.hot
# cmap = plt.cm.plasma
cmap = plt.cm.viridis
# cmap = plt.cm.Greys
def show_depth():
# 指定.mat文件路径
path_mat_file = '/PATH/TO/Make3D/Gridlaserdata/depth_sph_corr-10.21op2-p-015t000.mat'
path_rgb_image = '/PATH/TO/Make3D/Test134/img-10.21op2-p-015t000.jpg'
# 使用scipy.io加载.mat文件
mat_data = scipy.io.loadmat(path_mat_file)
data = mat_data['Position3DGrid']
# 可视化RGB图像
image = Image.open(path_rgb_image)
plt.figure(figsize=(8, 6))
plt.subplot(2, 1, 1)
plt.imshow(image)
plt.title('Original Image')
plt.axis('off') # 不显示坐标轴
# 可视化深度图像
# depth_map[H, W, Depth]
depth = data[:, :, 3]
# 深度值归一化
depth_normalized = (depth - np.min(depth)) / (np.max(depth) - np.min(depth))
plt.subplot(2, 1, 2)
plt.imshow(depth_normalized, cmap=cmap, interpolation='nearest') # 选择深度图的第三维度进行可视化
plt.title('Depth Map Visualization')
plt.axis('off') # 不显示坐标轴
if __name__ == '__main__':
show_depth()
3. 保存深度图
import h5py
import scipy.io
import os
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
# 定义颜色映射
# cmap = plt.cm.jet
# cmap = plt.cm.hot
# cmap = plt.cm.plasma
cmap = plt.cm.viridis
# cmap = plt.cm.Greys
def save_depth():
# 指定.mat文件的根路径
dir_mat_file = '/PATH/TO/Gridlaserdata/'
# 保存深度图的路径
depths_path = '/PATH/TO/make3d_depths/'
if not os.path.exists(depths_path):
os.makedirs(depths_path)
for mat_item in os.listdir(dir_mat_file):
print(mat_item)
path_mat_file = os.path.join(dir_mat_file, mat_item)
base_name = os.path.basename(mat_item)
prefix_name = os.path.splitext(base_name)[0]
# 使用scipy.io加载.mat文件
mat_data = scipy.io.loadmat(path_mat_file)
depth_map = mat_data['Position3DGrid']
# depth_map[H, W, Depth]
depth = depth_map[:, :, 3]
depth_normalized = (depth - np.min(depth)) / (np.max(depth) - np.min(depth))
depth_image = Image.fromarray(depth_normalized)
depth_image_path = os.path.join(depths_path, f'{prefix_name}.png')
plt.imsave(depth_image_path, depth_image, cmap=cmap)
if __name__ == '__main__':
save_depth()