论文:Capsules for Object Segmentation
代码:
https://github.com/lalonderodney/SegCaps
https://github.com/ImMrMa/SegCaps.pytorch
主页:https://cheng-lin-li.github.io/SegCaps/
架构
出于多种原因,使用基于胶囊的网络执行对象分割很困难。无论是在内存还是在运行时间方面,原始的胶囊网络架构和动态路由算法在计算上都非常昂贵。在动态路由算法确定将这些子级路由到下一层的“父级”胶囊的系数时,还需要其他中间表示形式来将“子级”胶囊的输出存储在给定的层中。这种动态路由发生在每个父母与每个可能的孩子之间。可以将所需的附加存储空间视为给定层的批处理大小乘以该层胶囊类型的数量的乘积。即使对于诸如MNIST和CIFAR10之类的小输入,所需的参数数量也会迅速膨胀,超出控制范围。例如,给定一组32个胶囊,每个类型大小为6×6,8个Digit-胶囊,被路由到10×1,16个Digit-胶囊,仅这一层的参数数就有10×(6×6×32)×16×8=1474560个参数,结构如图所示。巧合的是,这一层所包含的参数数与我们提出的整个深度卷积-解卷积胶囊网络与局部约束动态路由的参数数大致相同,而这一层本身就是在512×512像素的输入上运行的。
我们通过扩展卷积囊的概念(Sabour等人[2017]中的初级囊在技术上是没有任何路由的卷积囊),并以两种关键方式重写动态路由算法,来解决这种内存负担和参数爆炸问题。首先,子代只在定义的空间局部内核内路由给父代。第二,变换矩阵在胶囊类型内为网格的每个成员共享,但在胶囊类型间不共享。为了补偿局部约束路由的全局连接性的损失,我们提出了 "解卷积 "胶囊网络,它使用转置卷积,并由所提出的局部约束路由进行路由。这些创新使我们仍然可以学习到不同的胶囊类型。此外,通过提出的深度卷积-解卷积架构,我们保留了近乎全局的上下文信息,同时大幅减少了网络中的参数数量,解决了内存负担,并为我们的应用提供了最先进的结果。我们提出的SegCaps架构如图2所示。作为比较基线,我们还实现了一个简单的三层胶囊结构,更接近于原始胶囊的实现,如图1所示。
图1:简单的三层胶囊分割网络,非常类似于Sabouret等人的工作。该网络使用我们提出的局部约束动态路由算法以及正输入类的掩码重构 图2:提议的用于对象分割的SegCaps体系结构创新点
- 我们的SegCapsis是文献中首次将胶囊网络架构用于对象分类。
- 我们对原始的动态路由算法提出了两种修改,
(i)仅在定义的空间局部窗口内将孩子路由到父母;
(ii)在胶囊类型内,网格的每个成员都共享变换矩阵. - 可以处理大尺度图片(512×512),之前的胶囊网络结构最大处理32×32大小的图片。
- 我们介绍了“deconvolutional”胶囊的概念并且提出了一个新颖的deep convolutional-deconvolutional胶囊网络架构
- SegCaps在LIDC-IDRI数据集的LUNA16子集上的肺部分割效果有所提升
动态路由
CZiFan博主写的特别好,推荐阅读原文。
Hinton提出的原始的胶囊网络中,胶囊间的路由相当于做一个全连接映射,每一条路由路径都需要上一层胶囊和下一层胶囊的所有维度的全连接映射,从而使得参数量特别大,可以用如下图解直观解释。
而这篇论文中,作者提出在映射的时候,通过窗口控制和同一胶囊(同一类型胶囊)共享权重的方法,减少参数,其实可以理解为,在底层的每一个胶囊内做卷积,每一个胶囊都卷出与高层的所有胶囊维度相同的张量,而后对于每一个底层胶囊卷出来的结果做路由选择(更新耦合系数cij),通过下图进行直观理解。
网友评论