Transformer在CV领域有可能替代CNN吗?

部署运行你感兴趣的模型镜像


目前已经有基于Transformer在三大图像问题上的应用:分类(ViT),检测(DETR)和分割(SETR),并且都取得了不错的效果。那么未来,Transformer有可能替换CNN吗,Transformer会不会如同在NLP领域的应用一样革新CV领域?后面的研究思路可能会有哪些?

湃森:要从方法提出的动机来剖析

回答这个问题,笔者认为可以从方法提出的动机来剖析比较合适,即为什么我们需要它;而不是简单的“存在即合理”,大家皆用我也用的风向标。
Why CNN?

首先我们应该了解为什么CNN会在图像领域被大规模应用,我们可以从三个主要点说起,比如基于传统的方法,基于模式识别的方法,基于深度学习的方法。

1. 传统方法在视觉任务上的应用绝大多数都依赖于在某个领域具有丰富经验的专家,去针对具体的任务设计出一组最具有代表性的数据表示来作为输入特征进行处理,使得特征之间具备可区分性,典型的有SIFT。
其次,一些特征提取的方法也需要人为的参与,手工设计出一些特征提取算子,比如一些经典的边缘检测算子,水平检测,垂直检测等。
然而,一方面需要依赖专家手动设计特征的方式所需要的先验知识多,模型的的性能也极其依赖于其所设计出来的数据表示,这样一来不仅费时费力,而且也很难针对实际场景中复杂多变的任务去设计出一种合适的算子,不具备泛化性。
另一方面,受制于数据采集的环境,设备等影响,比如光照,拍摄视角,遮挡,阴影,背景等等,这些因素会严重制约模型的性能,即手工设计的特征并不具备鲁棒性。

2. 基于模式识别的方法大多数是一些与机器学习相关的技术,比如随机森林,支持向量机,感知机等。
机器学习较传统方法的一个显著优势就是,可以避免人为进行纯手动设计特征,它能够学习出一组从输入的数据表示到输出的映射这一套规则。
比如AutoEncoder便能够从一组输入中学习出另一组数据的表示,虽然生成的结果基本是模糊的。尽管这些方法具有以上的优势,但是如何学习高效的学习出一组更合适的映射规则是关键。
对于高效性来说,以感知机为例,它利用多个MLP来进行特征的学习从而来表征输入数据。但是这样有很明显的缺陷,一方面计算量是非常庞大的,另一方面直接将输入flatten为一个列向量,会破坏图像中目标原有的结构和上下文联系。
在此基础上,我们可以继续优化它,把它推广到更一般的表示——CNN,MLP其实是CNN的一种特例。

3. 基于深度学习的方法在图像识别领域最典型的应用便是CNN。CNN是一种分层(hierarchical)的数据表示方式,高层的特征表示依赖于底层的特征表示,由浅入深逐步抽象地提取更具备高级语义信息的特征。
比如第一层更倾向于提取边缘,角点,线条等low-level的特征,第二层提取颜色,纹理等mid-level的特征,第三层提取更具抽象语义的high-level的特征。网络的深度有助于模型提取更抽象地高级特征,网络的宽度有利于模型提取更丰富的特征表示。
这种连接主义 (connectionism)本质上是一种解决问题很好的思路,每一层都学习各自简单的表示,但最后通过连接起来,却形成了强大的(powerful)的特征表征能力!

此外,CNN还具有一个非常重要的特性,它是通过共享卷积核来提取特征,这样一方面可以极大的降低参数量来避免更多冗余的计算从而提高网络模型计算的效率,另一方面又结合结合卷积和池化使网络具备一定的平移不变性(shift-invariant)和平移等变性(equivariance)。
当然,对于分类任务来说,我们是希望网络具备平移不变性的特点,而对于分割任务来说我们则更希望其具备平移等变性,不过这些都是后话,在这里不展开阐述。因此,这便是CNN如何学习高效的学习出一组更合适的映射规则的关键。

