· updated Jan 27, 2025 · 15 min read
初试 HCI 光场数据集
好的数据集是做出漂亮实验的必要条件。声明:一切理解都是本人观点,如有疑问,还望在评论中留言。如需转载请与本人联系,谢谢合作!邮箱:点我
Wanner 光场数据集
目前光场数据集有如下几种主流的数据集:
- 斯坦福大学光场数据集;
- Wanner(HCI)数据集(Old 4D Light Field Benchmark);
- 4D Light Field Dataset(Konstanz 大学与 Heidelberg 大学的 HCI 合作,New 4D Light Field Benchmark)。
下面对 Wanner 数据集进行讨论。学习光场的同学应该很熟悉 Wanner 提供的数据集共有 10 个场景,分别是:
- Buddha
- Buddha2
- Couple
- Cube
- Mona
- Medieval
- Papillon
- StillLife
- Horses
- rx_watch
其中,1-8 为仿真场景,9-10 是由 Raytrix 拍摄的场景。它们的文件后缀为 .h5,格式是 HDF5,这是一种文件组织格式,可以很好地将数据组织在一起,具体不做展开。MATLAB 提供了一系列相应的读取该文件的函数,如:h5disp,hdf5info(新版本用 h5info),hdf5read 等函数,如利用 h5disp 就可以得到 HDF5 文件的内容信息,如下图:
以下给出解码 HDF5 文件得到子孔径图像以及重排图像的代码:
input_file = 'Buddha2.h5'; % file name
input_folder = ''; % your datasets folder
[pathstr,name,ext] = fileparts([input_folder '/' input_file]);
file_path=[pathstr,name,ext];
hinfo_data = hdf5info(file_path);
if strcmp(file_path,'Cube') || strcmp(file_path,'Couple')
data = hdf5read(hinfo_data.GroupHierarchy.Datasets(3));
else
data = hdf5read(hinfo_data.GroupHierarchy.Datasets(2));
end
data = permute(data, [3 2 1 5 4]);
data = im2double(data(:, :, :, :, end:-1:1));
% parameters from input
UV_diameter = size(data, 4); % angular resolution
UV_radius = floor(UV_diameter/2); % half angular resolution
h = size(data, 1); % spatial image height
w = size(data, 2); % spatial image width
y_size=h;
x_size=w;
UV_size=UV_diameter^2;
LF_y_size = h * UV_diameter; % total image height
LF_x_size = w * UV_diameter; % total image width
LF_Remap = reshape(permute(data, ...
[4 1 5 2 3]), [LF_y_size LF_x_size 3]); % the remap image
IM_Pinhole = data(:,:,:,UV_radius+1,UV_radius+1); % the pinhole image
经过以上步骤可以得到相应的中心视角图像以及 Remap(重排)之后的图像,从而进一步方便接下来的工作,例如基于该数据集的深度图像估计算法估计。
HCI 4D 光场数据集(4D Light Field Benchmark)
The 4D Light Field Benchmark was jointly created by the University of Konstanz and the HCI at Heidelberg University.
上周整理上一篇博客的时候,想再次查看 HCI 数据集是否更新,结果惊喜地看到它竟然更新了!激动之余,就连夜把数据以及代码下载了下来,看看这个数据集的庐山真面目。
数据集概况
这个数据集共有 4 大类:
- Stratified(4)
- training(4)
- test(4)
- additional(16)
总结而言这个 4D 光场数据集提供了如下信息:
- 9x9x512x512x3 light fields as individual PNGs(角度分辨率:9×9,空间分辨率:512×512)
- Config files with camera settings and disparity ranges(相机配置文件以及视差范围)
- Per center view (except for the 4 test scenes):(除了测试类外每类的中心视角图像)
- 512×512 and 5120×5120 depth and disparity maps as PFMs(深度图像以及视差图:512×512 低分辨率,以及 5120×5120 高分辨率)
- 512×512 and 5120×5120 evaluation masks as PNGs(png 格式的评价掩膜:512×512 低分辨率,以及 5120×5120 高分辨率)
- 16 组 additional 的每个视角的 Ground Truth Depth 图像(pfm 格式)
数据集下载
开始下载吧!在该页面的get the data处填写自己的邮箱,然后点击request download links。接下来你的邮箱里就会出现这个数据集的下载链接,链接有点多,你可以选择性地下载或者全部下载。方便起见,我把邮件中提供的链接贴在了下面:
-
Full package with all 28 scenes(这是全部的场景,共 28 类;注意不包含深度图像)
-
Packages per category:
-
Stratified scenes:
-
Test scenes:
-
Training scenes:
-
Additional scenes:
-
Depth and disparity maps for all views of the additional scenes
数据集初体验
测试代码下载
在其官方给出的代码页面下载测试程序,下载完毕后将 convert*.m 以及 lib 文件夹放置在与上述数据集同级目录。例如:TEST 目录下同时包括:convert.m 以及 lib/,同样也包含 additional/、stratified/、test/ 以及 training/。
生成LF.mat
- convertAll:对于每一个场景都生成一个
LF.mat文件
如果我们仅仅下载了几个场景我们可以利用如下函数得到相应的LF.mat
- convertBlenderTo5D(‘FOLDER’)
这个LF.mat中包含该场景的光场信息诸如:
- 光场数据 (LF.LF)
- 真实值 (LF.depth/disp_high/lowres)
- 评价掩膜(mask)
- 中心视角图像
注意:生成 LF.mat的过程用到的参数通过加载相应文件夹下parameters.cfg得到,并将其存储在了LF.parameters中;H变换矩阵存储在了LF.H中(可以参考论文”Decoding, Calibration and Rectification for Lenselet-Based Plenoptic Cameras”);两个平面的距离存储在LF.f,单位 [mm];相机焦距:LF.parameters.intrinsics.focal_length_mm。
生成点云(Point Cloud)
接下来我以 additional 文件下的**antinous**为例子展示如何利用深度图像(官方利用视差)与纹理图像生成点云。
filename='antinous';
addpath('lib');
% 得到antinous的LF.mat
convertBlenderTo5D(['additional/',filename])
load(['additional/',filename,'/LF.mat']);
img=LF.LF(5,5,:,:,:); %中心视角,用于着色
r=img(:,:,1);
g=img(:,:,2);
b=img(:,:,3);
% 深度图读取
d=pfmread(['additional_depth_disp_all_views\',filename,'\gt_disp_lowres_Cam025.pfm']);
d=mat2gray(d);
mkdir(['PointClouds-color/',filename]);建立一个文件夹存储图片
[ X,Y,Z ] = getPointcloud(LF,'disp',d);
ptCloud1 = pointCloud([X(:),Y(:),Z(:)],'color',[r(:) g(:) b(:)]);
h1=figure(1);
pcshow(ptCloud1);
axis off
set(gcf,'color',[1 1 1])
set(gcf,'Position',[800,300,600,600], 'color','w')
view(90.6338, 88.5605);
zoom(1.2)
结果如下所示:
注意:生成点云这一步,低版本的 MATLAB(如 R2014a)由于没有加入相应的函数所以不能够生成点云,高版本(R2016b)可以正常生成。另外,在此提供另外一个函数visualizeZ_3D,该函数将 depth map 当做彩色图像的 z 向延伸,然后构图。
<!--The function visualizeZ_3D-->
function visualizeZ_3D(Z,im)
if (im == 0)
surf(Z, visualizeZ(Z), 'EdgeColor', 'none'); imtight; axis image ij; %view(-180, 91);
else
surf(Z, im, 'EdgeColor', 'none'); imtight; axis image ij; %view(-180, 91);
end
end
function imtight
axis image off;
xMult = 1;
yMult = 1;
borderSize = 0;
PLOTBASESIZE = 500;
set(gca, 'PlotBoxAspectRatio', [xMult yMult 1])
set(gcf, 'Position', get(gcf, 'Position') .* [1 1 0 0] + [0 0 PLOTBASESIZE*xMult PLOTBASESIZE*yMult]);
set(gca, 'Position', [borderSize borderSize 1-2*borderSize 1-2*borderSize]);
end
旧数据集下载
- 旧 HCI 数据集:GoogleDrive、BaiduWangPan,提取码:r4yb