Raft训练日志1
一、前情提要 1、什么是RAFT RAFT-stereo是基于RAFT的扩展。RAFT即Recurrent All-Pairs Field Transforms,是一个很出名的光流估计模型,他的特点是先建立全局匹配关系,再通过循环迭代不断细化结果,每一步更新都会变得更准,而RAFT-stereo是基于这个模型的双目改造。 2、RAFT-stereo的原理 先用卷积网络提取左右图的高维特征,而不是拿RGB去比较。因为原始RGB容易受到光照,纹理,噪声影响。 接着就是构建相关性体,简单说就是对于左图中的每一个位置,它都会和右图的一整条去进行相似度比较,形成一种“匹配代价”。 再接着就是不断迭代,他会先给个初始估计,然后通过循环更新模块来反复修正。 3、和其他立体匹配有什么不同之处 传统方法,比如SGM、Blocking Matching,是先算匹配代价,再代价聚合,再做视觉选择,最后再做左右一致性检查。 而RAFT-stereo,属于端到端的学习方法,他会自动学习,什么特征适合匹配,什么区域应该相信上下文,哪些遮挡、弱纹理、重复纹理区域该怎么处理。 4、为什么做这个 我的本科毕业设计做的是双目摄像头的,通过资料搜集,我发现网上感觉最新(2021年提出)的双目摄像头立体匹配算法就是这个RAFT-Stereo,于是我便接触到了这个项目。 二、训练过程 首先,这个项目已经被开源到Github,而且readme文档有较为详细的指令包括下载数据集,demo输出,train,evaluate等等。 说实话,这是我第一次进行正式的模型训练和微调项目,之前做过的模型训练是yolov5,之前g308(西南交通大学robocon校队,我梦开始的地方,没有这个机会,我根据不会接触技术路线,这个博客也不会诞生)的入队考核需要通过这个进行蓝球,红球,球框额的识别(实际上就是robocon2024的麦穗题目),每个人都会以自己的方式接触到yolo,都是回忆啊,在这个之后我就没有做过需要模型训练的项目了,而且就算是那个yolo项目,我也没有进行模型微调,毕竟是入队考核,还是以基础为主。 通过这个项目,chatgpt辅助我,让我也学会了大致的模型微调流程,以下是我的总结 首先要对原始模型进行推理和评测,得到baseline,也就是整个微调的基线。 然后控制变量,每次只改一部分,而且要保留原模型,改动要作为一个选择,也就是作为运行程序的一个可选参数,而不能直接在原模型上改,不然的话,感觉就没有回头路了。 再然后就是根据评价指标,对得到的模型进行评价,和baseline对比。 三、模型改进改动 对于模型改变,我只是根据chatgpt给的提示作了一些修改,代码全部上传到我自己fork的github上, 1.refinement 我首先尝试了增加一个refinement层,这是一个很微小的改变,以下为refinement层 import torch import torch.nn as nn import torch.nn.functional as F class RefinementHead(nn.Module): def __init__(self, in_channels=4, hidden_dim=32): super(RefinementHead, self).__init__() self.conv1 = nn.Conv2d(in_channels, hidden_dim, 3, padding=1) self.conv2 = nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1) self.conv3 = nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1) self.conv4 = nn.Conv2d(hidden_dim, 16, 3, padding=1) self.conv5 = nn.Conv2d(16, 1, 3, padding=1) def forward(self, image1, disp): x = torch.cat((image1, disp), dim=1) x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = F.relu(self.conv3(x)) x = F.relu(self.conv4(x)) res = self.conv5(x) return disp + res 实际上RAFT-Stereo最核心的组件就是内置的精炼层—-多层卷积GRU,这样的设计本身就是在精炼,所以第一步的视差估计都是粗糙的,每一步都在上一步的基础上迭代、修正,最后一轮的输出就是经过了32次迭代的输出。 refinement是什么,本质上是一个输出端的残差修正模块,在RAFT-Stereo经过多次迭代后,会输出一个目前比较好的视差图,然后再和输入的左图拼接, ...