虽然CNN具备如此多的优点,但不是一开始就一蹴而就,也并不是完美无瑕的。

以图像分割为例,在全卷积神经网络FCN提出以前,大多数基于CNN的方法都是基于Patch-wise即将图像块作为输入输入到CNN中去进行相应类别预测,这种方式一来计算非常冗余,二来也缺乏充足的上下文信息。

所以为什么FCN会这么有影响力,甚至可以称为是一个mile-stone的网络,就在于它真正意义上将patch-wise做到了pixel-wise,这对于语义分割这种密集型任务来说是至关重要的。

当然,FCN也存在许多的缺点,诸如分割结果粗糙等,当这并不妨碍我们基于它的思想去进行很多的拓展。
比如最近几年提出的很多分割论文都是针对它去进行改进,有人提倡改善编码器利用更强大的卷积模块去提取更具备代表性的特征。
有人热衷于改善解码器,比如引入跳跃连接操作来弥补编码器下采样过程中空间细节信息的丢失从而来实现更精准的定位,关于如何跳跃又是一个问题,有直接连线的Unet。
继而有人又借助语义鸿沟(semantic gap)或者背景噪声干扰这些口去突破,利用多个卷积去消除,结合高级特征的强语义和低级特征丰富的细节信息去指导融合的也有,另外还有借助注意力方式去消除歧义和抑制背景噪声的也大有人在。

除了编解码器之外,我们借用特征金字塔的思想还可以结合多层的结果去融合输出,得到一个更加细化的特征表示。在抛掉模型本身,也可以从任务本身下手,从全监督到半监督,自监督,few-shot learning,ome-shot learning,甚至是无监督域等等也有很多方向可以突破。

其他视觉任务如分类,检测或者low-level的任务如超分,去噪等也可以此类比,很多人写不来论文或者解决不了问题的关键点在于根本没发现问题在哪里,又何谈解决问题。

Why transformer?

目前为止,我们已经简要的总结了CNN为什么会被提出以及它的优势在哪。
尽管CNN存在以上优势,比如它利用卷积核或滤波器不断地提取抽象地高级特征,理论上来说其感受野应该能覆盖到全图,但许多研究表明其实际感受野远小于理论感受野,这不利于我们充分的利用上下文信息进行特征的捕获,虽然我们可以通过不断的堆叠更深的卷积层,但这显然会造成模型过于臃肿计算量急剧增加,违背了初衷。
而transformer的优势就在于利用注意力的方式来捕获全局的上下文信息从而对目标建立起远距离的依赖,从而提取出更强有力的特征。

因此,我们并不需要说一味的抛弃CNN,或许可以转换下思路把两者结合起来,将transformer当做是一种特征提取器利用起来,再结合CNN的一些优势去解决现有的问题。
对于接下来这个方向的思考,笔者推测当过了这把trasformer的新鲜劲,即在各个任务上都利用transformer替代一遍后,未来的工作更多的是结合这两者,来实现一个更优或者说是一个更reasonable的结果,让我们拭目以待。

总的来说,每一种技术的提出,都会受到当时所处环境或多或少的影响,然后通过不断地发现问题,提出问题,再到解决问题这样一步步不停地迭代。
从宏观角度上来看,一个学科技术要发展的更快更好,其中的一个很重要原因便是具备普适性。
个人认为这一点非常重要,普适性意味着入门门槛低,这样涌入这个圈子的人就多,形成的“泡沫”就大,资本才会为其买单,真正意义上潜心研究的专家才能更被凸显出来,才能有更充足的经费和动力去研究,去突破现有的技术将知识的边界不断的拓宽,利用科技造福人类。
当然,这里面必定夹杂着许多鱼龙混杂的人或物,但是只要宏观方向把握得当,制度制定得比较完善,就能够避免“泡沫”的幻灭,整体维持一个健康向上的发展。毕竟,任何事物都具备两面性,发展是一把双刃剑。
唯有寄希望于巨头公司和机构有更大的担当,当好这个时代的领头羊和风向标,在制度的笼子下引领着这个时代朝着健康向上的道路去发展,而不是诸如一窝蜂的跑到菜市场去搞“社区团购”之类的割韭菜活动,而是应该做到真正意义上的“科技向善”。

