【翻译】Computing the Stereo Matching Cost with a Convolutional Neural Network

本文提出了一种利用卷积神经网络(CNN)从校正后的图像对中提取深度信息的方法。通过训练CNN预测图像块的匹配程度来计算立体匹配代价,并采用基于交叉的代价聚合与半全局匹配等技术提高精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【学习笔记·翻译】 Computing the Stereo Matching Cost with a Convolutional Neural Network 使用卷积神经网络计算立体匹配代价

原文链接
Jure Z˘ Z ˘ bontar University of Ljubljana jure.zbontar@fri.uni-lj.si
Yann LeCun New York University yann@cs.nyu.edu
译者:suzhiwei

摘要
  我们提供一种从校正后的图像对提取深度信息的方法。我们通过训练卷积神经网络来预测两个图像块的匹配程度,使用它来计算立体匹配代价。代价定义为基于交叉的代价聚合(cross-based cost aggregation)和半全局匹配(semiglobal matching),跟随一个左右一致性检查(consistency check)来消除在遮挡区域(occluded regions)的误差。我们的立体方法在KITTI立体数据集达到2.61%的错误率,并且是目前为止(2014年8月)在这个数据集里性能最高的方法。

1. Introduction 介绍

  考虑以下问题:给定两张从放置在不同水平位置的相机获取的图片,目标是去计算左图每个像素点的视差 d d 。视差是根据一个物体在水平位置左右图像的不同——一个目标点在左图位置(x,y)会出现在右图位置 (xd,y) ( x − d , y ) 。知道了视差 d d , 我们就可以计算出他的深度z(例如目标点到相机的距离)通过以下的关系:

z=fBd,(1) (1) z = f B d ,

其中 f f 是相机焦距的长度,B是两个相机的光心距离。以上表述的问题是立体重建的子问题,其中目的是从一个到多个图像中提取3D形状。根据Scharstein and Szeliski [14]的分类, 一个典型的立体算法包括四个步骤:(1)匹配代价计算,(2)代价聚合,(3)优化,(4)视差精细化。根据Hirschmuller and Scharstein [5], 我们参考步骤(1)和步骤(2)作为计算匹配代价和步骤(3)和步骤(4)作为立体法。我们提议在多对图像块中训练一个卷积神经网络[9] ,其中真实视差是已知的(例如通过LIDAR获取)。网络的输出用来初始化块对之间的匹配代价。匹配代价由相似图像强度的邻近像素点之间融合而成,使用基于交叉(cross-base)的代价聚合(cost aggregation)。平滑约束(Smoothness constraints)通过半全局匹配加强,且左右一致性检查(left-right consistency check)用于在遮挡边界区域(occluded regions)检测和消除误差。本文的两个贡献是:

  • 我们说明了一个卷积神经网络如何用来计算立体匹配代价。
  • 我们在KITTI stereo dataset 达到了2.61%的误差率, 改进了之前最好的成绩2.83%。

  在介绍大立体数据集 [2, 13]之前, 相对较少的立体算法使用基准真值(ground-truth)信息来学习它们模型的参数;本节我们回顾了那些做法。关于立体算法的总体概述参考[14]。
  Kong 和 Tao [6] 使用距离平方和来计算匹配代价(matching cost)初始值。他们训练了一个模型来预测三个分类的概率分布。Kong 和 Tao [7] 后来在不同窗口大小和中心之上通过计算归一化互相关(normalized cross-correlation)融合的预测值来扩展他们的工作。Peris et al. [12] 用 AD-Census [11] 和使用多类线性判别式分析(multiclass linear discriminant analysis)来学习从计算好的匹配代价到最终视差的一个映射。
  基准真值(ground-truth)数据也曾用来学习图形模型的参数。Zhang 和 Seitz [22] 使用交替优化算法(alternative optimization algorithm)来估计马尔可夫随机场超参数(Markov random field hyperparameters)的优化值。Li 和Huttenlocher [10] 提供了使用非参数代价函数的条件随机场模型并使用一个结构化的支持向量机来学习模型参数。
  最近的工作 [3, 15]集中在估计计算出的匹配代价的置信度。Haeusler et al. [3]使用了一个随机森林分类器来预测匹配代价的置信度并使用预测值作为在马尔科夫随机场的软约束来减少立体方法的误差。

