天天看点

卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术

在这篇教程中,我也使用了scikit-imag库、numpy以及其他的一些依赖。你可以通过下载anaconda的python软件包来安装这些软件。

此外,你还需要按照之前几篇文章介绍的步骤来配置你的训练环境——包括如何下载vgg-16模型以及其他所有的必需操作。

在这一部分中,我们定义前一篇文章使用的辅助函数。如果你还记得的话,我们使用了上采样技术对我们从网络中获得的下采样预测结果进行采样。我们从vgg-16模型使用的最大值池化层中获得模型的下采样预测结果。

我们也为图像与各个实际分割区域的加载操作编写了程序。这些代码加入了足够的注释,所以不必担心无法理解它。

在这一部分中,我们把准备好的所有东西整合到一起:为我们的网络添加上采样层,定义可微分求导的损失函数,并进行模型的训练。

参照论文《fully convolutional networks for semantic segmentation》,我们将模型的损失定义为像素间的交叉熵。我们之所以这样定义,是因为在上采样后我们可以得到与输入图像尺寸相同的预测结果,进而我们可以将获得的分割结果与实际的各个分割区域进行比较:

其中,n表示像素的数量,k表示类别的数量,变量tnk表示第n个像素对应的实际分割区域,实际区域以1至k的数字表示,变量ynk为我们模型的预测结果(使用softmax函数来规范输出)。

对于这种情况,由于adam优化器仅调整较少的参数就能使模型取得很好的效果,我们将其应用到了模型的训练当中。

在这个特殊的情况下,我们使用一张图像来训练模型并评估模型的效果——与真实场景相比,这种训练方式非常简单。我们这样做是为了展示这种方法的不足——只为了说明这种方法糟糕的定位能力。如果在这种简单场景下这种方法的效果尚且如此,那么在未训练的图像上,这种方法只会产生类似的更糟糕的结果。

卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 201433.0
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 245565.0
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 135906.0
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 183353.0
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 48563.9
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 37925.8
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 33199.1
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 26540.3
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 23658.0
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
current loss: 29404.9
卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
final loss: 18177.5

正如你所看到的,结果非常粗糙——而且,这还是我们使用模型训练同一张图像来运行网络预测的结果。这在图像分割中一个非常常见的问题——分割结果通常很粗糙。有几种不同的方法可以解决此类问题——其中之一便是使用跳跃连接。主要思路是根据融合网络中不同层的预测结果来确定模型的最终预测结果。由于在网络较靠前的层次中下采样因子较小,所以,可以根据这些层来确定预测结果,进而取得更好的定位效果。long等人发表的论文《fully convolutional networks for semantic segmentation》介绍了这种方法。基于这种方法,研究人员设计了fcn-16s与fcn-8s架构。

另一种方法则基于带孔卷积与全连接条件随机场。chen等人发表的论文《semantic image segmentation with deep convolutional nets and fully connected crfs》介绍了这种方法。在本篇文章中,我们将仅使用条件随机场后处理阶段来展示它对模型效果的提高。

还有一点需要注意的是,当前模型训练时在全连接层(我们映射到卷积层的全连接层)中应用了dropout技术,这种方法在srivastava等人发表的论文《dropout: a simple way to prevent neural networks from overfitting》中有所提及。dropout是一种用于模型训练的正则化技术。它有一个非常优秀的理论描述,而且实现起来也非常简单:我们只需要在每个训练步骤中随机地选择一定数量的神经元,仅根据这些神经元来进行推断并后向传播。但是,从理论角度来看,dropout可以看作是通过权重共享来训练一个稀疏网络的集合,每个网络仅进行很少次数的训练。在测试阶段,我们对所有这些网络的预测结果求均值。在论文中作者表明,dropout在线性回归情况下预期能够取得与岭回归相同的效果。在我们的具体情况中,dropout仅用于全连接层(我们映射到卷积层的全连接层)。这也解释了为什么最终模型的损失几乎比最后一次迭代的损失小了两倍——因为在最后的推断中,我们使用了损失的均值。

上面提供的代码用于处理单张图像,但你可以很容易地在整个数据集上运行这些程序。唯一需要调整的是,在每个迭代步骤中提供不同的图像。这种训练方式与论文《fully convolutional networks for semantic segmentation》的做法完全一致,其中,论文作者采用了数量为1的批处理进行训练。

总的来说,我们可以看到我们的分割结果仍然很粗糙,需要执行一些额外的处理步骤。在下一节,我们将应用条件随机场的后处理步骤使模型的分割粒度更细。

条件随机场是图模型的一种特定类型。在我们的应用场景中,条件随机场有助于根据网络的预测以及图像原生的rgb特征估计模型预测结果的后验分布。它通过最小化用户定义的能量函数来实现这一点。在我们的应用场景中,其效果与双边滤波器非常接近,双边滤波器综合考虑了图像中像素的空间邻近性以及在rgb特征空间(强度空间)中的相似性。

在一个非常简单的层面上,这种方法使用rgb特征来使图像分割结果更加精准——例如,边界通常表示为极大的强度变化——这是一个关键因素,位于该边界两侧的物体属于不同的类别。这种方法也同样对小的分割区域进行惩罚——例如,20像素或50像素大小的小区域通常不可能是一个正确的分割区域。物体通常由大的空间相邻的区域表示。

下面你可以看到这个后处理步骤是如何影响我们的分割结果的。我们使用了论文《fully connected crfs with gaussian edge potentials》有效性推断章节中描述的全连接条件随机场对分割结果进行调整。

卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术

在本篇教程中,我们看到了卷积神经网络应用于图像分割领域时的一个缺陷——粗糙的分割结果。我们可以看到,这种情况是由于在vgg-16网络架构中使用最大值池化层所导致的。

根据像素间交叉熵损失的定义,我们在简化的场景下进行了模型的训练,并使用后向传播来更新权重。

我们使用条件随机场(crfs)来解决分割结果粗糙的问题,并取得了很好的效果。

<a href="https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?usercode=j4nkrg1c&amp;utm_source=j4nkrg1c">数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!</a>

原标题《image segmentation with tensorflow using cnns and conditional random fields》,作者:daniil,译者:6816816151**

继续阅读