资源 | 如何通过CRF-RNN模型实现图像语义分割任务

选自GitHub

作者:Shuai Zheng等

机器之心编译

参与:蒋思源

本 Github 项目通过结合 CNN 和 CRF-RNN 模型实现图像的语义分割,读者可以跟随该项目利用 Keras/Tensorflow 实现这一过程。

  • 展示地址:http://crfasrnn.torr.vision (http://crfasrnn.torr.vision/)
  • 项目地址:https://github.com/sadeepj/crfasrnn_keras

本 Github 项目包含使用 Keras/TensorFlow 代码实现「CRF-RNN」图像语义分割的方法,该论文《Conditional Random Fields as Recurrent Neural Networks》最先发表在 ICCV2015 中。本项目的展示同样获得了当年最佳展示奖,本文在下面给出了该项目最初的 Caffe 代码。本项目提供的 Keras/TensorFlow 代码和其效果基本和 Caffe 版本的是一样的。下面让我们跟随安装向导实现语义分割。

Caffe 版本的代码:https://github.com/torrvision/crfasrnn

安装向导

1.1 安装依赖项

安装 TensorFlow 和 Keras,然后分别跟随以下的安装向导。如果我们计划使用预训练模型,那么我们需要安装 Keras 和 HDF5/h5py。在安装这两个包之后,运行以下的命令行以确保它们都得到了正确的安装:

安装 TensorFlow:https://www.tensorflow.org/install/

安装 Keras:https://keras.io/#installation

# First, activate the correct Python virtualenv if you used one during Tensorflow/Keras installation
$ source /home/user/tensorflow_virtualenv/bin/activate  
$ python
>>> import tensorflow
>>> import keras

如果安装正确,那我们在如上导入库的时候不会看到任何报错。

1.2 构建 CRF-RNN 定制的 C++代码

检验本项目的代码,并激活 Tensorflow/Keras virtualenv,然后在 cpp 目录下运行 compile.sh 脚本。即运行以下命令行:

$ git clone https://github.com/sadeepj/crfasrnn_keras.git
$ cd crfasrnn_keras/cpp
$ source /home/user/tensorflow_virtualenv/bin/activate
$ ./compile.sh

如果构建成功,我们就能看到一个名为 high_dim_filter.so 的新文件(扩展名可能会根据我们的系统而不同)。如果构建失败,请查看 compile.sh 文件下的命令,我们同样可以参看 TensorFlow 构建定制化操作的官方向导。

官方构建向导地址:https://www.tensorflow.org/extend/adding_an_op#build_the_op_library

1.3 下载预训练模型权重

下载模型权重后放在 srfasrnn_keras 目录下,并且命名为 crfrnn_keras_model.h5。

预训练权重下载地址:https://goo.gl/ciEYZi

1.4 运行演示

$ cd crfasrnn_keras
$ python run_demo.py  
# Make sure that the correct virtualenv is already activated

如果以上运行顺利,我们就可以在文件「labels.png」看到语义分割的结果。

目前版本的局限性

  1. 目前,在 CRF-RNN 层的一些操作只能在 CPU 中运行。GPU 版本的训练方法将很快发布。
  2. crfrnn_keras_model.h5 模型是直接从 Caffe 模型转换来的,但是从 Keras 直接完全训练一个模型也是可行的。

论文:Conditional Random Fields as Recurrent Neural Networks

论文地址:http://www.robots.ox.ac.uk/~szheng/papers/CRFasRNN.pdf

像语义分割任务那样的像素级标注任务在图像理解任务中起到了关键作用。最近的方法都在尝试将用于图像识别的深度学习技术应用于像素级的标注任务。这种方法的关键问题是深度学习技术在描绘视觉对象时的有限能力。为了解决这个问题,我们引进了一种新式卷积神经网络,该网络是由卷积神经网络(CNN)和基于条件随机场(CRF)的概率图模型所组成。为此,我们通过 Gaussian pairwise potential 为条件随机场制定了平均场近似推断,并将其作为循环神经网络。我们称该网络为 CRF-RNN,然后我们就可以把它嵌入作为 CNN 的一部分,并获得同时拥有 CNN 和 CRF 性质的深度网络。重要的是,我们的系统完全可以在 CNN 中集成 CRF 建模,这就令该模型能通过反向传播算法端到端地训练整个深度网络,且避免了为目标描述使用离线后处理方法。

我们应用该提出的方法解决图像语义分割问题,它在 Pascal VOC 2012 挑战赛语义分割基准上获得了最好的结果。

本文为机器之心编译,转载请联系本公众号获得授权。

原文发布于微信公众号 - 机器之心(almosthuman2014)

原文发表时间:2017-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习那些事儿

TensorFlow中滑动平均模型介绍

其中a的取值范围[0,1],具体就是:本次滤波结果=(1-a)*本次采样值+a*上次滤波结果,采用此算法的目的是:

52690
来自专栏null的专栏

简单易学的机器学习算法——Label Propagation

一、社区划分的概述 对于社区,没有一个明确的定义,有很多对社区的定义,如社区是指在一个网络中,有一组节点,它们彼此都相似,而组内的节点与网络中的其他节点则不相似...

1K80
来自专栏ATYUN订阅号

【教程】使用TensorFlow对象检测接口标注数据集

当为机器学习对象检测和识别模型构建数据集时,为数据集中的所有图像生成标注非常耗时。而这些标注是训练和测试模型所必需的,并且标注必须是准确的。因此,数据集中的所有...

52670
来自专栏数据派THU

手把手教你用Keras进行多标签分类(附代码)

本文将通过拆解SmallVGGNet的架构及代码实例来讲解如何运用Keras进行多标签分类。

7.8K110
来自专栏CVer

用OpenCV实现图像和视频神经风格迁移(含代码)

2015年,Gatsys等人在论文A Neural Algorithm of Artistic Style中提出了最初的神经风格迁移算法。2016年,Johns...

59230
来自专栏决胜机器学习

机器学习(十) ——使用决策树进行预测(离散特征值)

机器学习(十)——使用决策树进行预测(离散特征值) (原创内容,转载请注明来源,谢谢) 一、绘制决策树 决策树的一大优点是直观,但是前提是其以图像形式展示。如...

40960
来自专栏ATYUN订阅号

在Keras中展示深度学习模式的训练历史记录

通过观察神经网络和深度学习模型在训练期间的表现,你可以得知很多有用的信息。 Keras是Python中强大的库,为创建深度学习模型提供了一个简单的接口,并包装了...

65490
来自专栏杨熹的专栏

了解 Sklearn 的数据集

学习资料:大家可以去莫烦的学习网站学到更多的知识。 学习资料: 相关代码 更多可用数据 网址 ---- ? 今天来看 Sklearn 中的 data s...

35480
来自专栏AI科技大本营的专栏

OpenCV特征提取与图像检索实现(附代码)

翻译 | AI科技大本营 参与 | 张蔚敏 审校 | reason_W “拍立淘”“一键识花”“街景匹配”……不知道大家在使用这些神奇的功能的时候,有没有好奇过...

75860
来自专栏图形学与OpenGL

实验四 二维几何变换

11120

扫码关注云+社区

领取腾讯云代金券