Make3D数据集相关介绍

一、参考资料

Make3d数据集使用方法

二、相关介绍

1. 简介

Make3D 数据集的每帧图像的深度值均由激光雷达进行采集,相较于 Kinect 相机采集的深度信息,该测距仪可以得到室外图像更加精确的深度信息,而且测距范围更大,与普通的深度传感器相比还具有分辨率高、抗干扰能力强等特点。

注意说明:由于 Make 3D 图像中深度层次区分不明显,所以采用热力图表示其深度估计结果。

2. 训练集与测试集

Make3D 数据集是一个单目深度估计数据集,包含 534 对 RGB-D 图像对(包括 RGB 图像及其对应的深度图像)。其中,400 对图像对用于训练,134 对图像用于测试。 RGB 图像具有高分辨率,而深度图是低分辨率的。

注意:通常,Make3D 数据集只用来测试在KITTI数据集上训练好的权重的性能,也就是只作为测试集,因此只下载134张图片与对应的深度mat。

3. 下载链接

  1. Make3D数据集官方网站,由Cornell University提供:Make3D --- Range Image Dataset

  2. Make3D数据集在超神经(HyperAI)平台上的介绍页面,提供了数据集的详细信息和下载选项:Make3D 单目深度估计数据集 - 超神经

三、常用操作

1. 提取.mat文件

python 复制代码
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)。

  1. 第一个维度(55):Height高度,图像的垂直方向像素数量。
  2. 第二个维度(305):Width宽度,图像的水平方向像素数量;
  3. 第三个维度(4)
    • X坐标:网格点在三维空间中的X位置。
    • Y坐标:网格点在三维空间中的Y位置。
    • Z坐标:网格点在三维空间中的Z位置(对应于深度或距离)。
    • 额外信息:最大有效深度,设置为80。

2. 深度图可视化

python 复制代码
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. 保存深度图

python 复制代码
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()