以下链接是个人关于MVSNet(R-MVSNet)-多视角立体深度推导重建 所有见解,如有错误欢迎大家指出,我会第一时间纠正。有兴趣的朋友可以加微信:17575010159 相互讨论技术。若是帮助到了你什么,一定要记得点赞!因为这是对我最大的鼓励。文末附带\color{blue}{文末附带}文末附带公众号−\color{blue}{公众号 -}公众号−海量资源。\color{blue}{ 海量资源}。海量资源。

3D点云重建0-00:MVSNet(R-MVSNet)–目录-史上最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/102852209

Depth Map Refinement

该小结主要讲两个要点,那就是Depth Map Refinement以及Loss(这么聪明的你,肯定从博客题名就猜出来了)。先找到mvsnet/train.py如下代码:

   if FLAGS.refinement:# 获得r imgref_image = tf.squeeze(tf.slice(images, [0, 0, 0, 0, 0], [-1, 1, -1, -1, 3]), axis=1)# 通过r img与推断的到depth_map的结合,获得精炼的特征图refined_depth_map = depth_refine(depth_map, ref_image,FLAGS.max_d, depth_start, depth_interval, is_master_gpu)

其上的核心函数是depth_refine是在model.py中实现,注释如下:

def depth_refine(init_depth_map, image, depth_num, depth_start, depth_interval, is_master_gpu=True):""" refine depth image with the image """# normalization parameters,获得没有经过提炼深度图的相关信息depth_shape = tf.shape(init_depth_map)# 获得深度图的最大深度depth_end = depth_start + (tf.cast(depth_num, tf.float32) - 1) * depth_intervaldepth_start_mat = tf.tile(tf.reshape(depth_start, [depth_shape[0], 1, 1, 1]), [1, depth_shape[1], depth_shape[2], 1])#该处的操作是为了后面深度图的归一化depth_end_mat = tf.tile(tf.reshape(depth_end, [depth_shape[0], 1, 1, 1]), [1, depth_shape[1], depth_shape[2], 1])depth_scale_mat = depth_end_mat - depth_start_mat# normalize depth map (to 0~1),对深度图进行归一化init_norm_depth_map = tf.div(init_depth_map - depth_start_mat, depth_scale_mat)# resize normalized image to the same size of depth image,把输入的图片大小改变成深度图相同的大小resized_image = tf.image.resize_bilinear(image, [depth_shape[1], depth_shape[2]])# refinement network,送入网络进行提炼if is_master_gpu:norm_depth_tower = RefineNet({'color_image': resized_image, 'depth_image': init_norm_depth_map},is_training=True, reuse=False)else:norm_depth_tower = RefineNet({'color_image': resized_image, 'depth_image': init_norm_depth_map},is_training=True, reuse=True)# 得到提炼过后的深度图,但是这是归一化之后的norm_depth_map = norm_depth_tower.get_output()# denormalize depth map,进行缩放,得到实际的深度图refined_depth_map = tf.multiply(norm_depth_map, depth_scale_mat) + depth_start_matreturn refined_depth_map

太简单了,简单得不要不要的,对应论文图示如下:

简单得说,就是初始深度图init_depth_map其是1个通道,r img(该表大小的之后)3个通道合起来4个通道,然后通过一系列的卷积操作,输出一个单通道的深度图refined_depth_map,就这样没没了!

LOSS讲解

下面我们来看了loss的定义,在mvsnet/train.py中找到如下代码:

  # regression loss,接下来为重点,涉及到loss部分# depth_image为标签的深度图,depth_map为网络推断出来的深度图,depth_interval为深度最小单位间隔# 可以看到,求了两次loss,一次是与提炼的深度图,一次是和没有提炼的深度图loss0, less_one_temp, less_three_temp = mvsnet_regression_loss(depth_map, depth_image, depth_interval)loss1, less_one_accuracy, less_three_accuracy = mvsnet_regression_loss(refined_depth_map, depth_image, depth_interval)# 两次loss去平均值loss = (loss0 + loss1) / 2

其上的核心函数mvsnet_regression_loss在mvsnet/loss.py中实现,注释代码如下:

def mvsnet_regression_loss(estimated_depth_image, depth_image, depth_interval):""" compute loss and accuracyestimated_depth_image:网络推断出来的深度图depth_image:标签的深度图depth_interval: 深度刻度尺寸"""# non zero mean absulote loss,非0的平均loss# 有的时候,真实2的深度图是不完整的,那么只对真实深度图中有效的像素进行loss计算masked_mae = non_zero_mean_absolute_diff(depth_image, estimated_depth_image, depth_interval)# less one accuracy,减少3个百分比精度,单网络迭代比较好的时候,estimated_depth_image与depth_image的距离只有# 一个单位的距离时,会参与loss,主要时为了提高精度less_one_accuracy = less_one_percentage(depth_image, estimated_depth_image, depth_interval)# less three accuracy,减少3个百分比精度,单网络迭代比较好的时候,estimated_depth_image与depth_image的距离只有# 3个单位的距离时,会参与loss,主要时为了提高精度less_three_accuracy = less_three_percentage(depth_image, estimated_depth_image, depth_interval)return masked_mae, less_one_accuracy, less_three_accuracy

万变不离其宗,损失函数的的计算就是像素差,论文中的公式的是这样的:

