跳到内容

jzbontar/mc-cnn公司

存储库文件导航

通过训练卷积神经网络比较图像块的立体匹配

存储库包含

  • 使用卷积神经网络计算立体匹配成本的过程;
  • 在立体匹配任务中训练卷积神经网络的步骤;
  • 基本立体方法(基于交叉的成本聚合、半全局匹配、,左右一致性检查、中值滤波器和双边滤波器);

在KITTI上运行需要具有至少6 GB内存的NVIDIA GPU数据集和12 GB在Middlebury数据集上运行。我们在GTX上测试了代码Titan(仅限KITTI)、K80和GTX Titan X。该代码是根据BSD 2条款许可证发布的。请引用我们的纸张如果您在工作中使用此存储库中的代码。

@文章{zbontar2016立体声,title={通过训练卷积神经网络来比较图像补丁的立体匹配},author={Zbontar,Jure和LeCun,Yann},journal={机器学习研究杂志},体积={17},页数={1--32},年份={2016年}}

下载经过培训的网络

计算匹配成本

安装火炬,OpenCV 2.4版、和png公司++.

在与此README文件相同的目录中运行以下命令。

编译共享库:

$cp生成文件.proto生成文件$制造

该命令应生成两个文件:libadcensus.so公司libcv.so公司.

在KITTI 2012训练集中的立体声对上运行立体声算法-

  • 左侧输入图像
  • 右侧输入图像

-下载预处理网络并调用主.lua具有以下参数:

$wget-P净值/https://s3.amazonaws.com/mc-cnn/net_kitti_fast_-a_train_all.t7(网址:https://s3.amazonaws.com/mc-cnn/net_kitti_fast_-a_train_all.t7)$ ./main.lua kitti fast-a predict-net_name net/net_kitti_fast_a_train_all.t7-left samples/input/kittiL.png-right samples-input/kittiR.png-disp_max 70向右书写。笔尖,1 x 70 x 370 x 1226向左书写.bin,1 x 70 x 370 x 1226书写显示框,1 x 1 x 370 x 1226

前两个参数(基蒂禁食)用于设置默认值立体方法的超参数。输出存储为三个二进制文件夹:

  • 左.bin:半全局匹配和交叉匹配后的匹配成本将左图像作为参考图像进行成本汇总。
  • right.bin(右侧):与相同左.bin,但正确的图像被视为参考图像。
  • 显示.bin:全立体方法后的视差贴图。

使用bin2png.lua脚本生成.png码如上图所示:

$luajit样本/bin2png.lua正在写入left.png向右书写.png正在写入disp.png

如果您希望使用原始卷积神经网络输出,即:,在不应用基于交叉的成本聚合和半全局匹配的情况下,运行以下命令:

$ ./main.lua kitti fast-a predict-net_name net/net_kitti_fast_a_train_all.t7-left samples/input/kittiL.png-right samples-input/kittiR.png-disp_max 70-sm_terminate cnn向右书写。笔尖,1 x 70 x 370 x 1226书写左侧。笔尖,1 x 70 x 370 x 1226书写显示框,1 x 1 x 370 x 1226

产生的视差图应如下所示:

  • 左.png
  • 右侧.png

请注意-显示最大值70仅用作示例。为了重现我们的KITTI数据集的结果使用-显示最大值228.

请参阅预测_基蒂.lua脚本说明如何呼叫主.lua循环中,用于多个图像对。

加载输出二进制文件

您可以加载二进制文件(例如,如果您想应用你自己写的不同后处理步骤)映射它们。我们包括一些内存映射的示例更流行的编程语言。

  • 卢阿

    需要“火炬”左=焊炬。浮子张量(火炬浮子存储('../left.bin')):视图(1,70,370,1226)右=焊炬。浮子张量(火炬浮子存储('../right.bin')):视图(1,70,370,1226)disp=火炬。浮子张量(火炬浮子存储('../disp.bin')):视图(1,13701226)
  • 蟒蛇

    将numpy导入为npleft=np.memmap('../left.bin',dtype=np.float32,shape=(1,703701226))right=np.memmap('../right.bin',dtype=np.float32,shape=(1,703701226))disp=np.memmap('../disp.bin',dtype=np.float32,shape=(1,1371226))
  • Matlab语言

    left=memmapfile('../left.bin','Format','single')。数据;左=排列(重塑(左,[1226 370 70]),[3 2 1]);right=memmapfile('../right.bin','Format','single')。数据;右=置换(重塑(右,[1226 370 70]),[3 2 1]);视差=memmapfile('../disp.bin','Format','single')。数据;视差=重塑(视差,[1226 370])';
  • C类

    #包括<fcntl.h>#包括<stdio.h>#包括<sys/mman.h>#包括<sys/stat.h>#包括<sys/types.h>int main(无效){整数fd;float*left、*right、*disp;fd=打开(“../left.bin”,O_RDONLY);left=mmap(空,1*70*370*1226*sizeof(浮点),PROT_READ,MAP_SHARED,fd,0);闭合(fd);fd=打开(“../right.bin”,O_RDONLY);right=mmap(NULL,1*70*370*1226*sizeof(float),PROT_READ,MAP_SHARED,fd,0);闭合(fd);fd=打开(“../disp.bin”,O_RDONLY);disp=mmap(空,1*1*370*1226*sizeof(浮点),PROT_READ,MAP_SHARED,fd,0);闭合(fd);返回0;}

列车

本节介绍如何在KITTI和Middlebury数据集。

基蒂

