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

2018-05-08 10:38:16 浏览数 (1)

选自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

代码语言:javascript复制
# 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 脚本。即运行以下命令行:

代码语言:javascript复制
$ 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 运行演示

代码语言:javascript复制
$ 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 挑战赛语义分割基准上获得了最好的结果。

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

0 人点赞