3D点云重建0-10:MVSNet-源码解析(6)-Depth Map Refinement以及Loss讲解
以下链接是个人关于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讲解相关推荐
- tensorflow 0.10 word2vec 源码解析
关于word2vec 的解释见word2vec的数学原理. 本代码主要是实现了skip-gram模型,通过神经网络,对概率进行建模(概率模型中的最大似然,其实就是神经网络中的最小损失) # Copyr ...
- 【深度学习模型】智云视图中文车牌识别源码解析(二)
[深度学习模型]智云视图中文车牌识别源码解析(二) 感受 HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等. 代码不可谓不混乱(别忘了这是职业公司的准产品级代码 ...
- Android10.0 Service启动源码解析
本文出自门心叼龙的博客,属于原创类容,未经博主允许,不得转载. Service的启动流程的还是比较简单的,不像Activity那么复杂,相关联的类和方法都少了很多,不像Activity启动流程里面走着 ...
- 3D点云重建0-04:MVSNet-白话给你讲论文-翻译无死角(2)
以下链接是个人关于MVSNet(R-MVSNet)-多视角立体深度推导重建 所有见解,如有错误欢迎大家指出,我会第一时间纠正.有兴趣的朋友可以加微信:17575010159 相互讨论技术.若是帮助到了 ...
- BAT高级架构师合力熬夜15天,肝出了这份PDF版《Android百大框架源码解析》,还不快快码住。。。
前言 为什么要阅读源码? 现在中高级Android岗位面试中,对于各种框架的源码都会刨根问底,从而来判断应试者的业务能力边际所在.但是很多开发者习惯直接搬运,对各种框架的源码都没有过深入研究,在面试时 ...
- 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉
YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...
- Mybatis运行原理及源码解析
Mybatis源码解析 一.前言 本文旨在mybatis源码解析,将整个mybatis运行原理讲解清楚,本文代码地址: https://github.com/lchpersonal/mybatis-l ...
- Android Glide图片加载框架(二)源码解析之with()
文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...
- semver 源码解析(Npm library)
semver 源码解析(Npm library) 文章目录 semver 源码解析(Npm library) 正文 0. 基本信息 1. 源码解析 1.1 核心类型 1.2 SemVer 类型实现核心 ...
- 8145v5 参数_SpringBoot外化配置源码解析:外化配置简介、参数处理|value|spring|调用|参数值
SpringBoot外化配置源码解析 在前面章节我们讲解了 Spring Boot 的运作核心原理及启动过程中进行的一系列核心操作. 从本章开始,我们将针对在实践过程中应用的不同知识点的源代码进行解读 ...
最新文章
- python程序员工作怎样-现在Python就业薪资高吗?Python程序员前景怎么样?
- LeetCode-滑动窗口-3. 无重复字符的最长子串
- Android --- RecyclerView 水平滑动时,一个 item 一个 item 的滑动,禁止滑动到一半停止
- Android WebView 在内部打开链接,捕获错误
- ListView展示SIM信息
- 前端学习(639):undefine和null
- .Net AppDomain详解(一)
- 判断一颗二叉树是否是二叉排序树
- 老司机 iOS 周报 #23 | 2018-06-18
- MFC 获取窗口句柄
- java rxtx下载_1、下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java2、下载下来的包解压后按照说明放到JAV...
- Mysql 省市区字典(带层级,带经纬度,带拼音)
- 电子设备的可靠性预计
- 一年级课程表(4月18日-4月22日)
- 【论文笔记】An End-to-End Model for QA over KBs with Cross-Attention Combining Global Knowledge
- 大学数据库创建与查询实战
- 966SEO学习网:火车头采集器使用教程(入门+高级)
- Scrapy中CrawlSpider
- Vue 实现拖拽模块(一)拖拽添加组件
- 量子光学偏振态小练习