论文提出基于轮廓的实例分割方法Deep snake,轮廓调整是个很不错的方向,引入循环卷积,不只提高了性能还减小了计算量,保持了实时性,可是Deep snake的大致结构不够优雅,应该还有一些工做能够补,推荐你们阅读
来源:晓飞的算法工程笔记 公众号git
论文: Deep Snake for Real-Time Instance Segmentationgithub
实例分割是许多计算机视觉任务中的重要手段,目前大多数的算法都采用在给定的bbox中进行pixel-wise分割的方法。受snake算法和Curve-GCN的启发,论文采用基于轮廓的逐步调整策略,提出了Deep snake算法进行实时实例分割,该算法将初始轮廓逐渐优化为目标的边界,如图1所示,达到很好的性能且依然保持很高的实时性(32.3fps)。
论文的主要贡献以下:算法
Deep snake方法将初始轮廓逐渐优化为目标的边界来进行目标分割,即将物体轮廓做为输入,基于CNN主干特征预测每一个顶点的偏移量。为了充分利用轮廓拓扑结构,论文使用循环卷积(circular convolution)进行顶点特征的学习,有助于学习轮廓的优化,并基于deep snake提出了一套实时实例分割的流程。微信
传统的snake算法将顶点的坐标做为变量来优化人工设计的能量函数(energy function),经过最小化能量函数来拟合目标边界。因为能量函数一般是非凸的,并且须要基于低维图像特征进行人工设计,一般会陷于局部最优解。
而deep snake则是直接从数据学习如何微调轮廓,对于$N$个顶点${ x_i | i=1, ..., N}$,首先构造每一个顶点的特征向量,顶点$x_i$的特征$f_i$为对应的网络特征和顶点坐标的concate$[F(x_i);x_i{'}]$,其中$F$为主干网络输出的特征图,$F(x_i)$为顶点$x_i$处的双线性差值输出,附加的$x_i{'}$用于描述顶点间的位置关系,$x_i^{'}$是平移不变的,由每一个顶点坐标减去轮廓中全部顶点的最小$x$和$y$获得相对坐标。网络
在得到顶点特征后,须要对轮廓特征进一步学习,顶点的特征能够视做1-D离散信号$f:\mathbb{Z}\to \mathbb{R}^D$,而后使用标准卷积对顶点逐个进行处理,但这样会破坏轮廓的拓扑结构。所以,将顶点特征定义为公式1的周期信号,而后使用公式2的循环卷积进行特征学习,$k:[-r,r]\to \mathbb{R}^D$为可学习的卷积核,$*$为标准卷积操做。app
循环卷积操做如图2所示,与标准的卷积操做相似,能够很简单地集成到目前的网络中。在特征学习后,对每一个顶点使用3个$1\times 1$卷积层进行偏移的输出,实验中循环卷积的核大小固定为9。函数
图a展现了deep snake的细节结构,输入为初始轮廓,主干包含8个"CirConv-Bn-ReLU"层,每层都使用残差链接,Fusion block用于融合主干网络中的多尺度轮廓特征,Prediction head使用3个$1\times 1$卷积输出每一个顶点的偏移。性能
将deep snake加入到目标检测模型中进行实例分割,流程如图b所示。模型首先产生目标框,将其构建成菱形框,而后使用deep snake算法将菱形顶点调整为目标极点,构造八边形轮廓,最后进行迭代式deep snake轮廓调整获得目标形状学习
论文采用ExtreNet的极点思想,可以很好地包围物体。在获得矩形框后,获取4条边的中心点${x_i^{bb} | i=1,2,3,4 }$连成菱形轮廓,使用deep snake对菱形轮廓调整成极点${x_i^{ex} | i=1,2,3,4 }$,而后每一个极点放置一条边,链接边构造多边形,每一个极点的边为其对应的bbox边的$1/4$,若边超过原bbox范围会被截断。在实际使用时,菱形轮廓输入deep snake前会平均上采样到40个点(有助于deep snake计算),但损失函数计算只考虑$x_i^{bb}$的对应偏移优化
对八边形平均采样$N$个点,将上极点$x_1{ex}$做为起点,一样地,GT轮廓对物体边缘平均采样$N$个点,将靠近$x_1{ex}$的点做为起点,$N$通常为128。若是顶点离GT很远,很难直接正确调整,因而采用迭代式地进行deep snake调整,实验采用的迭代次数为3次。
轮廓是目标空间位置的一种扩展表示方法,经过调整轮廓到物体边缘可以帮助解决detector的定位偏差
因为遮挡,一个实例可能包含多个组件,然而一个轮廓只能勾勒出bbox内的一个组件。为了解决这个问题,使用RoIAlign来提取初始bbox特征,而后配合detector来检测组件的box,再对每一个box进行上述的轮廓调整,最后结合初始bbox内相同类别的组件输出最终的物体形状。
极点的损失函数如公式3,$\tilde{x}_i^{ex}$为预测的极点。
迭代轮廓调整的损失函数如公式4,$\tilde{x}_i$为调整后的顶点,$x_i^{gt}$为对应的GT边缘点。对于检测部分,则采用跟原检测函数同样的损失函数。
使用CenterNet做为检测器,对于物体检测,使用跟原来同样的设定输出类别相关的box,而对于组件检测,则使用类不可知的CenterNet,对于$H\times W\times C$的特征图,输出$H\times W\times 1$的中心点heatmap和$H\times W\times 2$的box大小特征图。
Baseline将轮廓视为图结构,而后使用GCN进行轮廓调整,初始轮廓为围绕bbox的椭圆,Arichitecture加入Fusion block,Initial proposal加入论文的轮廓初始化方法,最后是将GCN修改成循环卷积,能够看到每一个步骤都对AP有提高。
论文也对比了卷积类型以及迭代次数对结构的影响,能够看到循环卷积的结果比GCN要好。
论文在不一样的数据集上都取得了不错的效果,做者在每一个数据集上的训练参数都有点不同,具体参数能够看看原文
论文提出基于轮廓的实例分割方法Deep snake,轮廓调整是个很不错的方向,引入循环卷积,不只提高了性能还减小了计算量,保持了实时性,可是Deep snake的大致结构不够优雅,应该还有一些工做能够补,推荐你们阅读
若是本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】