齐国君:CNN和Transformer在处理视觉信息上各有优缺点

CNN网络在提取底层特征和视觉结构方面有比较大的优势。这些底层特征构成了在patch level 上的关键点、线和一些基本的图像结构。这些底层特征具有明显的几何特性,往往关注诸如平移、旋转等变换下的一致性或者说是共变性。
比如,一个CNN卷积滤波器检测得到的关键点、物体的边界等构成视觉要素的基本单元在平移等空间变换下应该是同时变换(共变性)的。CNN网络在处理这类共变性时是很自然的选择。
但当我们检测得到这些基本视觉要素后,高层的视觉语义信息往往更关注这些要素之间如何关联在一起进而构成一个物体,以及物体与物体之间的空间位置关系如何构成一个场景,这些是我们更加关心的。目前来看,transformer在处理这些要素之间的关系上更自然也更有效。
从这两方面的角度来看,将CNN在处理底层视觉上的优势和transformer在处理视觉要素和物体之间关系上的优势相结合,应该是一个非常有希望的方向。

小小将:足够大的参数+好的训练方法,三层神经网络可以逼近任何一个非线性函数

先简单来看一下transformer在分类,检测和分割上的应用:(1)分类 ViT: An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

把图像分成固定大小的patchs,把patchs看成words送入transformer的encoder,中间没有任何卷积操作,增加一个class token来预测分类类别。
(2)检测 DETR:End-to-End Object Detection with Transformers

先用CNN提取特征,然后把最后特征图的每个点看成word,这样特征图就变成了a sequence words,而检测的输出恰好是a set objects,所以transformer正好适合这个任务。
(3)分割 SETR:Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers

用ViT作为的图像的encoder,然后加一个CNN的decoder来完成语义图的预测。
当然,目前基于transformer的模型在分类,检测和分割上的应用绝不止上面这些,但基本都是差不多的思路。
比如ViT-FRCNN:Toward Transformer-Based Object Detection这个工作是把ViT和RCNN模型结合在一起来实现检测的。关于transformer更多在CV上的工作,可以看最新的一篇综述文章:A Survey on Visual Transformer

这里来谈一下自己几点粗鄙的认识:

(1)CNN是通过不断地堆积卷积层来完成对图像从局部信息到全局信息的提取,不断堆积的卷积层慢慢地扩大了感受野直至覆盖整个图像;但是transformer并不假定从局部信息开始,而且一开始就可以拿到全局信息,学习难度更大一些,但transformer学习长依赖的能力更强。

另外从ViT的分析来看,前面的layers的“感受野”(论文里是mean attention distance)虽然迥异但总体较小,后面的layers的“感受野“越来越大,这说明ViT也是学习到了和CNN相同的范式。

(2)CNN对图像问题有天然的inductive bias,如平移不变性等等,以及CNN的仿生学特性,这让CNN在图像问题上更容易;相比之下,transformer没有这个优势,那么学习的难度很大,往往需要更大的数据集(ViT)或者更强的数据增强(DeiT)来达到较好的训练效果。
好在transformer的迁移效果更好,大的数据集上的pretrain模型可以很好地迁移到小数据集上。还有一个就是ViT所说的,transformer的scaling能力很强,那么进一步提升参数量或许会带来更好的效果(就像惊艳的GPT模型)。

