将图像作为点集学习ICLR2023

文章介绍了ContextClusters(CoCs),这是一种新型的视觉特征提取方法,它将图像视为点集并通过聚类算法提取特征。CoCs不依赖卷积或注意力机制,而是依赖于空间交互的聚类,提供了可解释性和良好的泛化能力。这种方法在几个基准测试上的表现与ConvNets和ViT相当甚至更好,展示了在视觉领域的潜力。
摘要由CSDN通过智能技术生成

什么是图像,如何提取潜在特征?

卷积网络(Convolutional Networks)将图像视为矩形形状的组织像素,并通过局部区域中的卷积运算提取特征;Vision Transformer(ViT)将图像视为一系列patch,并通过全局范围内的注意力机制提取特征。 还有一种更有前景的视觉特征提取方法,被称为Context Clusters(CoCs,上下文聚类)。上下文聚类(CoCs)将图像视为一组未组织的点,并通过简化的聚类算法提取特征。详细地,每个点包括原始特征(例如,颜色)和位置信息(例如,坐标),并且采用简化的聚类算法来分层地分组和提取深度特征。CoCs是无卷积和无注意力的,并且只依赖于空间交互的聚类算法。模型设计简单,实验表明CoCs通过聚类过程的可视化赋予了令人满意的可解释性。CoCs旨在为视觉领域提供一个新的视角,这可能也会在不同领域中具有广泛的应用,并展现出深刻的见解。即使不以SOTA性能为目标,COCs在几个基准测试上仍然取得了与ConvNets或ViT相当甚至更好的结果。

来自:Image as Set of Points

前置内容:新颖的特征提取器vision gnn

ViG的架构如下:
fig1
对于一张 H × W × 3 H\times W\times 3 H×W×3的图像,我们将其导出 N N N个patch,通过变换得到每个patch为特征向量 x i ∈ R D x_{i}\in R^{D} xiRD。我们有 X = [ x 1 , . . . , x N ] X=[x_{1},...,x_{N}] X=[x1,...,xN]。这些patch被视为无序的节点集合 V = [ v 1 , . . . , v N ] V=[v_{1},...,v_{N}] V=[v1,...,vN]。对于节点 v i v_{i} vi可以找到 K K K近邻的邻居 N ( v i ) N(v_{i}) N(vi),并添加edge e j i ∈ E e_{ji}\in E ejiE代表从 v j ∈ N ( v i ) v_{j}\in N(v_{i}) vjN(vi)指向 v i v_{i} vi。于是可以得到 G = ( V , E ) G=(V,E) G=(V,E)。将图像视为graph,使用GNN提取其表示。

图像的graph表示的优点包括:

  • graph是一种广义的数据结构,可以将网格(图像)和序列(语言)视为graph的特例;
  • graph比网格或序列更灵活地建模复杂对象,因为图像中的对象通常不是形状规则的正方形;
  • 一个物体可以被视为多个part的组成(例如,人可以大致分为头部、上身、手臂和腿),graph结构可以构建这些part之间的连接;
  • GNN的高级研究可以转移到解决视觉任务。

