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

无监督MVSNet系列网络概述

目录

Unsup-MVSNet

PatchMatchNet代码总框架

算法流程

自监督网络JDACS-MS代码总框架

交叉熵

常用的三个Loss原理

VGG网络


Unsup-MVSNet

实现无监督的MVS
使用鲁棒的光度一致性Loss实现无监督 深度图估计,克服不同视图下的光照变化 和遮挡问题
https://link.zhihu.com/?target=https%3A//github.com/YoYo000/MVSNet
MVS2
在之前标准的无监督Loss基础上又提出 了cross-view一致性Loss
深度图优化采用SPN进行优化
M^3VSNet
结合pixel-wisefeature-wise构建Loss
加入法向量一致性Loss提高深度图估 计的准确性和连续性

PatchMatchNet代码总框架

算法流程

特征计算
基于FPN的多尺度特征提取
depth初始化:
如果是第一次迭代:随机初始化48层(参数可调)
如果是第二次及后续N次:在第一次迭代得到的深度图为中心上下采样几层(局部扰动),再
加上自适应传播从邻域N_neighbor传播过来的N_neighbor个深度图层。
匹配代价计算与代价聚合
得到depth hypothesis后,计算匹配代价(warp srcfeature ref对应depth层下,匹配
相似性计算见论文公式3),使用Pixel-wise view weight进行聚合得到[B,Ndepth,H,W](参
考公式5
对每个像素和每个depth hypothesis,自适应采样一些邻域内的像素进行cost aggregation.
所有邻域相对中心像素的权重与对应深度乘积和(参加公式6
深度图计算与优化
得到所有costs以后,用softmax得到每个hypothesis对应的概率,然后求期望得到估计值。
优化这部分跟MVSNet相同,由refrgb引导计算一个残差与初始深度图加和即为优化后的深
度图

自监督网络JDACS-MS代码总框架

交叉熵

Cross Entropy损失函数常用于分类问题中,很容易的的进行求导计算
常用的结构:
1. 神经网络最后一层得到每个类别的得分scores(也叫logits);
2. 该得分经过sigmoid(softmax)函数获得概率输出;
3. 模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算
参考链接:https://zhuanlan.zhihu.com/p/35709485

常用的三个Loss原理

SSIM Loss
度量两个图像之间的相似性
光度一致性Loss
warp N-1 Source图像到Refer图像上,计算两者的梯度和颜色差异
平滑Loss
深度图变化大的地方rgb的变化也比较大
训练脚本 train.py def train() 函数
network.py CVP网络
在第二个scale时,计算深度层的间隔推导如下:

VGG网络

VGG网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2max pooling
train.py def train_sample_aug() 数据增强Loss

import numpy as np
from read_write_model import read_model, write_model
from tempfile import mkdtempdef compare_cameras(cameras1, cameras2):assert len(cameras1) == len(cameras2)for camera_id1 in cameras1:camera1 = cameras1[camera_id1]camera2 = cameras2[camera_id1]assert camera1.id == camera2.idassert camera1.width == camera2.widthassert camera1.height == camera2.heightassert np.allclose(camera1.params, camera2.params)def compare_images(images1, images2):assert len(images1) == len(images2)for image_id1 in images1:image1 = images1[image_id1]image2 = images2[image_id1]assert image1.id == image2.idassert np.allclose(image1.qvec, image2.qvec)assert np.allclose(image1.tvec, image2.tvec)assert image1.camera_id == image2.camera_idassert image1.name == image2.nameassert np.allclose(image1.xys, image2.xys)assert np.array_equal(image1.point3D_ids, image2.point3D_ids)def compare_points(points3D1, points3D2):for point3D_id1 in points3D1:point3D1 = points3D1[point3D_id1]point3D2 = points3D2[point3D_id1]assert point3D1.id == point3D2.idassert np.allclose(point3D1.xyz, point3D2.xyz)assert np.array_equal(point3D1.rgb, point3D2.rgb)assert np.allclose(point3D1.error, point3D2.error)assert np.array_equal(point3D1.image_ids, point3D2.image_ids)assert np.array_equal(point3D1.point2D_idxs, point3D2.point2D_idxs)def main():import sysif len(sys.argv) != 3:print("Usage: python read_model.py ""path/to/model/folder/txt path/to/model/folder/bin")returnprint("Comparing text and binary models ...")path_to_model_txt_folder = sys.argv[1]path_to_model_bin_folder = sys.argv[2]cameras_txt, images_txt, points3D_txt = \read_model(path_to_model_txt_folder, ext=".txt")cameras_bin, images_bin, points3D_bin = \read_model(path_to_model_bin_folder, ext=".bin")compare_cameras(cameras_txt, cameras_bin)compare_images(images_txt, images_bin)compare_points(points3D_txt, points3D_bin)print("... text and binary models are equal.")print("Saving text model and reloading it ...")tmpdir = mkdtemp()write_model(cameras_bin, images_bin, points3D_bin, tmpdir, ext='.txt')cameras_txt, images_txt, points3D_txt = \read_model(tmpdir, ext=".txt")compare_cameras(cameras_txt, cameras_bin)compare_images(images_txt, images_bin)compare_points(points3D_txt, points3D_bin)print("... saved text and loaded models are equal.")print("Saving binary model and reloading it ...")write_model(cameras_bin, images_bin, points3D_bin, tmpdir, ext='.bin')cameras_bin, images_bin, points3D_bin = \read_model(tmpdir, ext=".bin")compare_cameras(cameras_txt, cameras_bin)compare_images(images_txt, images_bin)compare_points(points3D_txt, points3D_bin)print("... saved binary and loaded models are equal.")if __name__ == "__main__":main()

http://www.xdnf.cn/news/1211887.html

相关文章:

  • 高效管理Hosts文件的终极工具
  • 【Qt开发】信号与槽(三)-> 自定义信号和槽
  • Python 程序设计讲义(46):组合数据类型——集合类型:集合间运算
  • 解决 Node.js 托管 React 静态资源的跨域问题
  • 力扣54:螺旋矩阵
  • 疯狂星期四文案网第24天运营日记
  • 永磁同步电机FOC控制----电流采样的实现
  • 【Lambda】flatMap使用案例
  • 字节跳动“扣子”(Coze)开源:AI智能体生态的技术革命
  • 从结构到交互:HTML5进阶开发全解析——语义化标签、Canvas绘图与表单设计实战
  • 微软OpenAI展开深入谈判
  • DIV 指令概述
  • 视觉语言模型在视觉任务上的研究综述
  • HTML第一次作业
  • JavaWeb 进阶:Vue.js 与 Spring Boot 全栈开发实战(Java 开发者视角)
  • 【数据结构初阶】--二叉树(四)
  • Prometheus-1--什么是Prometheus?
  • Docker网络技术深度研究与实战手册
  • C++类中动态内存分配注意手册
  • 基于springboot的零食商城的设计与实现/零食销售系统的设计与实现
  • 每日学习笔记记录(分享更新版-凌乱)
  • LeetCode 11 - 盛最多水的容器
  • Vue.js 指令系统完全指南:深入理解 v- 指令
  • python的进程、线程、锁
  • DNS污染与劫持
  • Wndows Docker Desktop-Unexpected WSL error错误
  • 项目历程—生命数组游戏(两版本)
  • Vulkan入门教程 | 第二部分:创建实例
  • “非参数化”大语言模型与RAG的关系?
  • 并查集介绍及典型应用和编程题