小论文工作日记(三)
最近又做了一些无用的工作,尝试写SDM_UniPS 的训练脚本,但是没写明白,耽误了一点时间…
对科研又有了一些新的心得,理想的顺序应该是先做一个baseline(基准),然后基于这个基准去逐步改进,并做消融实验,逐步的观察模型效果,而不是上来就用一个新的模型新的结构,两眼一抹黑的乱改
为什么又放弃了SDM_UniPS?主要还是因为他是做的高分,还是比较占内存的,硬件限制~
下定决心开始从 UniPS 开始改进,但是原作者写的比较乱,花了2天时间重写了一下外围的训练和推理脚本,修复了一些BUG。现在大概训练了15个epoch,结果为:
| Ball | Bear | Buddha | Cat | Cow | Goblet | Harvest | Pot1 | Pot2 | Reading | Avg |
|---|---|---|---|---|---|---|---|---|---|---|
| 4.79 | 10.53 | 17.17 | 12.72 | 16.02 | 23.47 | 33.23 | 13.42 | 12.11 | 23.43 | 16.69 |
哈哈,我感觉他的效果也很一般,找了一下论文,他果然没有在DiLiGenT上做测试,可能是指标太差了吧~
Baseline 跑好了之后,接下来就是修改。整理了一下各个AI老师给我的意见,整理一下:
顺便写一个通用提示词方便复制:
我在复现论文UniPS satoshi-ikehata/Universal-PS-CVPR2022: Official Pytorch Implementation of Universal Photometric Stereo Network using Global Lighting Contexts (CVPR2022),并以其作为baseline进行改进。我如果…
一、改进方向
1. 损失
- 来源:ChatGPT/GLM
- 难度:简单
光度立体问题中,一直都是用MSE作为损失计算法向量。可以考虑增加法线梯度损失,边缘感知损失
but,逐像素怎么做高频约束?需要细细讨论…
GLM老师甩给我一篇论文Image Gradient-Aided Photometric Stereo Network
由于现在的网络是先两阶段损失,逐像素计算损失 + 低像素特征图损失
2. 小波输入
- 来源:Claude
- 难度:简单
Claude老师参考Lino UniPS, 把输入的图先做一个小波分解,然后视为图片直接送入编码器
有想法,不过有点抄袭的嫌疑,我个人没啥兴趣…
而且原作者还在解码器端也做了一些手脚
回头可以让AI帮我写一个版本试试看
3. Dino嵌入
- 来源:Claude
- 难度:中等
使用DINOv3-ConvNeXt-Tiny / small 作为几何先验。
Dino 输出为:
| 维度 | 分辨率(H,W) |
|---|---|
| 96 | H/4, W/4 |
| 192 | H/8, W/8 |
| 384 | H/16 , W/16 |
| 768 | H/32, W/32 |
| 同时也提供token形式的特征输出(1+ H * W / 1024, 768)。 |
而恰好的是,UniPS中,swin Transformer的输出的维度一模一样。
按照C老师的说法,可以冻结DINO,然后在communication之前把特征concat一下,或者再增加一个cross attention
相当于提供了一些材质和几何的先验,可能会有改善
这个方案深得我心,明天可以做个消融实验试一下,而且也可以测试把swin transformer干掉
4. VGGT嵌入
- 来源:GLM/
- 难度:困难
在熟悉dino之后,可以把VGGT的global attention搬进来,并少做几层attention,最后在更靠后的位置嵌入特征,作为一种几何先验。这里就有点远了,上面的任务就够做一段时间实验了
二、原模型改进
1. 模型职责分离
原模型把网络结构、优化器、调度器,损失都揉在一起了,不太利于后期的修改,不过目前来看,各位老师提出的方案还不至于修改这里,可以先放一放
2. 保存读取
原模型把各个结构的权重文件是分开保存的,这个可以考虑保存权重字典,要不然后面也不好增加模块,在做dino嵌入的时候可以考虑一下
3. 分辨率
这个我认为是个大问题,在池田后面的工作SDM中,第一个解决的问题就是分辨率,把图片裁成patch再输入而不是下采样输入。UniPS中resize也是为了节省内存,这里我分析还是要借鉴VGGT,分块,分片。
欸?突然有个大胆的想法
vggt是 global attention , frame attention ,为什么不加一个pixel attention?
暂时不考虑patch的问题的话,
global attention 是[N* H* W , embedding]
frame attention 是N * [ H * W, embedding]
pixel attention 是 [H* W, N* C]
但是这样H* W 作为transformer的序列显得实在是太长太长了,但是如果做patch级别的又没什么意义
再议,再议吧…先做一些务实的改进,这些天马行空的想法暂时还是做不了,无论是能力还是资源…