论文:Learning deep structured active contours end-to-end,CVPR 2018
代码:https://github.com/dmarcosg/DSAC
概览
主要工作:
- 将 ACM 能量函数的计算看作是结构化的预测问题
- 构造能量的函数里包含了 ACM 的 ballon term
- 将 CNNs 的表现性和 ACMs 的活动性结合到统一的框架中,叫做 Deep Structured Active Contours(DSAC)
- 提出 end-to-end 解决方案,可以学习 guiding features 和 local priors
语义分割问题的套路是 dense prediction,即对每一个像素点都预测其标签类别,最后得出分割结果。这种分割方法优点是可以提供全局数据信息,比如分割目标的面积(只要看有多少像素点属于该目标);缺点是缺少实例级的预测。
CNN 做建筑物分割任务时,通常有较高的检测率,但在空间覆盖和几何正确性方面表现不好。
为什么?
Q:ACM(snakes)能解决分割的什么问题?
ACM 提出具有 高级几何约束 和 先验知识 的 自下而上 的 boundary detector
Q高级几何约束是什么?
Q先验知识?
ACM 原理:将可能的输出曲线约束为一组曲线(比如一个闭合的曲线,曲线上有固定数量的点),然后通过最小化能量函数优化这条曲线,最小化能量函数的依据就是图像特征和分割目标的形状先验知识,比如说边界的连续性和平滑性
提出一些术语
balloon term:提出论文:On Active Contour Models and Balloons
模仿气球,能够持续将曲线的顶点向外推,阻止曲线坍缩成一个点
将物体检测问题看作是带有先验知识的 polygon fitting 问题,可以精确预测物体边界,而不需要后处理
原始的公式缺少灵活性,因为其依赖于低级图像特征和先验的全局参数
一种解决方法是增大对直线/光滑部分曲率的惩罚,减少在更可能成为拐角处的曲率的惩罚
balloon term 作为一种 post-energy global minimization force,并不参与 snake 的能量最小化
本文提出将 CNNs 的表现性和 ACMs 的活动性结合到统一的框架中,叫做 Deep Structured Active Contours(DSAC),使用 CNN 学习能量函数,
能量函数让 ACM 能够产生一个和 ground truth 很接近的曲线
DSAC 通过学习高级图像特征和先验知识参数(包括 balloon term),改变初始的 ACM 公式
比如:在图像中的每个像素位置上,给予不同的惩罚
将 ACM 的优化问题看作是一个结构预测问题,利用 SSVM(Structured Support Vector Machine)Loss 找到最优特征和参数
因此,DSAC 可以进行端到端的培训,并且能够学习和适应特定的对象实例系列。
DSAC 使用高级别的几何信息作为 CNN 的输入,来弥补上面的不足(???)
像素级的 CNN,不像 polygonal output model 那样容易直接集成输出形状优先级
DSAC 通过加入局部先验信息(加权 snake 基于每个像素点的能量函数项),改进原始公式。
虽然这项工作的重点是曲率优先用于分割多边形形状的物体,其他的先验可以用ACMs来实现,例如生物医学成像的凸性[23]。
使用结构化损失作为 CNN 的学习信号,使它学会协调不同的 ACM 能量项,这些项是高度相互依赖的。
概念:
ACM(Snakes):Snakes: Active Contour Models
balloon term:On Active Contour Models and Balloons
SSVM(Structured Support Vector Machine):Support Vector Machine Learning for Interdependent and Structured Output Spaces
Large margin methods for structured and interdependent output variables
humans in the loop:《Semiautomated building footprint extraction from orthophotos》
polygonal shape prior:
已证明多角形先验能够提升基于彩色图像和低级特征的分割效果
5. 方法细节
给出了一种改进的,基于图像的 和 局部惩罚项 的 ACM 推理算法,以及用于训练 CNN 生成这些惩罚映射的 结构化损失。
DSAC 训练思想:CNN 预测能量项的值(包括 ,,,),然后 ACM 使用 CNN 预测的这些值来生成一个预测的 polygon,计算它的结构化损失并输入回 CNN,这样就实现了参数能够通过反向传播进行更新。
CNN 用于预测 ACM 能量项的值,包括:
- length penalization:全局的长度惩罚项 ,控制 polygons 的长度
- data term:数据项 ,也可以说是局部映射
- curvature penalization:曲率惩罚 ,控制 polygons 的曲率
- ballon term
DSAC 训练算法:
在每一次迭代过程中,CNN forward pass 后跟着 ACM inference,ACM inference 会预测一个 countour,用于计算 structured loss,然后 loss 送回 CNN 进行反向传播更新参数,再进行下一次迭代。
- 和 是训练集的原图和其对应的 mask 的集合, 和 就是这两个集合中的某一对儿训练数据
- 是每张训练图像对应的初始的轮廓线
第一次迭代时,初始化参数 ,, 和 ,将这些参数和初始的轮廓线 送入 ACM,ACM 得出计算结果 ,即新的轮廓线【对应循环内 1、2 步】
然后根据 ACM 得出的轮廓线 和训练集中对应的 mask 计算微分【对应循环内第 3 步】
最后通过反向传播更新 CNN 的权重参数 【对应循环内 4、5 步】
从第二次迭代开始,参数 ,, 和 由上一轮迭代更新后的 CNN 计算而来。
结构性损失(structured loss)由 ACM 计算出的轮廓线计算得来。
5.1 Locally penalized active contours
active contour 表示为一条轮廓曲线:polygon ,进一步,当在这条轮廓曲线上取 个离散的点时,又可以表示为有 个节点的 polygon ,其中 ,每个 就表示离散轮廓上的节点。
经过变形,使能量函数最小化:
最小化能量函数其实就是在一个 “给定的 countour 状态” 下,最小化各个参数。
其中:
- 是数据项,取决于尺寸为 的输入图像,
- 和 分别鼓励 polygon 趋于 short 和 smooth,且
- 为 balloon term
- 是由 polygon 围成的区域
- 表示在曲线 位置处的 值
考虑到局部性,、、 均为 大小的矩阵, 为一个标量
1.1 Data term
数据项定义了 polygon nodes “应该” 在的区域
通常数据项 是预定义的函数,一般和图像的梯度有关
理想的状况下,CNN 得出的 应该为分割目标的边界提供相对较低的数值,而为其他区域提供相对较高的数值。
在 ACM inference 过程中,最陡的方向作为 data force term,让 contour 向着 D 比较低的方向移动。
data force term:
1.2 Internal terms
通常来说 和 都是单个标量,意思就是对所有地方的惩罚强度都是一样的。(但这篇文章不是这样!这里对惩罚曲率的参数 进行了改进)
直观想一下,如果各个点对曲率的惩罚都使用同一个参数,假如有一点是 over-smoothing 的,参数会倾向于减小,来降低 smoothing 的程度;但若同时又有一个点是 under-smoothing 的,参数又倾向于增大,来加强 smoothing 的程度。
那么这时,参数左右为难,就会进行 trade-off,即 “折中处理“,因为大家都很难满足,所有干脆既不 smooth,也不 sharp 了,这样其实谁也满足不了。
而惩罚长度的参数 就不像惩罚曲率的参数 那么重要,所以 仍然延用了通常的标量。
DSAC 对 的改进是避免 trade-off,对每个 pixel 都分配不同的 惩罚
后面这句话不太理解:
depending on which part of the object lies underneath
(下面不是很理解 ???)
内能 定义:
内能也是能量的一种,目标是最小化内能,
内能 惩罚 polygon 的长度和曲率,为了获得梯度下降最快的方向,可以将内能表示为有限差分函数:
计算内能 的导数,
Jacobian 矩阵可以表示为矩阵乘法:
为三对角矩阵, 为五对角矩阵
1.3 Balloon term
初始的 balloon term 在 contour 节点的法线方向上添加相等的力,从而使 contour 扩张。
效仿 ,为了增加灵活性,故在不同节点上设置不同大小的力,这样就能针对性地处理不同节点。
在之前的工作中(《On active contour models and balloons》),将 balloon term 看作是固定的力,也就是计算其他能量项最陡的下降方向后,直接把 balloon term 加在后面。而在 DSAC 里,SSVM 将 balloon term 也作为能量项之一。
contour 上 处的法线方向:
整组法线向量表示为:
其中 为三对角矩阵,主对角线上是 0,对角线上方为 1,下方为 -1
将这个表达式与 和 相结合,得到了对应于轮廓内部面积的标量 :
提出最大化由 所围成的面积
在满足 的条件下,离散化 ? 到每个像素值上
修改之后,需要找到 大小的 Jacobian matrix ,对 force form 进行重新计算。
对应了 和 会如何影响 。
当影响很小时,就假定 在 和 方向上的分布分别与 和 相同
这可以归结为对一系列梯形区域的求和,形成了两个所描绘的三角形,每个三角形都是按其赋值加权的。
对 或 方向的扰动会导致两个阴影区域的改变
在图 a)中,上下两个三角形有相同的长度 ,而高度分别为 和
在图 b)中,上下两个三角形有相同的长度 ,而高度分别为 和
获得 a)中 的加权区域:
需要推出的 force term 为:
要获得 b)中 的加权区域,只需要将 a)中的 和 互换一下即可。
These derivatives point in the normal direction when the values of k are equal in all locations.
3.2 Active contour
在 active contour 问题里,能量函数 包含四个部分:
这四个部分是 external terms 、data 、balloon energies 以及 internal terms
其中 是关于 length 和 curvature 的能量
由于 仅仅与轮廓 有关,定义新的更新规则:
在每个新的时间步最小化
为 解上面的表达式,得到:
其中, 为单位矩阵
论文中使用 TensorFlow Graph 实现了描述的局部惩罚 ACM。对于本文所使用的设置,在单个CPU上,推理时间小于50 ms。
3.3 Structured SVM loss
由于惩罚项没有 ground truth,所以将这个问题看作结构化预测问题
损失增强推理用于生成负实例,来补充 ground truth polygons 的正实例
修改能量项的权重,使 ground truth 对应的能量很小,而使得损失函数增加的被认为是错误的
ground truth pairs ,
loss function
通过优化 Eq.1,找到 CNN 参数 ,然后就能得到 inference result:
希望得到的是预测结果 和真实结果 很小的差异
所以问题就变成了找到使能量函数 E 最小的
由于预测值和 ground truth 的差异肯定不是连续的函数,所以用一个连续的曲线来代替,比如 hinge loss
通过对所有训练样本添加 正则并求和,就可以得到一个 max-margin formulation:
其中 是凸函数但不可微,所以计算 subgradient,这就需要找到当前 值得最大惩罚约束:
第一次运行 ACM 时,使用当前的 和与 loss 对应的 term
首次获得了预测值 后,就可以计算 subgradient:
四个参数的梯度计算如下:
1)数据项
2)长度惩罚
3)曲率惩罚
4)balloon term 惩罚
其中, 表示 Iverson bracket
最后,我们可以通过链式法则获得 的梯度:
更新 CNN 的参数 :
这将同时降低 ,升高 ,使下一次 inference 时获得更好的结果。
LOSS:
采用 IoU 度量预测结果 和 ground truth ,对 IoU 的优化可以分为 ”最大化交集“ 和 ”最小化并集“,
实验部分
使用两种初始化方案:
1)手动初始化:人工在建筑物附近提供一些 clicks
数据集:Vaihingen 和 Bing Huts
2)自动初始化:使用实例分割算法生成一些初始的 polygons
数据集:Toronto City dataset
4.1 CNN结构
CNN 结构模仿《Hypercolumns for object segmentation and fine-grained localization》中的网络结构
网络输入尺寸固定
第一层 7*7 卷积
第二层 5 5
其余层均为 3 3
所有卷积层后接 ReLU、Batch normalization 和 2 2 max-pooling
每一层的卷积核个数:32, 64, 128 ,128, 256,256
每一层的输出都上采样到输出尺寸,并进行 cat
CNN 预测结束后,两层的 MLP(分别由 256 和 64 个隐藏单元)用于预测四个 output map:
这一结构使用于所有的数据集,唯一例外是 Bing Huts 数据集去掉了最后两个卷积层
优化器:Adam optimizer
学习率:
数据增强:随机旋转
迭代次数均设置为 50
节点数量:
Vaihingen 和 TorontoCity 设置为 60
Bing Huts 设置为 20
4.2 Manual Initialization
Vaihingen buildings:
训练:100
测试:68
Bing huts:80*80 的图片
训练:335 张
测试:270 张
4.3 Automatic initialization
使用 DWT(Deep Watershed Transform)实例分割算法初始化 active contour,DWT 虽然有不错的 recall,但倾向于欠分割,且靠近目标边缘的地方会丢失细节。
实验结果
经过消融实验证明,使 balloon term 和 曲率惩罚 从单个值变为各个局部都不等,效果有明显提升
而将长度惩罚 看作单个标量没有性能的损失
另外,还强调了 balloon term 对于轮廓收敛的重要性
绿色为 ground truth
蓝色为 初始化分割结果
黄色为 DSAC 得到的分割结果
data term 在轮廓上的能量很低,其余区域能量较高
balloon term 在目标内部产生正值,尤其是接近拐角处
thin plate term 在拐角处的惩罚较小
作者自己说,主要局限性是初始化分割结果是通过某种外部方法进行的,因此不包括在学习过程中。