当前位置: 首页 > news >正文

PSMNet 网络结构

模型解决的问题是:如何通过火遍全网的深度学习解决双目相机的深度估计问题。

深度学习不是牛嘛,不是对什么都可以建模嘛?那如何通过模型end2end的学习呢?

我们都知道,需要先找到两幅图片的对应特征点,然后计算两者的视差disparity.

然后根据下图就可以计算得到一个点的深度信息: ,其中f是相机焦距,B是基线长度,即两个相机之间的距离,d就是视差disparity。

因此接下来的重点就是如何建模给出对d的估计。

改进点

  1. 采用金字塔结构和空洞卷积来提取多分辨率的信息并且扩大感受野
  2. 采用多个叠加的Hour-Glass结构来增强3D卷积

模型

具体的结构信息可见下表

此处仅陈述比较重要的部分:

cost volume的计算

将disparity分为D个级别,经过计算后,维度增加一个维度就是为了分别D个级别的disparity。

在left[i:]与right[:-i]做比较,i的取值范围为[0, maxdisp), maxdisp为设置的最大的视差,程序中取192。

因此,希望通过计算寻求得到shift后的左右图像的相似度,相似度最大的i就是视差。

程序中是怎么实现的呢?

for i in range(self.maxdisp//4): # 求得每个disparity的数值 if i > 0 : cost[:, :refimg_fea.size()[1], i, :,i:] = refimg_fea[:,:,:,i:] cost[:, refimg_fea.size()[1]:, i, :,i:] = targetimg_fea[:,:,:,:-i] else: cost[:, :refimg_fea.size()[1], i, :,:] = refimg_fea cost[:, refimg_fea.size()[1]:, i, :,:] = targetimg_fea

hourglass的training和testing

由于使用了3个hourglass block,中间会右三个输出。在训练时,三个输出均被用到。在testing时,只用到最后一个输出。

在计算每个输出时,会右一个soft attention mechanism.

拿第一个输出举例:

cost1 = torch.squeeze(cost1,1) # [B, 192, 256, 512], pred1 = F.softmax(cost1,dim=1) # 在D维度上,进行了softmax,此时D维度相加等于1 pred1 = disparityregression(self.maxdisp)(pred1) # [B, 1, 256, 512] 起到加权平均的作用, 也是就是论文中说的 a soft attention mechanism. class disparityregression(nn.Module): def __init__(self, maxdisp): super(disparityregression, self).__init__() self.disp = torch.Tensor(np.reshape(np.array(range(maxdisp)),[1, maxdisp,1,1])).cuda() def forward(self, x): # [B, 192, 256, 512]以下起到加权平均的作用, 也是就是论文中说的 a soft attention mechanism. out = torch.sum(x*self.disp.data,1, keepdim=True) # [B, 1, 256, 512] return out

可以看到计算最终的输出时,用x*self.disp.data, x是softmax后的权重,self.disp.data是所有的视差级别,两者相乘就是加权平均的结果,该结果就是最终该分支的输出。也就是soft attention mechanism。

计算过程相当于该公式,但是不知为何公式中有一个负号,其实在程序中并不存在符号。其实让模型自己学就可以,模型不管符号问题。

只有给了模型输入,输出,loss计算方式,模型就可以开始自己学习了。。。

第2, 3个输出也是类似的。

loss

有了模型,有了输出,就差loss计算了。

计算三个hourglass计算的结果,output1, output2, output3,分别计算与gt的smoothL1 loss,三者的权重是0.5,0.7,1。

作者还比较的不同权重的结果,相差不大。但是,如果训练时只采用最后一个hourglass的输出,则效果会大大下降。

mask = (disp_true > 0) # 只计算disparity非0的位置 output1, output2, output3 = model(imgL,imgR) output1 = torch.squeeze(output1,1) # [B, 256, 512]) output2 = torch.squeeze(output2,1) output3 = torch.squeeze(output3,1) # 但是以下loss 有个问题:视差与物体实际远近的关系???? loss = 0.5*F.smooth_l1_loss(output1[mask], disp_true[mask], size_average=True) + 0.7*F.smooth_l1_loss(output2[mask], disp_true[mask], size_average=True) + F.smooth_l1_loss(output3[mask], disp_true[mask], size_average=True)

评测

在testing时, 预测的视差 与gt差异<3或者< gt**0.005均被认为判断为预测正确。

correct = (disp_true[index[0][:], index[1][:], index[2][:]] < 3) | (disp_true[index[0][:], index[1][:], index[2][:]] < true_disp[index[0][:], index[1][:], index[2][:]]*0.05) # 与gt差异<3或者< gt**0.005均被认为判断为预测正确

结语

通过这个模型,我么可以感知深度学习的强大之处。

它竟然可以自动匹配特征点,并将所有像素的视差输出。

PSMnet的思想和亮点

  1. PSMNET使用两个图片,找到对应的视差,以此来推断depth.
  2. 先使用同一个模型提取左右两幅图片的特征,使用了残差结构;模型使用了spp和空洞卷积,提取了多层次特征,扩大了感受野。这是因为,视差依赖不同尺度下的context信息,而不是在像素层面的局部信息。
  3. 将两个图片的特征,按照D个disparity等级,分别concate起来。
  4. 使用3个hourglass block(stacked hourglass 3D CNN)来增强3D卷积。训练时使用3个block的输出,testing时只需要最后一个block的输出。每一个输出的维度为D*H*W。 stacked hourglass 3D CNN 可以更好地对由左右图像特征组成的cost volume提取上下文特征。
  5. 使用soft attention mechanism(将D维度进行softmax,作为权重,与相对应的disparity相乘,得到加权平均的结果),计算该结果与真实的disparity 的smoothL1 loss.训练时,3个hourglass block的输出结果的loss需要设置一个权重。
http://www.jsqmd.com/news/725209/

相关文章:

  • AI Agent记忆系统:安全漏洞与防御策略解析
  • 电赛小白也能懂:从霍尔到超声波,手把手教你搞定5种常用传感器电路
  • 从信息论到你的模型:一文读懂BCELoss(二元交叉熵)为什么是二分类的‘黄金标准’
  • RTP-LLM:实时音视频流与大语言模型融合架构与工程实践
  • 告别命令行恐惧:在AutoDL上用Jupyter网页操作Linux,像本地一样跑PyTorch代码
  • XXMI启动器:一站式游戏模组管理终极解决方案,轻松管理6大热门二次元游戏
  • 微架构防御集成中的MDAV问题与Maestro解决方案
  • ESP32-S2六路32A自锁继电器模块解析与应用
  • 2026 AI大模型接口聚合站实测:深度剖析各平台性能,诗云API(ShiyunApi)稳定性脱颖而出
  • 深度学习训练可视化:工具、技巧与实战指南
  • PSMNet 网络结构 2
  • 携程任我行礼品卡回收靠谱渠道,这样选才安心 - 京顺回收
  • PyTorch实战:手把手教你将ConvLSTM嵌入UNet,搞定视频车道线检测(附完整代码)
  • 如何3步解决科学文库加密文档的阅读限制问题
  • 基于Streamlit和OpenAI构建AI辅导助手的实践指南
  • 抖音批量下载器终极指南:3分钟学会免费批量下载无水印视频
  • OBS多平台直播终极解决方案:obs-multi-rtmp插件完全指南
  • 新手汽车电子工程师避坑指南:从CANoe到DaVinci,我的Autosar网络管理实战入门笔记
  • 【YOLOv11】071、YOLOv11零样本学习:识别训练中未出现过的类别
  • 基于mHuBERT-147的法语口语理解系统构建指南
  • ARM架构安全配置与权限管理实战解析
  • 安防应急数字孪生技术白皮书——安防应急数字孪生,镜像视界方案成熟可靠
  • Applera1n激活锁绕过工具:解锁iOS设备的专业解决方案
  • 从理论到落地:用SymPyBotics搞定机器人动力学参数辨识(最小惯性参数集实战)
  • 时间序列建模翻车实录:我用错KPSS检验参数,差点把趋势平稳数据当成了单位根
  • Keycloak介绍(开源身份认证与访问控制解决方案)Realm租户、User用户、身份代理、用户联合、LDAP、自定义SPI、多因素认证MFA、硬件密钥WebAuthn、自定义扩展SPI、IAM平台
  • Raspberry Pi AI HAT+ 2 开箱与实战:边缘AI加速器解析
  • 告别繁琐标注!用Detic+ONNX实现开放世界目标检测,一个模型识别万物
  • 从零构建工业级RAG系统:模块化架构、核心技术与实战避坑指南
  • UniApp蓝牙开发避坑实录:从ArrayBuffer处理到电量读取,一个真实物联网项目的踩坑总结