大家要注意的一个点是,深度图作差的时候,只对有效的像素进行的loss计算(结合mask实现)。也就是前景,背景是没有计算loss。还有就是其上的两个函数:

less_one_accuracy = less_one_percentage(depth_image, estimated_depth_image, depth_interval)
less_three_accuracy = less_three_percentage(depth_image, estimated_depth_image, depth_interval)

为什这样了?就是说,当网络越来越好的时候,该两个函数也会也会参与loss计算,让精度更加高。本人感觉很鸡助啊,有时间的朋友可以测试下是不是鸡助。

结语

到这里,整个网络基本都通了把,知道深度图是怎么来的,是吧。下面我们就开始对测试的源码进行解析了,其中还涉及到了对点云的重构。

3D点云重建0-10:MVSNet-源码解析(6)-Depth Map Refinement以及Loss讲解相关推荐

  1. tensorflow 0.10 word2vec 源码解析

    关于word2vec 的解释见word2vec的数学原理. 本代码主要是实现了skip-gram模型,通过神经网络,对概率进行建模(概率模型中的最大似然,其实就是神经网络中的最小损失) # Copyr ...

  2. 【深度学习模型】智云视图中文车牌识别源码解析(二)

    [深度学习模型]智云视图中文车牌识别源码解析(二) 感受 HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等. 代码不可谓不混乱(别忘了这是职业公司的准产品级代码 ...

  3. Android10.0 Service启动源码解析

    本文出自门心叼龙的博客,属于原创类容,未经博主允许,不得转载. Service的启动流程的还是比较简单的,不像Activity那么复杂,相关联的类和方法都少了很多,不像Activity启动流程里面走着 ...

  4. 3D点云重建0-04:MVSNet-白话给你讲论文-翻译无死角(2)

    以下链接是个人关于MVSNet(R-MVSNet)-多视角立体深度推导重建 所有见解,如有错误欢迎大家指出,我会第一时间纠正.有兴趣的朋友可以加微信:17575010159 相互讨论技术.若是帮助到了 ...

  5. BAT高级架构师合力熬夜15天,肝出了这份PDF版《Android百大框架源码解析》,还不快快码住。。。

    前言 为什么要阅读源码? 现在中高级Android岗位面试中,对于各种框架的源码都会刨根问底,从而来判断应试者的业务能力边际所在.但是很多开发者习惯直接搬运,对各种框架的源码都没有过深入研究,在面试时 ...

  6. 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉

    YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...

  7. Mybatis运行原理及源码解析

    Mybatis源码解析 一.前言 本文旨在mybatis源码解析,将整个mybatis运行原理讲解清楚,本文代码地址: https://github.com/lchpersonal/mybatis-l ...

  8. Android Glide图片加载框架(二)源码解析之with()

    文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...

  9. semver 源码解析(Npm library)

    semver 源码解析(Npm library) 文章目录 semver 源码解析(Npm library) 正文 0. 基本信息 1. 源码解析 1.1 核心类型 1.2 SemVer 类型实现核心 ...

  10. 8145v5 参数_SpringBoot外化配置源码解析:外化配置简介、参数处理|value|spring|调用|参数值

    SpringBoot外化配置源码解析 在前面章节我们讲解了 Spring Boot 的运作核心原理及启动过程中进行的一系列核心操作. 从本章开始,我们将针对在实践过程中应用的不同知识点的源代码进行解读 ...

最新文章

  1. python程序员工作怎样-现在Python就业薪资高吗?Python程序员前景怎么样?
  2. LeetCode-滑动窗口-3. 无重复字符的最长子串
  3. Android --- RecyclerView 水平滑动时,一个 item 一个 item 的滑动,禁止滑动到一半停止
  4. Android WebView 在内部打开链接,捕获错误
  5. ListView展示SIM信息
  6. 前端学习(639):undefine和null
  7. .Net AppDomain详解(一)
  8. 判断一颗二叉树是否是二叉排序树
  9. 老司机 iOS 周报 #23 | 2018-06-18
  10. MFC 获取窗口句柄
  11. java rxtx下载_1、下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java2、下载下来的包解压后按照说明放到JAV...
  12. Mysql 省市区字典(带层级,带经纬度,带拼音)
  13. 电子设备的可靠性预计
  14. 一年级课程表(4月18日-4月22日)
  15. 【论文笔记】An End-to-End Model for QA over KBs with Cross-Attention Combining Global Knowledge
  16. 大学数据库创建与查询实战
  17. 966SEO学习网:火车头采集器使用教程(入门+高级)
  18. Scrapy中CrawlSpider
  19. Vue 实现拖拽模块(一)拖拽添加组件
  20. 量子光学偏振态小练习

热门文章

  1. python关闭csv文件_Python文件处理(txt、csv文件读取)
  2. idea 修改前后端代码自动运行
  3. ubunut 安装 pyqt5
  4. difference between a Tensor and a Variable
  5. mysql 本月第几周_Mysql 计算当前日期是本月第几周:一个自定义算法
  6. OpenCascade一些常用的API
  7. 下载频道用户使用指南!!
  8. 加密与解密 调试篇(二) Windows调试器实现(一)
  9. SQL Server 导入Excel数据
  10. Flash网页游戏开发