(3)目前我们还看到很大一部分工作还是把transformer和现有的CNN工作结合在一起,如ViT其实也是有Hybrid Architecture(将ResNet提出的特征图送入ViT)。
而对于检测和分割这类问题,CNN方法已经很成熟,难以一下子用transformer替换掉,目前的工作都是CNN和transformer的混合体,这其中有速度和效果的双重考虑
另外也要考虑到如果输入较大分辨率的图像,transformer的计算量会很大,所以ViT的输入并不是pixel,而是小patch,对于DETR它的transformer encoder的输入是1/32特征这都有计算量的考虑,不过这肯定有效果的影响,所以才有后面改进工作deform DETR。
短期来看,CNN和transformer应该还会携手同行。最新的论文Rethinking Transformer-based Set Prediction for Object Detection,还是把现有的CNN检测模型和transformer思想结合在一起实现了比DETR更好的效果(训练收敛速度也更快):

(4)这我想到了神经网络的本质:一个复杂的非线性系统来拟合你的问题。无论是CNN,RNN或者transformer都是对问题一种拟合罢了,也没有孰优孰劣。

就一个受限的问题来看,可能有个高低之分,但我相信随着数据量的增加,问题的效果可能最终取决于模型的计算量和参数,而不是模型是哪个,因为之前的工作已经证明:一个三层神经网络可以逼近任何一个非线性函数,前提是参数足够大,而且更重要的是你找到一个好的训练方法。

未来虽然很难说,但依然可期!

原文链接:

【1】https://www.zhihu.com/question/437495132/answer/1656908750

【2】https://www.zhihu.com/question/437495132/answer/1658559732

【3】https://www.zhihu.com/question/437495132/answer/1656610825

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

