简介
DiLiGenT光度立体数据集,全称为 calibrated Directional Lightings, objects of General reflectance, and ‘ground Truth’ shapes (normals),即使用标定过的定向光源,对一些具有常见反射率特性的物体进行光度立体拍摄,并获取到精确的物体表面法向信息作为真值的这样数据集。该工作由施伯鑫团队耗时2年多完成,主要目的在于提供一份标准的数据集,用于评估非朗伯材料(non-Lambertian materials)和未知照明条件下(unknown lightings)的光度立体计算方法,分析他们的优点和局限性。
该数据集早期发布在CVPR16上,论文名为 ”A Benchmark Dataset and Evaluation for Non-Lambertian and Uncalibrated Photometric Stereo“,网页版见 https://www.cnblogs.com/gshang/articles/18447361 。
正式发布在 IEEE,引用如下:
Boxin Shi, Zhipeng Mo, Zhe Wu, Dinglong Duan, Sai-Kit Yeung, and Ping Tan, "A Benchmark Dataset and Evaluation for Non-Lambertian and Uncalibrated Photometric Stereo", In IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI), Volume 41, Issue 2, Pages 271-284,2019.
- PDF:https://ieeexplore.ieee.org/document/8281537
- 补充材料:https://drive.google.com/open?id=1cf3uYTTTfS5ZyCvj2agdmVsmtAcTZpX2
根据以上资料,整理了数据集制作过程,以及数据集如何使用。
数据集制作过程
被摄物挑选
在挑选被摄物时,为满足评估的全面性。从表面双向反射率分布特性(BRDF, bidirectional reflectance distribution function)和表面形貌复杂性两个角度进行筛选,一共挑选得到了10个物件。
相机选型
拍摄所使用的相机型号为 Point Grey 公司生产的 GRAS-50S5C-C ,分辨率为 ;搭配 50 mm 镜头。
所有被摄物体直径约为20cm,放置在距相机约1.5m处以近似获得正投影效果。
为了避免相互反射,所有图像都在暗室中记录,除了目标物体外,所有物体都用黑布覆盖。对于每种照明条件,我们在不同曝光时间下拍摄四张图像并将它们组合起来以获得单个输入 HDR 图像,以便也可以精确存储高镜面观察结果。我们的数据捕获的一组典型曝光时间设置是 {20, 40, 70, 100} ms
光源制作
大多数非朗伯方法需要大约 100 个不同照明的图像,因此将96个白色LED灯按照 排列成网格,可实现 拍摄角度覆盖。
拍摄
在拍摄过程中,光源固定,相机位于其中心。其中测试数据集是在仅改变拍摄角度的条件下获得的。
坐标系
这里统一使用相机坐标系,并将方向与视角对齐,即 。
: 表面法向量
: 光源方向向量
: 角平分线向量(向量 和 向量 的角平分线)
: 向量 和向量 的夹角
: 向量 和向量 (或者向量 )的夹角
光源标定
照明强度标定
使用 Macbeth white balance chart 进行光源强度标定。
光源方向标定
在传统的光度立体光源方向标定方法中,假设了光源为固定照明方向,并且相机成像为正交投影。通过识别图像中铬球(镜面反射)的镜面反射点(图中最亮的亮斑处即为反射点)来计算该处的表面法线。然后根据反射定律,假设该点的表面法线平分了观察方向和光源方向之间的角度,由此推出光源方向计算公式为:
但作者认为这样的标定仍不够精确,因为实际成像过程是透视变换,而非正交投影。因此,作者基于 “点光源照明和透视相机模型” 来重新标定光源方向。
求解步骤可以概括为:
1)计算相机坐标系下的铬球中心点 的三维坐标;
2)优化光源到相机坐标系的变换矩阵 使得所有光源到其理论光源方向直线的距离最小;
详细推导过程如下:
已知光度立体相机内参 , 铬球半径 ,铬球镜面反射点在相机坐标系下的坐标 , 则该位置的观察方向为
铬球中心点 到经过该点的直线距离为 ,即
将图像中的所有椭圆上的点代入上式中,即可求得铬球中心点 的三维坐标。
在上图中,铬球表面的亮斑在相机坐标系下的三维坐标为 , 其在图像中对应的像素坐标为 ,则过 的光线为 , 是由光线 与铬球相交得到的。而铬球表面的点坐标由 球体中心点 和铬球半径 决定的。
假设所有光源的世界坐标集合为 ,因为这些灯固连在一起,因此经过某个特定的 变换,转换到光度立体相机坐标系,得到 。即 。
则可定义如下代价函数:
其中,方向向量 由 镜面反射点 处, 关于表面法向量 的反射。其中距离函数 定义为点 到经过 且方向向量为 的直线的距离的平方。即:
这是一个非线性最小二乘问题,可以通过 Matlab 函数 lsqnonlin
来求解。
这种对所有光源同时求解比逐个求解单一光源具有更好的稳健性,因为在设计光源支架时,每个光源的位置都是精确设计了的。
表面法向量真值获取
使用结构光扫描设备恢复物体形貌,所使用的仪器为 Rexcan CS 搭配 TA300 转台。
该结构光设备的点云间距在 [0.035, 0.2] mm 以内,表面噪声低于 0.01 mm。扫描仪搭载了两个 200 mm 的镜头,其 FOV 分别为 (宽、高、对角线);这样的镜头组可以实现 0.097 mm 的点云间距扫描效果。转盘的直径为 30 cm ,被摄物的直径约为 10 cm ,因此可以放置在旋转台中心,并完全在扫描仪相机的FOV 中。
转盘可以执行±180°旋转和±40°摆动两个方向的运动。通过编程使其以20°的旋转步长和10°的摆动步长移动,因此,在每一轮扫描任务中,物体会自动扫描 次。与扫描仪关联的 eZScan 7 软件对所有扫描执行自动配准,并将它们合并为一个完整的网格。我们从扫描仪的输出中检查配准误差的直方图,并观察到平均距离通常在 0.01mm 的数量级。考虑到我们的物体大小约为 10 cm,配准误差足够低,可以为我们提供足够精确的形状。在扫描之前,我们会对 (READING) 和 (HARVEST) 等高镜面物体进行喷涂。最后,我们获得了 3D 网格,其中从正面视图没有观察到可见的孔或凸起,用于表面法线计算。
形状和图像对齐
通过扫描仪获取到的物体三维信息以及表面法向量信息是在扫描仪相机坐标系下的,而理论的表面法向量真值应该在光度立体相机坐标系下,因此二者需要对齐。作者通过 Meshlab 软件来实现对齐操作。
通过 Meshlab 软件提供的UI交互,可以将扫描得到的参考法线贴图与广度立体图像进行对齐(主要为旋转、缩放、平移)到大致一致,然后使用自动对齐算法进行精确计算,使其收敛到一个稳定的解,则认为已对齐。
为了验证这种对齐方法的有效性,作者测试了斯坦福大学3D扫描库中的几个形状,测试发现这种方法下,对齐结果和真实发现贴图之间的平均角度误差大约为1°(对于BUNNY这类光滑表面);但是对于HAPPY BUDDHA10这类复杂表面,误差则大于3°。但是,真实数据包含来自相机校准、镜头畸变和其他意外来源的噪声,这些也是误差的源头。通过对比发现,对于深度变化较大的对象(尤其是POT1、POT2和BUDDHA),即使提供了较好的初值,对齐结果也不是最优的。因此,必须根据自动对齐结果,以 Meshlab 允许的最小步骤小心旋转和平移来手动调整 3D 形状。在完成一个步骤的手动操作后,我们通过仔细检查两个法线图上的每一个小特征,比较从对齐形状渲染的法线图和参考法线图,直到所有部分都以亚像素精度对齐。
表面法线误差计算
作者采用了基于角度误差的统计指标,用于评估各类光度立体的表现。
在图像中,对于每一个像素,都可以通过算法计算出其表面法向量 , 其与法向量真值 之间的角度误差可以表示为 ,使用角度制单位计算。
对整张图计算平均角度误差,并使用箱线图统计误差的最小值、最大值、中位数、第一四分位数、第三四分位数。
数据集使用
在官方网站中,一共提供了如下几份数据集和相关资料:
名称 | 大小 | 说明 |
---|---|---|
DiLiGenT.zip | 850MB | 光度立体数据集 |
DiLiGenT_Test.zip | 759MB | 光度立体测试数据集,不提供表面法向量真值 |
shapeToImageAlignmentToolbox.zip | 8MB | 执行形状到图像对齐并将网格渲染为法线贴图的代码和说明 |
ACLSfitBRDFzip | 502MB | 使用图像数据、校准照明和“地面实况”法线提供 BRDF 拟合结果。还提供了使用拟合的 BRDF 重建图像的示例代码 |
PointLight.zip | 9KB | 光源位置和相机内参矩阵,用于点光源模型/透视相机模型 |
DiLiGenT
压缩包目录结构如下:
├─estNormalNonLambert ├─estNormalUncalib ├─pmsData │ ├─ballPNG │ ├─bearPNG │ ├─buddhaPNG │ ├─catPNG │ ├─cowPNG │ ├─gobletPNG │ ├─harvestPNG │ ├─pot1PNG │ ├─pot2PNG │ └─readingPNG ├─sampleCodeBaseline └─sampleCodeEvalNormal
- pmsData。 所挑选的十个对象,在96个不同光源照明下拍摄所得的16位图像,分辨率为 , 物体的掩模图(mask.png),光源方向信息 (light_directions.txt, , 每一行作为一个单位矢量) ,光源强度(light_intensities.txt, , 每一行代表RGB通道;在执行光度立体前,需要按通道划分这些强度值来对图像进行归一化),文件夹中还提供了所有图像文件名(filenames.txt), 表面法向量真值mat文件(Normal_gt.mat),以及表面法向量的RGB渲染图像(Normal_gt.png)。
- sampleCodeBaseline。使用“DiLiGenT”数据集加载图像并运行基线光度立体算法(简单线性最小二乘法)的示例。
- estNormalNonLambert/ estNormalUncalib。 使用最先进的非朗伯/未标定光度立体算法,对
DiLiGenT
数据集进行结算,所获得的各个物体表面法向量mat文件。 - sampleCodeEvalNormal。加载'estNormalNonLambert'/'estNormalUncalib'中的结果并计算误差统计数据的示例代码(基于每像素角度误差并使用箱须图进行可视化);这里的代码再现了论文的图 2/4
DiLiGenT_Test
压缩包目录结构如下:
├─estNormalNonLambert ├─estNormalNonLambertErrMap ├─estNormalUncalib ├─estNormalUncalibErrMap ├─pmsData │ ├─bearPNG │ ├─buddhaPNG │ ├─catPNG │ ├─cowPNG │ ├─gobletPNG │ ├─harvestPNG │ ├─pot1PNG │ ├─pot2PNG │ └─readingPNG └─sampleCodeBaseline
与DiLiGenT类似,但不提供面法向量真值mat文件(Normal_gt.mat),而是提供每个像素角度误差图和统计数据角度误差。测试数据集包含在相同变化的光照条件下与主数据集中的#1--#9相对应的九个对象,但它们是从不同的视点拍摄的。
-
pmsData。图像和光照格式与主数据集相同,但未提供“Normal_gt.mat”和“Normal_gt.png”。
-
sampleCodeBaseline / estNormalNonLambert / estNormalUncalib。与主数据集具有相似的内容。
-
estNormalNonLambertErrMap / estNormalUncalibErrMap。提供了估计法线与“地面实况”的逐像素角度差异图(PNG 图像);每个文件名末尾的数字是平均角度误差。同一文件夹中还提供了错误统计信息(如 EMF 图像中的盒须图,详细信息请参阅我们的论文)
基准数据集测试结果
DiLiGenT数据集
*: 单元格中的数据是平均角度误差(角度制)
DiLiGenT_Test数据集
*: 单元格中的数据是平均角度误差(角度制)
参考资料
- 本文链接: https://www.cnblogs.com/gshang/p/18449313/DiLiGenT
- 版权声明: 本博客所有文章除特别声明外,均采用 CC-BY-NC-SA 4.0 许可协议。转载请注明出处!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步