Figure1
图1。输入是一个来自左右相机的图像对。两个输入图像的不同大部分来自于物体的水平位置。注意到靠近相机的物体视差相对于远离相机的物体的视差更大。输出是如右图所示的稠密视差映射图,用暖色代表较大的视差值(和较小的深度)。

3. Computing the matching cost 计算匹配代价

  一个典型的立体算法从对于所有视差 d d ,在考虑中的每个位置点p,计算匹配代价 C(p ,d) , d ) 开始。一个简单的例子是绝对差值和( sum of absolute differences,SAD):

CAD(p,d)=qNpIL(qIL(qd)),(2) (2) C A D ( p , d ) = ∑ q ∈ N p | I L ( q − I L ( q d ) ) | ,

  其中 IL(p) I L ( p ) IR(p) I R ( p ) 是左右图像在位置点 p p 的图像强度且 Np N p 是局限在以 p p 为中兴的固定矩形窗口的位置集。我们使用黑体小写字母 ( p p , q q , and r r ) 来表示实数对。附加一个小写 b b 有以下含义:如果 p=(x,y) p = ( x , y ) pd=(xd,y) p d = ( x d , y ) .
  公式(2)可以解释为结合用一个以位置 pd p d 为中心的右图小块匹配一个以位置 p p 为中心的左图小块来度量代价函数。由于好坏匹配的例子可以从公开可用的数据集中获取,例如KITTI [2]和Middlebury [14],我们可以尝试通过有监督学习(supervised learning)的途径去解决匹配问题。

3.1. Creating the dataset 建立数据集

  一个训练的例子包含两部分,一个来自左图和一个来自右图:

<PL9×9(p),PR9×9(q)>,(3) (3) < P 9 × 9 L ( p ) , P 9 × 9 R ( q ) > ,

其中 PL9×9(p) P 9 × 9 L ( p ) 表示一个 9×9 9 × 9 的左图小块,中心在 p=(x,y) p = ( x , y ) 。对于每一个已知真实视差值 d d 的位置,我们提取一个负和一个正的例子。一个负的例子的获取是通过设置右图小块中心 q q
q=(xd+oneg,y),(4) (4) q = ( x − d + o n e g , y ) ,

其中 oneg o n e g 是一个影响匹配的偏移量,从集合 {Nhi,...,Nlo,Nlo,...,Nhi} { N h i , . . . , N l o , N l o , . . . , N h i } 中随机选取。类似地,一个正的例子的是通过设置

q=(xd+opos,y),(5) (5) q = ( x − d + o p o s , y ) ,

其中 opos o p o s 是从集合 {Phi,...,Phi} { − P h i , . . . , P h i } 中随机选择的。包含 opos o p o s 而不是把它设置为零的原因与随后使用的立体方法有关。特别地,我们发现,当网络把低匹配代价指派给好匹配,基于交叉的代价聚合(cross-based cost aggregation)表现地更好,和相邻匹配一样。 Nlo N l o , Nhi N h i , Phi P h i ,和图像块的大小 n n 是这方法的超参数。