<think>好的,我现在需要回答用户的问题:“在昇腾上有这个Normalized Cut 工具包吗?” 首先,我得确认用户提到的昇腾是什么。昇腾(Ascend)是华为推出的AI处理器系列,主要用于加速深度学习等计算任务,通常和华为的MindSpore框架一起使用。 用户之前的问题是关于将图像作为图结构处理,特别是Normalized Cut(归一化割)算法。现在他们想知道在昇腾平台上是否有现成的Normalized Cut工具包。 首先,我需要回忆一下昇腾生态中的工具和库。华为的昇腾主要支持通过MindSpore框架进行模型训练和推理,同时提供一些计算库如CANN(Compute Architecture for Neural Networks)。不过,Normalized Cut是一个比较传统的图像分割算法,属于图论应用,通常在传统的计算机视觉库如OpenCV或者Scikit-image中实现。 接下来,我需要确认华为的官方资源中是否有提及Normalized Cut。查阅华为昇腾的文档和MindSpore的官方资料,发现主要聚焦于深度学习模型的支持,比如CNN、GCN等,而对于传统的图像处理算法如Normalized Cut,可能没有专门的工具包。不过,用户可能可以通过组合现有的算子来实现,或者依赖第三方库。 另外,考虑到昇腾处理器兼容性,如果用户使用的框架(如PyTorch或TensorFlow)有Normalized Cut的实现,并且这些框架支持昇腾后端,那么用户可能可以间接在昇腾上运行。但需要检查具体的实现是否依赖于特定硬件指令。 还需要考虑社区和第三方支持。例如,是否有开源项目或开发者已经将Normalized Cut移植到昇腾平台。目前看来,这方面的资源可能较少,因为Normalized Cut更常见于传统CV库而非深度学习框架。 总结下来,直接的回答应该是昇腾没有官方的Normalized Cut工具包,但用户可以通过其他方式间接实现。同时,建议用户参考昇腾支持的库或考虑使用其他方法。需要确保回答准确,避免误导用户,同时提供可行的替代方案。</think>以下是关于昇腾(华为Ascend)平台上是否支持**Normalized Cut工具包**的逐步解释: --- ### 1. **昇腾平台的基本生态** 昇腾(Ascend)是华为的AI计算平台,核心包括: - **昇腾AI处理器**(如Ascend 910/310):专为深度学习设计的高性能硬件。 - **CANN(Compute Architecture for Neural Networks)**:底层计算架构,提供算子加速库。 - **MindSpore框架**:华为自研的深度学习框架,原生支持昇腾硬件。 **当前重点**:昇腾生态主要面向深度学习模型(如CNNTransformer、GNN等),而非传统图像处理算法。 --- ### 2. **Normalized Cut的常见实现** Normalized Cut(归一化割)是经典的图分割算法,其传统实现依赖以下工具: - **OpenCV**:通过`cv2.ximgproc.segmentation.createGraphSegmentation()`提供基于图的图像分割。 - **Scikit-image**:提供图割算法接口。 - **MATLAB**:内置图论工具包。 **关键点**:这些传统实现通常基于CPU计算,未针对昇腾硬件优化。 --- ### 3. **昇腾平台是否直接支持Normalized Cut?** - **官方工具包**:截至2023年,**华为未提供专用的Normalized Cut工具包**。 - **间接实现可能性**: - **自定义算子开发**:通过CANN的TBE(Tensor Boost Engine)或MindSpore自定义算子功能,用户可尝试实现Normalized Cut的核心步骤(如拉普拉斯矩阵计算、特征值分解)。 - **第三方库移植**:若已有Python/C++实现的代码,可通过昇腾的AI异构计算架构(ACL)接口适配到昇腾硬件,但需手动优化计算流程。 --- ### 4. **替代方案** #### (a) 使用昇腾支持的深度学习分割方法 如果目标是图像分割,可优先考虑昇腾优化的深度学习模型: - **模型类型**:U-Net、DeepLab、Mask R-CNN等。 - **工具支持**:MindSpore Model Zoo中提供预训练模型,可直接部署到昇腾硬件。 #### (b) 混合计算 - **CPU+昇腾协同**:在CPU上执行Normalized Cut算法,仅将计算密集部分(如矩阵运算)卸载到昇腾NPU加速。 - **示例**:使用MindSpore的`numpy`兼容接口处理传统算法逻辑,调用昇腾算子加速关键计算。 --- ### 5. **实践建议** 1. **优先调研MindSpore生态**: - 检查MindSpore的[图神经网络库](https://www.mindspore.cn/graph/docs/zh-CN/master/index.html)是否支持类似功能。 - 搜索MindSpore社区是否有开源Normalized Cut实现案例。 2. **手动实现核心步骤**: - 构建图的邻接矩阵(权重矩阵 $$W$$)和度矩阵 $$D$$。 - 计算广义特征值问题 $$(D - W)v = \lambda Dv$$(需依赖线性代数库)。 - 若使用昇腾,需调用其BLAS/LAPACK加速库(如通过MindSpore的`ops`模块)。 3. **性能权衡**: - Normalized Cut的时间复杂度为 $$O(n^3)$$($$n$$为节点数),即使使用昇腾加速,超大规模图像仍可能效率不足。 - 可尝试超像素预分割减少节点数量。 --- ### 6. **资源参考** - **华为官方文档**: - [MindSpore自定义算子开发指南](https://www.mindspore.cn/tutorials/experts/zh-CN/master/operation/op_custom.html) - [CANN算子开发文档](https://support.huawei.com/enterprise/zh/doc/EDOC1100173560) - **相关代码片段(伪代码)**: ```python import mindspore as ms from mindspore import ops # 示例:在MindSpore中构建邻接矩阵 def build_adjacency_matrix(image): # 实现像素相似性计算 ... return W # 调用昇腾加速的矩阵运算 W = build_adjacency_matrix(image) D = ops.diag(ops.sum(W, axis=1)) L = D - W eigenvalues, eigenvectors = ops.eig(L) # 需验证昇腾是否支持特征分解 ``` --- ### 结论 **昇腾平台目前没有官方集成的Normalized Cut工具包**,但可通过以下方式实现: 1. **自定义开发**:利用MindSpore/CANN的算子扩展能力手动实现。 2. **混合计算**:结合CPU处理算法逻辑与昇腾加速关键运算。 3. **替代方案**:使用深度学习方法(如GCN分割模型)直接利用昇腾的优化支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI研究院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值