【深度学习论文笔记】Depth Map Prediction from a Single Image using a Multi-Scale Deep Network

本文探讨了一种使用卷积神经网络(CNN)进行单张图像深度估计的方法,相较于传统的双目摄像头技术,该方法通过设计多尺度网络结构和引入新的损失函数,实现了图像到深度图像的高效映射。主要创新在于多尺度网络设计和损失函数的改进,旨在同时降低平均误差和像素级误差。

阅读时间:2015.04.26
论文源:NIPS2014
作者及单位: David Eigen  deigen@cs.nyu.edu
Christian Puhrsch  cpuhrsch@nyu.edu
Rob Fergus fergus@cs.nyu.edu
纽约大学

主要内容:通过CNN来进行对单张图片进行深度估计,单张图片进行深度信息估计做的人比较少,一般是用双目摄像头做的。在这里,作者把CNN当作一个黑盒来看待,用CNN来直接学习图像到它的深度图像信息的映射。

创新点:

  1. 正如文章题目所言,相对于传统的CNN,它是多尺度的,(其实也就是两个尺度,一个粗粒度的,一个细粒度的),这个创新点有点弱。
  2. 对于第二个创新,则是它采用了一个新的损失函数形式,也是加一个类似于正则化项的东西。

其它的没有了,看这篇文章主要是因为我目前做的也是用图像来做回归,看看它这边的损失函数有什么新的东西没有。

网络结构:

网络结构
这边解析一下它的网络结构:

  1. 两个层次的结构,第一个网络是由一个除粒度的网络结构,其输入是304 \times 228 大小的图片,而它的输出,则是原图像大小的1/16 左右,这个可以指定,因为它就是设计的全连接层的维度。通过ground true图像就可以训练这样网络了。
  2. 第二个网络结构是细粒度的网络,但是它也是作用在原输入图像上面,并且第二层卷积层会加上第一个网络的输出。第二个网络没有全连接层,是属于全卷积网络。

损失函数:

  1. 损失函数,同时也是对其结果的评价标准,这是文章的第二个创新点,其损失函数为:1 其中2
  2. 第二项\alpha 表示平均的误差项,第一项的前面部分表示每个像素之间的误差项,把第二项加到第一项中做为整体,可以使得同时满足平均误差小同时每个像素的误差也小,相当于一个惩罚项。

实验结果:

1
2

将深度图输入CNN并可视化输出每一层的深度图,可按以下方法实现: ### 数据准备 首先要准备好深度图数据。若有公开的深度图数据集,可直接使用;若没有,可利用Depth Map Prediction from a Single Image using a Multi - Scale Deep Network等方法从单张图片估计出深度图[^1]。 ### 构建CNN模型 使用深度学习框架(如PyTorch或TensorFlow)构建CNN模型。以下是一个简单的PyTorch示例: ```python import torch import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(1, 16, kernel_size=3, padding=1) self.relu1 = nn.ReLU() self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1) self.relu2 = nn.ReLU() def forward(self, x): x = self.relu1(self.conv1(x)) x = self.relu2(self.conv2(x)) return x model = SimpleCNN() ``` ### 输入深度图 将深度图数据处理成合适的格式(如PyTorch中为`torch.Tensor`),并输入到CNN模型中。 ```python import numpy as np # 假设depth_map是读取的深度图,这里简单用随机数据代替 depth_map = np.random.rand(1, 1, 224, 224).astype(np.float32) depth_map = torch.from_numpy(depth_map) # 前向传播 outputs = [] x = depth_map for name, layer in model.named_children(): x = layer(x) outputs.append(x) ``` ### 可视化每一层的输出 使用`matplotlib`库可视化每一层的输出。 ```python import matplotlib.pyplot as plt for i, output in enumerate(outputs): output = output.detach().numpy() num_filters = output.shape[1] fig, axes = plt.subplots(1, num_filters, figsize=(num_filters * 2, 2)) for j in range(num_filters): axes[j].imshow(output[0, j], cmap='gray') axes[j].axis('off') plt.title(f'Layer {i + 1}') plt.show() ```
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值