X ∈ R N × D X\in R^{N\times D} XRN×D开始,GCN可以通过聚集来自其相邻节点的特征在节点之间交换信息。GCN定义为: G ′ = F ( G , W ) = U p d a t e ( A g g r e g a t e ( G , W a g g ) , W u p d a t e ) G'=F(G,W)=Update(Aggregate(G,W_{agg}),W_{update}) G=F(G,W)=Update(Aggregate(G,Wagg),Wupdate)更具体地,聚合操作通过聚合相邻节点的特征来计算节点的表示,并且更新操作进一步合并聚合的特征: x i ′ = h ( x i , g ( x i , N ( x i ) , W a g g ) , W u p d a t e ) x'_{i}=h(x_{i},g(x_{i},N(x_{i}),W_{agg}),W_{update}) xi=h(xi,g(xi,N(xi),Wagg),Wupdate)其中,聚合操作采用更简单的无参数聚合: g ( ⋅ ) = x i ′ ′ = [ x i , m a x ( { x j − x i ∣ j ∈ N ( x i ) } ) ] g(\cdot)=x''_{i}=[x_{i},max(\left\{x_{j}-x_{i}|j\in N(x_{i})\right\})] g()=xi′′=[xi,max({xjxijN(xi)})] h ( ⋅ ) = x i ′ = x i ′ ′ W u p d a t e h(\cdot)=x'_{i}=x_{i}''W_{update} h()=xi=xi′′Wupdate更新操作也可以变成多头操作,聚合后的特征 x i ′ ′ x_{i}'' xi′′被拆分为 h h h个head: h e a d 1 , . . . , h e a d h head^{1},...,head^{h} head1,...,headh,所有head被并行更新: x i ′ = [ h e a d 1 W u p d a t e 1 , . . . , h e a d h W u p d a t e h ] x'_{i}=[head^{1}W_{update}^{1},...,head^{h}W_{update}^{h}] xi=[head1Wupdate1,...,headhWupdateh]多头更新操作允许模型在多个表示子空间中更新信息,这有利于特征多样性。

简介

我们提取特征的方式在很大程度上取决于我们如何解释图像。卷积神经网络作为一种基本范式,近年来在计算机视觉领域占据主导地位,大大提高了各种视觉任务的性能。在方法上,卷积将图片概念化为矩形形式的排列像素集合,并以滑动窗口方式使用卷积提取局部特征。得益于一些重要的inductive bias,如一些局部的模式以及数据增强引入的旋转变换等,ConvNets变得高效和有效。最近,ViTs挑战了ConvNets在视觉领域的地位。Transformers将图像视为一系列patch,并使用全局范围自注意力操作自适应地交互融合patch中的信息。利用ViT,ConvNets中的固有inductive bias被放弃。

最近的研究表明,视觉社区有了巨大的改进,这主要建立在卷积或注意力之上(比如ConvNeXt,MAE)。同时,一些方法尝试将卷积和注意力结合在一起,这些方法在网格中扫描图像(依靠卷积),同时探索序列的相互关系(依靠注意力),考虑局部优先(卷积)而不牺牲全局的感受野(注意力)。虽然它们继承了两者的优点,并取得了更好的性能,但仍然局限于ConvNets和ViTs。作者认为,除了卷积和注意力之外,其他特征提取器也值得研究,而不是被引入追求SOTA改进的陷阱。

最近的研究表明,基于graph的特征提取是可行的(Vision GNN),因此,作者同样期待并提出一种新的特征提取范式,它可以提供一些新的见解,而不是渐进的性能改进。CoCs将图像视为一组points,并将points分组到簇。在每个簇中,将这些points聚集为一个center,然后自适应将center分配到所有points上。

fig2

  • 训练基于图像分类的context cluster。将图像视为points,并为points的聚类采样 c c c个center。points的特征被聚合,并分配到cluster中。对于簇中心 C i C_{i} Ci,首先聚合簇 i i i的所有points { x i 0 , . . . , x i n } \left\{x_{i}^{0},...,x_{i}^{n}\right\} {xi0,...,xin},然后将聚合结果动态分布到簇中的所有points。

具体来说,作者将每个像素视为一个具有颜色和位置信息的5维数据点。在某种意义上,这将图像转换为一组点云,并利用点云分析的方法用于图像视觉表示学习。这连接了图像和点云的表示,显示出强大的泛化能力。

通过将图像视为点的集合,CoCs对不同的数据域(如点云、RGBD图像等)具有很强的泛化应用能力。其次,CoCs提供了令人满意的可解释性。通过可视化每一层的聚类,可以明确地理解每一层的感知知识。

方法

首先描述Context Clusters管道,然后详细解释用于特征提取的Context Clusters操作,并建立Context Cluster architecture。
fig3

  • Context Cluster模块。使用Context cluster操作对一组数据点进行分组,然后在cluster中对这些点进行通讯,此后应用MLP做非线性映射。

Context Cluster管道

