使用条件随机场(CRF)来提升图像分割的表现
作者:Ihor Shylo
编译:ronghuaiyang
导读
一个基于TensorFlow的CRF用法和实现的简单介绍 。
文章插图
在一个理论上计算能力无限的现代世界 , 语义图像分割已经成为许多应用的关键方法 , 如自动驾驶、高级医学图像分析、目标检测和许多其他应用 。 通常 , 一个基本的U-Net神经网络在大多数时候都可以得到良好的结果 。 Dice系数是一个流行的图像分割度量 。 然而 , 在仔细检查预测mask之后 , 发现了错误预测像素的小的“孤岛” 。 因此 , 问题出现了:如何改进这些微小的不一致?
条件随机场也被称为CRF , 它经常被用作后处理工具来提高算法的性能 。 然而 , 在推断过程中 , 这种操作的计算成本可能很高 , 特别是在移动设备上 。 它使用了一组需要硬编码的参数 , 这使得它很难适用于整个测试集 。 这个问题的一个可能的解决方案是以循环神经网络(RNN)的形式添加一个CRF算法作为神经网络的附加层 , 并使其具有可训练性 。 虽然有很多关于这种方法的科学论文 , 但在大多数深度学习框架中还没有开箱即用的CRF-RNN实现 。 因此 , 这篇博文的主要目的是演示如何使用Tensorflow将这个额外的层插入到原来的U-Net模型中 。
用例描述用例是对文档(特别是收据)的像素级检测 。 常规检测无法捕捉到收据形状的变形 。 图1展示了其中一个标注图像 , 它是测试集的一部分 。
文章插图
【使用条件随机场(CRF)来提升图像分割的表现】图1:用例的真实标注
本质上 , 它是像素级的二元分类 , 其中0类定义为图像的背景 , 1类定义为文档 。
只使用 U-Net 方法数据集分为3个子集:训练集、开发集和测试集 。 后者用于模型的最终验证 。 用于图像像素分类的模型就是所谓的U-Net模型 。
文章插图
图2:典型的U-Net结构
它由两个主要部分组成:编码器和解码器 。 该技术的实现是受到Tensorflow图像分割的例子的启发 。 为了保持简短 , 可以在图3查看模型的大致结构 。
文章插图
图3:U-Net模型的总体结构
在通过网络之前 , 图像被缩放为224x224并归一化 。 请注意softmax层被省略了 。 在500张图像上训练30个epoch已经显示出相当不错的测试数据集的结果:Dice coefficient 0.983 。 图4中可以看到一个预测mask的例子 。
文章插图
图4:U-Net预测Mask
值得注意的是 , 正如前面所描述的 , 有一些用蓝色圈出的错误分类的小“岛” 。 这就是CRF-RNN层会派上用场的地方 。 在开始之前 , 有必要注意的是 , 由于特征已经训练好了 , 在添加新的CRF-RNN层之前 , 网络的权重应该被固定和设置为不可训练 。
CRF-RNN一旦你训练好了特征 , 就可以开始加入CRF-RNN层 , 并再次训练网络 。 不幸的是 , Tensorflow中没有一个预训练的CRF层 。 经过一番彻底的搜索 , 我偶然发现了Sadeep Jayasumana的GitHub仓库 。 他为Keras创建了一个自定义类 , 并将其公开 。 唯一的限制是批大小必须为1 , 这使得训练有点慢 。 然而 , 考虑到特征已经训练过的事实 , 这个限制似乎不是什么大问题 。 第一步 , 克隆git仓库并遵循安装说明 。 一旦完成 , 你就可以将定制的CRFRNNLayer加到你的网络上 。 下面的代码片段演示了它是如何在我们的用例中实现的:
from crfrnn_layer import CrfRnnLayerdef add_crf_layer(original_model):original_model.trainable = Falsecrf_layer = CrfRnnLayer(image_dims=(224, 224),num_classes=2,theta_alpha=3.,theta_beta=160.,theta_gamma=3.,num_iterations=10,name='crfrnn')([original_model.outputs[0], original_model.inputs[0]])new_crf_model = tf.keras.Model(inputs = original_model.input, outputs = crf_layer)return(new_crf_model)
有几个参数需要指定 , 如images_dims和迭代次数 。 第一个需要匹配特征提取中最后一层的输出维度 。 迭代次数是任意参数 。 对于所有其他的 , 它们服从超参数优化 。 新模型编译完成后 , 模型摘要如下:
文章插图
图5:自定义CRF-RNN Layer模型结构
作为最后一步 , 在重新训练模型时 , 需要将EPOCHS参数设置为1 , 因为已经在自定义层中指定了迭代次数 。
- 会员|美容院使用会员管理软件给顾客更好的消费体验!
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- QuestMobile|QuestMobile:百度智能小程序月人均使用个数达9.6个
- 开发自|不妥协不追随 Member’s Mark升级背后的“山姆哲学”
- 轻松|使用 GIMP 轻松地设置图片透明度
- 电池容量|Windows 自带功能查看笔记本电脑电池使用情况,你的容量还好吗?
- 小米|华为成俄罗斯线上销售最受欢迎品牌!小米紧随其后
- 流畅|手机里垃圾太多,关闭这个开关,彻底清除垃圾,手机立刻流畅
- 超清|带着 vivo S7 逛野生动物园,随手一拍就是超清大片
- 撕破脸|使用华为设备就罚款87万,英政府果真要和中国“撕破脸”?