3.2. Network architecture 网络结构

  我们所使用的网络架构由图 2 所描绘。该网络包含八层, L1 L8 L 8 。 第一层是卷积的,同时所有其他层是完全连接的。 网络的输入是两个 9×9 9 × 9 的灰度图像块。第一个卷积层包含了32个大小为 5×5×1 5 × 5 × 1 的核心。层 L2 L 2 L3 L 3 每个是通过200个神经元完全连接的。在 L3 L 3 之后两个200维的向量连接到一个400维的向量且传递到 L4 L 4 L7 L 7 这四个完全连接的层,每层用了300个神经元。最后一层 L8 L 8 将输出投射到两个实数,这些实数通过softmax函数馈送,在两个类上产生一个分布(好匹配和坏匹配)。绑定了用于左右图像块的网络在 L1 L 1 L2 L 2 L3 L 3 的权重。除L8外,校正过的线性单元跟随每一层。我们没有在架构中使用池化( pooling)。网络包含接近600千个参数。该架构适用于灰度图像,但可以容易地通过在 L1 L 1 学习 5×5×3 5 × 5 × 3 而不是 5×5×1 5 × 5 × 1 滤波器而扩展到处理RGB图像。网络最优超参数(hyperparameters )(例如层数,每层的神经元数,输入块(patches)的大小)从一个数据集到另一个数据集将有所不同。我们选择这种架构因为他在KITTI stereo dataset中表现地很好。

figure 2
图 2. 我们的卷积神经网络的架构。

3.3. Matching cost 匹配代价

  匹配代价 CCNN(p,d) C C N N ( p , d ) 是从输出网络中直接计算出来的:

CCNN(p,d)=fneg(<PL9×9(p),PR9×9(pd)>),(6) (6) C C N N ( p , d ) = f n e g ( < P 9 × 9 L ( p ) , P 9 × 9 R ( p d ) > ) ,

其中 fneg(<PL,PR>) f n e g ( < P L , P R > ) 是当运行在输入块 PL P L PR P R 对于负类的网络的输出。
  自然地,我们必须对每个图像位置p和在考虑中的每个视差进行向前传递。以下三个实现细节来确保运行时的可管理性:
1. 层 L1 L 1 L2 L 2 L3 L 3 的输出只需要计算每一个位置 p p 一次,并且不需要重新计算每个视差 d d
2. L3 L 3 的输出可以通过馈送网络全分辨率图像而不是 9×9 9 × 9 图像块来计算单个前向通道中的所有位置。为了实现这一点,我们卷积地应用层 L2 L 2 L3 L 3 ——层 L2 L 2 使用滤波器的大小为 5×5×32 5 × 5 × 32 和层L3使用滤波器的大小为 1×1×200 1 × 1 × 200 ,都输出200个特征图。
3. 类似地, L4 L 4 L8 L 8 可以用大小为 1×1 1 × 1 的卷积滤波器来代替,以计算在单个前向传递中的所有位置的输出。不幸的是,我们仍然需要对每个视差进行前向传递。

4. Stereo method 立体方法

  为了有意义地评估匹配代价,我们需要将它与立体方法对比。我们使用的立体方法受到Mei et al. [11]的启发.

4.1. Crossbased cost aggregation 基于交叉的代价聚合

  可以通过在固定窗口上平均匹配代价来融合邻近像素的信息。这种方法在深度不连续的情况下失败,其中违反了窗口内深度不变的假设。我们可能倾向于一种自适应地选择每个像素的邻域的方法,以便仅从具有相似差异的像素中收集支持。在基于交叉的代价聚合( cross-based cost aggregation)[21]中,我们围绕每个位置建立一个局部邻域,形成具有相似图像强度值的像素。
  基于交叉的代价聚合从在每个位置构建垂直的十字架开始。位置 p p 的左支 pl p l 在以下两个条件下保持左延伸:

  • |I(p)I(pl)|<τ | I ( p ) − I ( p l ) | < τ . 在位置 p p pl p l 的图像强度的绝对差值小于 τ τ .
  • ||ppl||<η | | p − p l | | < η . 在 p p pl p l 之间的水平距离 (或者垂直距离, 在顶和底支的情况下) 小于 η η .