给定输入图像 I ∈ R 3 × w × h I\in R^{3\times w\times h} IR3×w×h,通过每个像素 I i , j I_{i,j} Ii,j的二维坐标增强图像,其中每个像素的坐标被表示为 [ i w − 0.5 , j h − 0.5 ] [\frac{i}{w}-0.5,\frac{j}{h}-0.5] [wi0.5,hj0.5]。进一步研究位置编码技术以提高性能是可行的,目前这个设计是考虑到简单和实用。增强后的图像被转为点集 P ∈ R 5 × n P\in R^{5\times n} PR5×n,其中 n = w × h n=w\times h n=w×h为点的数量,每个点具有特征3D颜色和2D坐标。点是无序的。

遵循Conv的方法,使用Context Cluster block提取特征,下图是Context Cluster block组成的深度模型:
fig4

  • 架构分为4个stage,给定一组点,上下文聚类逐步减少点的数量,提取深度特征。每个阶段都从Reducer开始,然后使用一系列Context Cluster block提取特征。

给定一组点 P ∈ R 5 × n P\in R^{5\times n} PR5×n,我们需要首先降低点数量,然后应用CoCs block提取特征。为了减少点的数量,我们在空间中均匀选择一些anchor points,并将最近的 k k k个points通过线性投影进行拼接融合。

有人可能会对如何在Points Reducer block和Context Cluster block中的anchor感到困惑。下面是详细解释。对于anchor和center,它们都是在空间中均匀生成的。为了更好地说明这一点,下图是说明案例。
fig5

  • 在某种意义上,anchor用于减少点的数量,而center用于聚类。它们在设计上都是均匀分布的。在左侧,平均提出4个anchor(用蓝点blue point标记),每个anchor有4个邻居。在右侧,平均采样9个center(用红色块red block标记),因此可以得到9个不规则的簇。center的特征是通过平均它的 k k k个邻居来实现的。在该图中,在第二个center的蓝色大圆圈中显示了邻居。

上图左侧显示了16个points和4个anchor用于points reducer,每个anchor都考虑了它最近的4个邻居。所有邻居都沿着通道维度进行连接,并且使用FC层来降低维度数并融合信息。在减少点的数量后,我们会得到一组和anchors数量相同数目的新点。

上图右侧显示了由图像点集和相应的9个簇生成的9个中心(红色块)。生成的center的特征将通过平均 k k k个邻居来给出(对于第二个center,我们平均蓝色大圆圈中的9个点)。

为了分类,我们需要平均最后一个block输出的所有点,并使用FC层进行分类。对于下游密集预测任务,如检测和分割,我们需要在每个stage后按位置重新排列输出点,以满足大多数检测和分割头的需求。

Context Cluster操作

首先,将特征点分组成簇,然后对每个簇中的特征点进行聚合再回调。给定特征点集合 P ∈ R n × d P\in R^{n\times d} PRn×d,根据相似度将所有点分成几个组,每个点单独分配到一个簇中。

首先进行线性投影得到 P s P_{s} Ps。在空间中均匀提出 c c c个center,平均其 k k k个最近的points作为center的特征。根据 P s P_{s} Ps和center的结果计算pair-wise余弦相似度矩阵 S ∈ R c × n S\in R^{c\times n} SRc×n。由于每个点都包含特征和位置信息,在计算相似度时,我们隐式地突出显示点的距离(局部性)以及特征相似度。在此之后,我们将每个点分配到最相似的center,产生 c c c个簇。值得注意的是,每个簇可能有不同数量的点。在极端情况下,一些簇可能有0点,在这种情况下,它们是多余的。

我们根据与center的相似性动态聚合簇中的points。假设一个簇包含 m m m个points( P P P的子集), m m m个points与center的相似度为 s ∈ R m s\in R^{m} sRm S S S的子集),我们把这些points映射到一个值空间 P v ∈ R m × d ′ P_{v}\in R^{m\times d'} PvRm×d。center也被映射为 v c v_{c} vc,聚合的特征 g ∈ R d ′ g\in R^{d'} gRd为: g = 1 C ( v c + ∑ i = 1 m s i g ( α s i + β ) v i ) , C = 1 + ∑ i = 1 m s i g ( α s i + β ) g=\frac{1}{C}(v_{c}+\sum_{i=1}^{m}sig(\alpha s_{i}+\beta)v_{i}),C=1+\sum_{i=1}^{m}sig(\alpha s_{i}+\beta) g=C1(vc+i=1msig(αsi+β)vi),C=1+i=1msig(αsi+β)其中, α \alpha α β \beta β是可学习的标量(用于缩放相似性), s i g ( ⋅ ) sig(\cdot) sig()是sigmoid函数,用于将相似性映射到0-1。 v i v_{i} vi P v P_{v} Pv中的第 i i i个point。

