【代码分析】MPI
代码解读
问题
- model/AdaMPI.py:21 为什么下降分辨率
- model.CPN.unet.FeatMaskNetwork 为什么用的是mask,unet?
MPI
class MPIPredictor(nn.Module):def __init__(self,width=384,height=256,num_planes=64,):super(MPIPredictor, self).__init__()self.num_planes = num_planesdisp_range = [0.001, 1]self.far, self.near = disp_range
self.far, self.near = disp_range 规定深度,必须归一化。
特征掩码: 训练过程中动态地隐藏或者“掩盖”数据的一部分,从而使模型能够更加健壮,能够处理不完整的输入数据,或者是为了增强模型对数据的理解。
在使用注意力机制时,特征掩码可以用来防止模型在计算注意力分布时考虑到某些不应该被看见的信息.
在解码器中防止模型“看到”未来的信息。
def forward(self, src_imgs, # 源图像和相应的深度图src_depths, ): # 源图像和深度图下采样到 self.low_res_size 指定的较低分辨率# align_corners=True 参数确保下采样后角点对齐rgb_low_res = F.interpolate(src_imgs, size=self.low_res_size, mode='bilinear', align_corners=True)disp_low_res = F.interpolate(src_depths, size=self.low_res_size, mode='bilinear', align_corners=True)bs = src_imgs.shape[0]# 创建了一个在 self.near 和 self.far 之间的视差线性空间,点数为 self.num_planes + 2。# [1:-1] 切片去掉了第一个和最后一个值。这个张量随后被移到和 src_imgs 相同的设备上(为了支持 GPU),# 增加了一个批次维度,并重复以匹配批次中的每个元素。dpn_input_disparity = torch.linspace(self.near, self.far, self.num_planes + 2)[1:-1].to(src_imgs.device).unsqueeze(0).repeat(bs, 1)# 使用准备好的视差张量以及下采样后的图像和深度图来生成渲染的视差render_disp = self.dpn(dpn_input_disparity, rgb_low_res, disp_low_res)# 使用原始图像、深度和渲染的视差来生成特征掩码feature_mask = self.fmn(src_imgs, src_depths, render_disp)# Encoder forward# 处理输入的图像和深度图通过几层或几个块,输出结果被存储在编码器特征列表中conv1_out, block1_out, block2_out, block3_out, block4_out = self.encoder(src_imgs, src_depths)enc_features = [conv1_out, block1_out, block2_out, block3_out, block4_out]# Decoder forward# 接收编码器特征和特征掩码作为输入,产生最终的输出outputs = self.decoder(enc_features, feature_mask)return outputs[0], render_disp # 最终预测的图像或深度图,以及渲染的视差
PAN
平面调整网络,哪个层在多深位置上。
没找到定义方式,PAN.py中没有
CPN
颜色预测网络
编码 、解码、U-Net
DPN
class DepthPredictionNetwork(nn.Module):"""从初始视差(init_disp)、低分辨率RGB图像(rgb_low_res)和低分辨率视差信息(disp_low_res)中预测深度值。"""def __init__(self, disp_range, **kwargs):super().__init__()# 降低输入数据的维度,同时增加特征维度self.context_encoder = DownsizeEncoder(num_blocks=5, dim_in=5, dim_out=128)# MultiheadSelfAttention自注意力模块,它专门用于处理序列化的向量self.self_attention = MultiheadSelfAttention(num_heads=4, dim_in=128, dim_qk=32, dim_v=128) # 嵌入层embed,它将特征进一步处理为更小的维度(从128降到32),然后是一个ReLU激活函数。self.embed = nn.Sequential(nn.Linear(128, 32),nn.ReLU(),)# 将嵌入层的输出进一步处理并映射到视差值的范围内self.to_disp = LinearSigmoid(32, disp_range)def forward(self, init_disp, rgb_low_res, disp_low_res):B, S = init_disp.shape# context encoder# 将RGB图像、低分辨率的视差信息和初始视差拼接在一起,形成一个有5个通道的输入x = torch.cat([rgb_low_res[:, None, ...].repeat(1, S, 1, 1, 1), disp_low_res[:, None, ...].repeat(1, S, 1, 1, 1), init_disp[:, :, None, None, None].repeat(1, 1, 1, *rgb_low_res.shape[-2:])], dim=-3) # [b, s, 5, h/4, w/4]x = x.view(-1, *x.shape[-3:]) # [b*s, 5, h/4, w/4]# 降低输入数据的维度,同时增加特征维度context = self.context_encoder(x) # [b*s, c, h/128, w/128]# 自适应平均池化(F.adaptive_avg_pool2d)将特征降维,并压缩到一个向量。context = F.adaptive_avg_pool2d(context, (1, 1)).squeeze(-1).squeeze(-1) # [b*s, c]context = context.view(B, S, -1) # [b, s, c]# self attention# 自注意力处理,以捕获不同初始视差之间的关系feat_atted = self.self_attention(context) # [b, s, c ]# 更小的维度feat = self.embed(feat_atted) # [b, s, c]# 特征映射为最终的视差预测值disp_bs = self.to_disp(feat, init_disp) # [b, s]return disp_bs
FMN
UNET
class FeatMaskNetwork(nn.Module):def __init__(self, **kwargs):super().__init__()self.conv1 = ConvBNReLU(5, 16, 3, 1, 1)self.conv2 = ConvBNReLU(16, 32, 3, 2, 1)self.conv3 = ConvBNReLU(32, 64, 3, 2, 1)self.conv4 = ConvBNReLU(64, 128, 3, 2, 1)self.conv5 = ConvBNReLU(128, 128, 3, 1, 1)self.conv6 = ConvBNReLU(192, 64, 3, 1, 1)self.conv7 = ConvBNReLU(96, 32, 3, 1, 1)self.conv8 = ConvBNReLU(48, 16, 3, 1, 1)self.conv9 = ConvBNReLU(16, 1, 3, 1, 1)self.upsample = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True) # 上采样层def forward(self, input_image, input_depth, input_mpi_disparity):'''input_image: [b,3,h,w]input_depth: [b,1,h,w] 深度数据input_mpi_disparity: [b,s] 多平面图像(MPI)视差'''"""将 input_image、input_depth 和 input_mpi_disparity 扩展到相同的维度,使得它们能够在空间维度上与每个MPI平面对齐。"""_, _, h, w = input_image.size() # spatial dimb, s = input_mpi_disparity.size() # number of mpi planes# repeat input rgbexpanded_image = input_image.unsqueeze(1).repeat(1, s, 1, 1, 1) # [b,s,3,h,w]# repeat input depthexpanded_depth = input_depth.unsqueeze(1).repeat(1, s, 1, 1, 1) # [b,s,1,h,w]# repeat and reshape input mpi disparityexpanded_mpi_disp = input_mpi_disparity[:, :, None, None, None].repeat(1, 1, 1, h, w) # [b,s,1,h,w]# concat together# 将这些扩展后的数据沿通道维度拼接,并重塑成 [bs,5,h,w] 的形状x = torch.cat([expanded_image, expanded_depth, expanded_mpi_disp], dim=2).reshape(b * s, 5, h, w) # [bs,5,h,w]# forwardc1 = self.conv1(x)c2 = self.conv2(c1)c3 = self.conv3(c2)c4 = self.conv4(c3)c5 = self.conv5(c4)u5 = self.upsample(c5)c6 = self.conv6(torch.cat([u5, c3], dim=1))u6 = self.upsample(c6)c7 = self.conv7(torch.cat([u6, c2], dim=1))u7 = self.upsample(c7)c8 = self.conv8(torch.cat([u7, c1], dim=1))c9 = self.conv9(c8) # [bs,1,h,w]fm = c9.reshape(b, s, h, w)# 特征蒙版经过 softmax 函数处理,以获取每个MPI平面上每个像素位置的归一化权重。# 对每个MPI平面上的特征贡献的概率分布,这在合成新视角图像或进行深度估计时非常有用。# 通过 softmax 保证了每个像素位置上所有平面权重的和为1,使其可以被解释为概率fm = torch.softmax(fm ,dim=1)return fm
FeatMaskNetwork((conv1): ConvBNReLU((layer): Sequential((0): Conv2d(5, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()))(conv2): ConvBNReLU((layer): Sequential((0): Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))(1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()))(conv3): ConvBNReLU((layer): Sequential((0): Conv2d(32, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()))(conv4): ConvBNReLU((layer): Sequential((0): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()))(conv5): ConvBNReLU((layer): Sequential((0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()))(conv6): ConvBNReLU((layer): Sequential((0): Conv2d(192, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()))(conv7): ConvBNReLU((layer): Sequential((0): Conv2d(96, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()))(conv8): ConvBNReLU((layer): Sequential((0): Conv2d(48, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()))(conv9): ConvBNReLU((layer): Sequential((0): Conv2d(16, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): BatchNorm2d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()))(upsample): Upsample(scale_factor=2.0, mode=bilinear)
)
相关文章:
【代码分析】MPI
代码解读 问题 model/AdaMPI.py:21 为什么下降分辨率model.CPN.unet.FeatMaskNetwork 为什么用的是mask,unet? MPI class MPIPredictor(nn.Module):def __init__(self,width384,height256,num_planes64,):super(MPIPredictor, self).__init__()self.…...
数字孪生Web3D智慧机房可视化运维云平台建设方案
前言 进入信息化时代,数字经济发展如火如荼,数据中心作为全行业数智化转型的智慧基座,重要性日益凸显。与此同时,随着东数西算工程落地和新型算力网络体系构建,数据中心建设规模和业务总量不断增长,机房管理…...
飞天使-docker知识点12-docker-compose
文章目录 docker-compose命令启动单个容器重启容器停止和启动容器停止和启动所有容器演示一个简单示范 docker-compose 部署有依赖问题 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用简单的 YAML 文件来配置应用程序的服务、网络和存储等方…...
快速排序(一)
目录 快速排序(hoare版本) 初级实现 问题改进 中级实现 时空复杂度 高级实现 三数取中 快速排序(hoare版本) 历史背景:快速排序是Hoare于1962年提出的一种基于二叉树思想的交换排序方法 基本思想:…...
GO的sql注入盲注脚本
之间学习了go的语法 这里就开始go的爬虫 与其说是爬虫 其实就是网站的访问如何实现 因为之前想通过go写sql注入盲注脚本 发现不是那么简单 这里开始研究一下 首先是请求网站 这里貌似很简单 package mainimport ("fmt""net/http" )func main() {res, …...
写好ChatGPT提示词原则之:清晰且具体(clear specific)
ChatGPT 的优势在于它允许用户跨越机器学习和深度学习的复杂门槛,直接利用已经训练好的模型。然而,即便是这些先进的大型语言模型也面临着上下文理解和模型固有局限性的挑战。为了最大化这些大型语言模型(LLM)的潜力,关…...
Java实现快速排序及其动图演示
快速排序(Quicksort)是一种基于分治思想的排序算法。它通过选择一个基准元素,将数组分为两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素,然后递归地对这两个子数…...
iClient3D 图元操作
1. S3MTilesLayer,S3M(Spatial 3D Model)图层类 S3MTilesLayer,S3M(Spatial 3D Model)图层类,通过该图层实现加载三维切片缓存,包括倾斜摄影模型、BIM模型、点云数据、精细模型、矢量数据、符号等。 那S3MTilesLayer中针对图元的…...
从0到1!开发小白快速入门腾讯云数据库
在这个海量数据大爆发的时代,一个单一的开源数据库产品往往很难直接满足企业的业务需求,在某些场景下,无论是性能、安全还是稳定性,都面临着各种各样的问题。 你在工作中也有这样的烦恼的话,一定是因为你还没有使用过…...
Golang清晰代码指南
发挥易读和易维护软件的好处 - 第一部分 嗨,开发者们,清晰的代码是指编写易于阅读、理解和维护的软件代码。它是遵循一组原则和实践,优先考虑清晰性、简单性和一致性的代码。清晰的代码旨在使代码库更易管理,减少引入错误的可能性…...
C语言 文件I/O(备查)
所有案列 跳转到其他。 文件打开 FILE* fopen(const char *filename, const char *mode); 参数:filename:指定要打开的文件名,需要加上路径(相对、绝对路径)mode:指定文件的打开模式 返回值:成…...
web(HTML之表单练习)
使用HTML实现该界面: 要求如下: 用户名为文本框,名称为 UserName,长度为 15,最大字符数为 20。 密码为密码框,名称为 UserPass,长度为 15,最大字符数为 20。 性别为两个单选按钮&a…...
通过对象轮换实现 LRU 缓存结构
文章目录 通过两个对象轮换,按照是否访问实现内容长久保存rollup 的缓存实现 export default function (max) { //max 缓存容量var num, curr, prev;var limit max || 1;function keep(key, value) {if (num > limit) {prev curr; // 超过容量时当前对象变成缓…...
【Unity动画】综合案例完结-控制角色动作播放+声音配套
这个案例实现的动作并不复杂,主要包含一个 跳跃动作、攻击动作、还有一个包含三个动画状态的动画混合树。然后设置三个参数来控制切换。 状态机结构如下: 完整代码 using System.Collections; using System.Collections.Generic; using UnityEngine;pu…...
【工作流Activiti】任务组
1、Candidate-users候选人 1.1、需求 在流程定义中在任务结点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果要临时变更任务负责人则需要修改流程定义,系统扩展性很差,针对这种情况,我…...
桌面概率长按键盘无法连续输入问题
问题描述:概率性长按键盘无法连续输入文本 问题定位: 系统按键流程分析 图一 系统按键流程 按键是由X Server接收的,这一点只要明白了X Window的工作机制就不难理解了。X Server在接收到按键后,会转发到相应程序的窗口中。在窗…...
用23种设计模式打造一个cocos creator的游戏框架----(十九)备忘录模式
1、模式标准 模式名称:备忘录模式 模式分类:行为型 模式意图:在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态 结构图: 适用于: …...
动手学深度学习-自然语言处理-预训练
词嵌入模型 将单词映射到实向量的技术称为词嵌入。 为什么独热向量不能表达词之间的相似性? 自监督的word2vec。 word2vec将每个词映射到一个固定长度的向量,这些向量能更好的表达不同词之间的相似性和类比关系。 word2vec分为两类,两类…...
力扣200. 岛屿数量(java DFS解法)
Problem: 200. 岛屿数量 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该问题可以归纳为一类遍历二维矩阵的题目,此类中的一部分题目可以利用DFS来解决,具体到本题目: 1.我们首先要针对于二维数组上的每一个点,尝试展…...
解决el-table组件中,分页后数据的勾选、回显问题?
问题描述: 1、记录一个弹窗点击确定按钮后,table列表所有勾选的数据信息2、再次打开弹窗,回显勾选所有保存的数据信息3、遇到的bug:切换分页,其他页面勾选的数据丢失;点击确认只保存当前页的数据࿱…...
零基础一键配置黑苹果:OpCore-Simplify智能工具让复杂变简单
零基础一键配置黑苹果:OpCore-Simplify智能工具让复杂变简单 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果配置时面对满屏代…...
ESP32硬件定时器虚拟化:16路ISR定时器实现原理与工程实践
1. ESP32_New_TimerInterrupt 库深度解析:16路高精度硬件定时器中断的工程实践1.1 为什么嵌入式系统迫切需要此库在ESP32系列微控制器的实际工程开发中,硬件定时器资源极其稀缺且关键。标准ESP32芯片仅配备两组定时器组(Timer Group 0/1&…...
收藏!小白也能看懂的大模型如何改写工业效率?
收藏!小白也能看懂的大模型如何改写工业效率? 本文介绍了中控技术的TPT大模型在工业生产中的应用,它通过实时监控、自动计算最优参数和风险预警,帮助企业提升效率、降低成本。与互联网领域的AI应用不同,工业AI的价值更…...
老牌CMS的隐痛:从DedeCMS漏洞看开源系统会员模块的安全设计误区
DedeCMS会员模块漏洞剖析:开源系统安全设计的深层反思 当一款拥有百万级安装量的老牌CMS系统曝出前台任意密码修改漏洞时,我们看到的不仅是一个具体的技术缺陷,更是开源项目在安全架构设计上的系统性隐忧。2018年那场影响广泛的DedeCMS漏洞事…...
告别Python环境依赖!用PyInstaller打包Tkinter/Selenium程序的最佳实践
告别Python环境依赖!用PyInstaller打包Tkinter/Selenium程序的最佳实践 你是否遇到过这样的尴尬场景?精心开发的Python程序在本地运行完美,但分享给同事或客户时,对方却因为缺少Python环境或依赖库而无法使用。尤其当程序涉及图形…...
从IMU初始化到点云去畸变:深入Fast-LIO2的传感器融合核心流程
从IMU初始化到点云去畸变:Fast-LIO2传感器融合全流程解析 在自动驾驶和机器人定位领域,激光雷达与IMU的紧耦合系统正成为高精度状态估计的主流方案。Fast-LIO2作为这一技术路线的代表,其核心创新在于将IMU的动力学特性与激光点云几何特征深度…...
微信支付回调通知收不到的5个隐藏坑(附.NET Core实战解决方案)
微信支付回调通知失效的深度排查与.NET Core实战指南 当支付流程顺利完成但回调通知却神秘消失时,这种"薛定谔式的支付成功"往往让开发者陷入调试泥潭。本文将揭示五个容易被忽视的技术暗礁,并提供可直接集成到生产环境的.NET Core解决方案。 …...
智能汽车远程诊断怎么玩?深入聊聊DoIP协议里的那些‘暗号’:VIN、EID、激活线与安全
智能汽车远程诊断的通信密码:DoIP协议中的VIN、EID与安全设计解析 当你的爱车亮起故障灯时,4S店技师只需轻点平板电脑,就能远程读取车辆状态——这背后是车载以太网诊断协议(DoIP)在发挥作用。不同于传统CAN总线诊断,基于IP网络的…...
你还在用QGIS导出再读Python?实时对接Google Earth Engine的Python SDK深度调优(延迟<800ms,吞吐量提升17倍)
第一章:Python 遥感数据分析遥感数据具有多源、多时相、高维度和大体积的特点,Python 凭借其丰富的科学计算生态(如 NumPy、SciPy、GDAL/OGR、rasterio、xarray 和 scikit-learn)已成为遥感信息提取与分析的主流工具。本章聚焦于使…...
告别手推雅可比!用Ceres自动求导搞定SLAM中的BA优化(附完整代码)
告别手推雅可比!用Ceres自动求导搞定SLAM中的BA优化(附完整代码) 在视觉SLAM系统的开发中,Bundle Adjustment(BA)优化是提升定位与建图精度的关键环节。传统实现需要手动推导复杂的雅可比矩阵,不…...