类似地构造右(right),低(bottom),顶(top)支(arm)。一旦四个支(arms)已知,我们可以定义支持区域(support region) 其中所有位置 q q 的水平支(horizontal arms)的联合(union)躺在 p p 的垂直支(vertical arm)(看图3)。 Zhang et al. [21]建议聚合(aggregation)应当考虑在一个立体对的两图像的支持区域(the support regions)。令 UL U L UR U R 表示左右图像的支持区域( the support regions )。我们定义融合的支持区域(support regions) Ud U d

Ud(p)={q|qUL(p),qdUR(pd)}.(7) (7) U d ( p ) = { q | q ∈ U L ( p ) , q d ∈ U R ( p d ) } .

Figure 3.

匹配代价是在融合的支持区域的平均:

CoCBCA(p,d)=CCNN(p,d),(8) (8) C C B C A o ( p , d ) = C C N N ( p , d ) ,

CiCBCA(p,d)=1|Ud(p)|qUd(p)Ci1CBCA(q,d),(9) (9) C C B C A i ( p , d ) = 1 | U d ( p ) | ∑ q ∈ U d ( p ) C C B C A i − 1 ( q , d ) ,

  其中 i i 是迭代数字。我们重复该平均过程四次;基于交叉代价聚合是CCBCA4.

4.2. Semiglobal matching 半全局匹配