下载两者

  • 这个2012年KITTI数据集并解压缩进入之内data.kitti/unzip(你应该以一个文件结束data.kitti/unzip/training/image_0/000000_10.png)和
  • 这个KITTI 2015年数据集并解压缩进入之内data.kitti2015/unzip(你应该以一个文件结束data.kitti2015/unzip/training/image_2/000000_10.png).

运行预处理脚本:

$ ./预处理_kitti.lua数据集20121...389数据集20151...400

运行主.lua训练网络:

$ ./main.lua kitti slow-一列火车基蒂慢-一列火车转换(输入=1,输出=112,k=3)cudnn公司。ReLU公司转换(输入=112,输出=112,k=3)cudnn公司。ReLU公司转换(输入=112,输出=112,k=3)库登。ReLU公司转换(输入=112,输出=112,k=3)库登。ReLU公司nn。重塑(128x224)nn。线性(224->384)cudnn公司。ReLU公司nn。线性(384->384)cudnn公司。ReLU公司nn。线性(384->384)cudnn公司。ReLU公司nn。线性(384->384)cudnn公司。ReLU公司nn。线性(384->1)cudnn公司。乙状结肠...

网络是在所有训练示例的子集上训练的,剩下的是用于验证的示例;训练所有示例使用

$ ./main.lua kitti慢-一辆火车

在前面的命令中,使用了KITTI 2012数据集。如果你想训练关于KITTI 2015跑步

$ ./main.lua kitti2015慢速-一列火车

要训练快速架构,请使用

$ ./main.lua kitti fast-一列火车

网络存储在净额/目录。

净额$ls/...net_kitti2012_fast_action_train_tr.t7...

米德尔伯里

运行下载_ middlebury.sh下载培训数据(这可能需要很长时间,具体取决于您的互联网连接)。

$ ./下载_ middlebury.sh

数据集下载到data.mb/unzip目录。

编译MiddEval3-SDK软件包.你应该以计算机掩码中列出的其中一个目录中的二进制文件你的路径环境变量。

安装图像Magick; 这个预处理步骤需要转换二进制以调整图像大小。

运行预处理脚本:

$mkdir data.mb.不完美_灰色$ ./预处理_mb.py不完美灰色阿迪朗达克背包...测试H/楼梯

第一次预处理很慢(大约需要30分钟)运行,因为必须调整图像的大小。

使用主.lua训练网络:

$ ./main.lua mb slow-一列火车

其他有用命令

计算验证集的错误率(用于设置超参数):

$ ./main.lua kitti fast-a test_te-net_name net/net_kitti法斯特-a_train_tr.t7kitti fast-a test_te-net_name net/net_kitti_fast-a_train_tr.t70.86836290359497        0.0082842716717202...0.73244595527649        0.0242027080049290.72730183601379        0.0236031608222850.030291934952454

快速架构在KITTI 2012数据集上的验证错误率为3.029%。

***

计算网络中一个数据集的验证集的错误率已经在不同的数据集上进行了培训。

$ ./main.lua kitti fast-a test_te-网络名称net/net_mb_fast_a-train_all.t7kitti fast-a test_te-net_name net/net_mb_fast_a-train_all.t72.1474301815033	0.0071447750148986...1.4276049137115	0.0242738380246221.4282908439636	0.018812855795641.408842086792	0.0217416895978340.031564540460366

快速架构的验证错误率在KITTI 2012上进行了测试,但在以下方面进行了培训米德尔伯里为3.156%。

***

准备提交给KITTI和Middlebury评估服务器的文件。

$ ./main.lua kitti fast-a提交-net_name net/net_kitti_fast_a-train_all.t7kitti fast-a提交-net_name net/net_kitti_fast-a_train_all.t7加上:000038_10.png(平减0%)添加:000124_10.png(收缩0%)...加上:000021-10.png(平减0%)

输出存储在输出/提交.zip并可用于提交给KITTI评估服务器.

***

尝试不同的网络架构:

$ ./main.lua kitti slow-一列火车tr-l1 2-fm 128-l2 3-nh2 512基蒂慢-一列火车tr-l1 2-fm 128-l2 3-nh2 512转换(输入=1,输出=128,k=3)cudnn公司。ReLU公司转换(输入=128,输出=128,k=3)cudnn公司。ReLU公司nn。重塑(128x256)nn。线性(256->512)cudnn公司。ReLU公司nn。线性(512->512)cudnn公司。ReLU公司nn。线性(512->512)cudnn公司。ReLU公司nn。线性(512->1)cudnn公司。乙状结肠...

***

测量特定数据集上的运行时:

$ ./main.lua kitti快-一次kitti快速-一次转换(输入=1,输出=64,k=3)cudnn公司。ReLU公司转换(输入=64,输出=64,k=3)cudnn公司。ReLU公司转换(输入=64,输出=64,k=3)cudnn公司。ReLU公司转换(输入=64,输出=64,k=3)nn。规格化2nn。立体声连接10.73469495773315

在KITTI 2012数据集上运行快速架构需要0.73秒。如果你只关心花在神经网络上的时间,你可以终止早期立体方法:

$ ./main.lua kitti fast-a time-sm终止cnnkitti fast-a time-sm终止cnn转换(输入=1,输出=64,k=3)cudnn公司。ReLU公司转换(输入=64,输出=64,k=3)cudnn公司。ReLU公司转换(输入=64,输出=64,k=3)cudnn公司。ReLU公司转换(输入=64,输出=64,k=3)nn。规格化2nn。立体声连接10.31126594543457

关于

通过训练卷积神经网络比较图像块的立体匹配

资源

许可证

星星

观察者

叉子

发布

未发布任何版本

包装

未发布包