对于特征回调, g g g根据相似性自适应分配到簇中的每个点,通过这样做,点之间可以相互通信,并共享来自簇中所有点的特征,对于点 p i p_{i} pi,更新特征为: p i ′ = p i + F C ( s i g ( α s i + β ) g ) p_{i}'=p_{i}+FC(sig(\alpha s_{i}+\beta)g) pi=pi+FC(sig(αsi+β)g)其中, F C FC FC层用于将值空间的 d ′ d' d维度映射回到 d d d维。

结果

fig6

  • 分别对ViT-B/16、ResNet50、CoC-M和CoC-T without region partition的激活图、类激活图(CAM)和聚类图进行可视化。从左到右绘制四个阶段中最后一个块的结果。对于ViT-B/16,选择 [第3,第6,第9,第12] 块,并显示cls-token的余弦注意力图。聚类图表明,CoCs能够将相似的上下文聚类在一起,并直观地告诉我们模型学习了什么。

fig7

  • CoC-Tiny without region partition的聚类结果。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用粒子群优化算法进行相机标定的Matlab代码示例: ```matlab % 输入参数: % imagePoints - Nx2的矩阵,包含N个二维图像点坐标 % worldPoints - Nx3的矩阵,包含N个三维世界坐标点 % imageSize - 2x1的矩阵,包含图像尺寸 % 输出参数: % cameraParams - 相机参数,包含相机内参、畸变参数等信息 function cameraParams = PSOCameraCalibration(imagePoints, worldPoints, imageSize) % 构造优化问题 problem.objective = @calibrationError; problem.x0 = [1 1 1 1 0 0 0 0]; % 初始解 problem.lb = [0.1 0.1 0.1 0.1 -0.5 -0.5 -0.5 -0.5]; % 变量下界 problem.ub = [10 10 10 10 0.5 0.5 0.5 0.5]; % 变量上界 problem.nonlcon = []; % 非线性约束 problem.solver = 'particleswarm'; % 优化算法 problem.options = optimoptions('particleswarm', 'Display', 'iter', 'MaxIterations', 100); % 优化问题求解 x = particleswarm(problem); % 构造相机参数 intrinsicMatrix = [x(1) 0 0; 0 x(2) 0; x(3) x(4) 1]; distortionCoefficients = [x(5) x(6) x(7) x(8)]; cameraParams = cameraParameters('IntrinsicMatrix', intrinsicMatrix, 'ImageSize', imageSize, 'DistortionCoefficients', distortionCoefficients); % 定义标定误差函数 function error = calibrationError(x) intrinsicMatrix = [x(1) 0 0; 0 x(2) 0; x(3) x(4) 1]; distortionCoefficients = [x(5) x(6) x(7) x(8)]; cameraParams = cameraParameters('IntrinsicMatrix', intrinsicMatrix, 'ImageSize', imageSize, 'DistortionCoefficients', distortionCoefficients); error = reprojectionError(cameraParams, imagePoints, worldPoints); end % 定义重投影误差函数 function error = reprojectionError(cameraParams, imagePoints, worldPoints) projectedPoints = projectPoints(worldPoints, [0 0 0], [0 0 0], cameraParams.IntrinsicMatrix, cameraParams.DistortionCoefficients); error = norm(imagePoints - projectedPoints, 2); end end ``` 该代码使用了Matlab自带的粒子群优化算法函数`particleswarm`,定义了一个优化问题并求解得到相机参数。其中,`calibrationError`函数计算标定误差,`reprojectionError`函数计算重投影误差。你可以根据需要进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值