0%

周报:球谐系数的求法

本周拟定工作计划

  1. 训练EMLight
  2. 有时间看下手里两个没细看的代码:garder19、styleLight

本周实际完成工作总结

  1. EMLight实际数据集太多,仍在训练。之前已经训练到了图片量为2000的数据集,但是由于实验室主机整体更换,数据集出现了变动,导致之前训练作废,重新训练。

  2. garder19、styleLight还未看。

  3. 这周去看了几篇采用SH光照模型的论文,并做了SH拟合光照并复原光照的实验。

本周实际完成工作详述

  1. EMLight重新训练的原因

Laval数据集一共有2100+张hdr全景图。在预处理阶段,每张全景图生成8个crop图,以及对应的八个warped图。所以Laval数据集可为EMLight提供19557

1
2
(emlight) jixinlong@ubun:~/datasets/LavalIndoor/pkl$ ls -l|grep "^-"| wc -l
19557

但是19557张图片太多了,一次性投喂给神经网络,让他学怎么做光照估计,就好比让什么都还不会的婴儿学高等数学。它一定会放弃,loss无法收敛。

所以EMLight论文中建议递进地训练,先拿100张,让模型熟练掌握在100图上的光照估计任务。然后数据集扩增到800张、2500张、10000张……每种规模上的训练一定要到“过拟合”的程度,才能进行下一阶段的训练。

我正是遵照这个方法在逐步训练EMLight。要注意的是,800张图片应当包含上一阶段的100张图片,2500张图也应该包含800张图,这才符合“递进式”学习的含义。在训练代码的数据集加载部分,有这样一行代码:

1
gt_nms = os.listdir(gt_dir)

它的含义是从图片目录中读取所有的图片名,形成一个文件名列表。紧接着,后边有一行代码:

1
self.pairs = self.pairs[: 10000]

含义是选取文件名列表的前10000个,用于此次训练。这两行代码就是EMLight限定数据集规模的方式。我之前好奇过,这个os.listdir()函数,它返回的文件目录每次都是固定的吗?我搜索到的答案是,返回的结果确实是固定的,而且是按照某种文件名的内在编码进行顺序排序的。我不放心,又自己多次运行这个函数,确定每次返回的结果、顺序都是一模一样的。加上EMLight这个代码是开源的,有那么多双眼睛盯着,作者也不傻,总不能这个地方还出错吧。如果我手动给它加个排序,必然有多出的开销,所以我这里没有改动,遵从原代码。

Laval数据集,在实验室服务器上有一份,在自己租的服务器上还有一份。本来已经只用实验室服务器了,但是寒假时候实验室服务器整机更新,我就没有备份Laval数据集,而是在更新好之后直接从自己租的服务器把Laval数据集传一份到实验室。整机更新之后我接着训练,就出现问题了,loss不但不收敛,还疯狂飙到很高,模型似乎摆烂了。

后来发现,原因是实验室服务器整机更新,更新前后系统硬件或操作系统层面的变化,可能导致了os.listdir()函数在完全一样的目录下不同的输出。这就意味着之前在800张图片上训练好的模型,在新的机器上面对800张还很陌生的图片,于是loss飙升。这种情况,没法复原在老机器上os.listdir()函数的输出顺序,之前训练的模型基本就废了。

好在发现了问题。我在上述两行代码之间加上一行:

1
gt_nms.sort() #不排序的话,在另一台机器上解压出大量文件并读取的时候顺序会随机不一样

这行代码强制对os.listdir()的返回结果进行排序。经测试,这种排序不受机器软硬件环境的影响。加上新机器的3090显卡,很快赶上了之前的训练进度。

  1. 跟据全景贴图求球谐系数

根据全景贴图求球谐系数

附件

下周工作计划

  1. 尝试把EMLight从SG模型改成SH模型,训练网络从crop中回归出SH系数。

需要协调与支援