<think>好的,我现在需要帮助用户解决如何使用MATLAB的Deep Learning Toolbox来创建、训练和比较自定义的CNN架构,应用于CIFAR-10数据集的图像分类任务。首先,我需要确认用户的具体需求:他们希望了解如何调整不同的超参数,比如滤波器大小和学习率,以及如何比较不同架构的性能。 首先,我应该回顾一下MATLAB中用于构建CNN的相关工具和函数。记得Deep Learning Toolbox提供了layerGraph对象,可以逐层构建网络。用户需要自定义架构,所以可能需要使用卷积层、激活层、池化层等。比如,convolution2dLayer来设置滤波器大小和数量,reluLayer作为激活函数,maxPooling2dLayer用于池化。还需要全连接层和分类层。 接下来是数据准备。CIFAR-10数据集在MATLAB中是否有内置的支持?可能需要使用imageDatastore来加载数据,并分成训练集、验证集和测试集。预处理步骤可能包括归一化,比如将图像数据从0-255缩放到0-1之间。此外,数据增强也是常用的方法,比如随机翻转、平移等,这可以通过imageDataAugmenter来实现,以增加模型的泛化能力。 然后是创建不同架构的部分。用户提到不同的超参数,比如滤波器大小和学习率。这里可能需要编写一个函数或脚本来生成不同配置的网络。例如,可以设计一个循环,遍历不同的滤波器尺寸(如3x3、5x5)或学习率(0.001、0.0001),然后为每个配置创建对应的网络结构。同时,要注意网络的深度,比如增加或减少卷积层的数量,以观察对性能的影响。 训练过程需要用到trainingOptions函数来设置训练参数,包括优化器(如Adam)、学习率、周期数(epoch)、批大小(mini-batch size)、验证频率等。用户可能需要将不同的超参数组合传入这个函数,然后使用trainNetwork进行训练。需要注意的是,训练CNN可能需要较长时间,尤其是当数据集较大或网络较深时,所以用户可能需要使用GPU加速,MATLAB支持通过Parallel Computing Toolbox利用GPU资源。 在比较不同模型时,用户需要记录每个模型的训练结果,如训练损失、验证准确率、测试准确率等。可能还需要可视化训练过程,比如绘制损失曲线和准确率曲线,以观察模型是否过拟合或欠拟合。此外,混淆矩阵和分类报告(如精确率、召回率)也是评估模型性能的重要工具。 用户可能遇到的困难包括如何高效地管理多个实验的超参数和结果,这时候可能需要使用实验管理器(Experiment Manager)工具,它可以帮助自动化超参数搜索,并记录每次实验的结果。另外,调试网络结构时,确保各层的尺寸匹配也很重要,比如卷积层的输出尺寸是否与下一层的输入匹配,避免维度错误。 参考引用中提到,CNN能够捕捉医学图像中的空间依赖性,这对分类任务有效[^1]。这可能提示用户,在调整滤波器大小时,较小的滤波器可能更适合捕捉细节特征,而较大的滤波器可能覆盖更大的区域,但需要根据具体任务权衡。同时,引用[3]提到构建和训练神经网络的挑战,包括超参数调整和训练策略,所以用户需要系统地测试不同配置,而不是随机尝试。 最后,生成相关问题时要围绕CNN的设计、超参数优化、MATLAB工具的使用以及模型评估等方面展开,帮助用户深入理解每个步骤的细节和潜在问题。</think>### 分步指南:使用MATLAB创建、训练和比较自定义CNN #### 1. **数据准备** 使用CIFAR-10数据集时,可通过MATLAB内置函数`cifar10TestData`和`cifar10TrainData`加载数据,并进行归一化(将像素值缩放到$[0,1]$): ```matlab [XTrain, YTrain] = cifar10TrainData; XTest = cifar10TestData; XTrain = single(XTrain)/255; % 归一化 XTest = single(XTest)/255; ``` #### 2. **定义CNN架构** 通过`layerGraph`逐层构建网络,例如: ```matlab layers = [ imageInputLayer([32 32 3]) % CIFAR-10图像尺寸为32x32x3 convolution2dLayer(3, 16, 'Padding', 'same') % 3x3滤波器,16通道 reluLayer maxPooling2dLayer(2, 'Stride', 2) convolution2dLayer(5, 32, 'Padding', 'same') % 5x5滤波器,32通道 reluLayer fullyConnectedLayer(10) % CIFAR-10有10类 softmaxLayer classificationLayer]; ``` #### 3. **设置训练选项** 使用`trainingOptions`配置优化器和超参数: ```matlab options = trainingOptions('adam', ... 'InitialLearnRate', 0.001, ... 'MaxEpochs', 20, ... 'MiniBatchSize', 128, ... 'ValidationData', {XTest, YTest}, ... 'Plots', 'training-progress'); ``` #### 4. **训练与比较模型** - **多架构对比**:通过循环或脚本生成不同滤波器尺寸(如3x3 vs 5x5)和学习率(如0.001 vs 0.0001)的模型。 - **记录结果**:保存每个模型的验证准确率和训练时间。 ```matlab % 示例:不同学习率对比 learningRates = [0.001, 0.0005]; for lr = learningRates options.InitialLearnRate = lr; net = trainNetwork(XTrain, YTrain, layers, options); % 保存模型和结果 end ``` #### 5. **可视化与评估** - **绘制学习曲线**:通过`training-progress`图观察过拟合现象。 - **混淆矩阵**:使用`confusionchart`分析分类性能: ```matlab YPred = classify(net, XTest); confusionchart(YTest, YPred); ``` #### 6. **优化建议** - **数据增强**:通过`imageDataAugmenter`增加训练数据多样性: ```matlab augmenter = imageDataAugmenter('RandXReflection', true); augimds = augmentedImageDatastore([32 32 3], XTrain, YTrain, 'DataAugmentation', augmenter); ``` - **正则化**:添加Dropout层(如`dropoutLayer(0.5)`)减少过拟合[^3]。 --- ### 关键问题解答 1. **如何选择滤波器尺寸?** 小尺寸(如3x3)适合捕捉局部特征,计算成本低;大尺寸(如5x5)覆盖更大区域,但参数更多。通常堆叠小滤波器更高效。 2. **如何调整学习率?** 初始学习率可设为0.001(Adam优化器默认值),若验证损失波动大,尝试降低至0.0001。使用`learningRateSchedule`逐步衰减。 3. **如何加速训练?** 启用GPU支持(需Parallel Computing Toolbox): ```matlab options.ExecutionEnvironment = 'gpu'; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值