Class-wise Dynamic Graph Convolution for Semantic Segmentation(ECCV 2020)详解

论文地址:https://arxiv.org/pdf/2007.09690.pdf
PPT:https://wenku.baidu.com/view/ffaeebc8ce1755270722192e453610661fd95a4f.html
讲稿:https://wenku.baidu.com/view/9a670cab1cd9ad51f01dc281e53a580217fc504f.html

一、背景

       近年来语义分割出现了很多利用上下文信息,也就是context information的一个方法,最具代表性的主要包括几种,作者总结的第一种是利用空洞卷积的ASPP模块的deeplab系列,第二种是利用金字塔池化的PSPNet,还有就是自注意力机制,代表工作包括DANet,CCNet,OCNet等等。
在这里插入图片描述

二、动机

       这篇论文的动机就是刚才这些方法在融合上下文信息时都面临着一些问题,比如说deeplab系列的方法还有PSPNet方法它们在融合上下文信息时都不够自适应,就是说可能会融合到错误的信息,从而对分割产生一些不好的影响。而利用自注意力机制的Non-local block的工作则是把全局的信息都融合进来,但是这样就会融入很多多余的语义信息。所以为了更好地进行上下文信息的学习和融合,作者选择图卷积来实现这一目的。一方面图卷积的邻接矩阵可以用来描述两个结点之间的连接关系,另一方面图卷积可以很好地利用结点之间的关系来进行图推理,因此呢可以通过设计邻接矩阵来进行特定的feature的融合过程。

       下图是作者使用该文章中提出来的图卷积方式做的一个语义分割效果可视化,从上到下从左到右依次为:原始图像,groundtruth,deeplabV3结果,作者的CDGCNet结果。可以看出,作者的方法保留了更多的上下文细节,并使边界分割得更准确。
在这里插入图片描述

三、主要贡献

       这篇文章的主要贡献有两个,一个是class-wise learning strategy,也就是一个逐类别的学习策略,它的意思就是说我们要在类别层面上进行构图然后去做图卷积优化;另一个是Dynamic Sampling,叫动态采样,因为是逐类别进行,所以在采样过程中可能会采样到一些困难样本,也就是把本来是错误的结果采样进来,这个错误结果作者称为hard negative,所以为了解决这个问题作者采用一种叫做动态采样的方法去挖掘这个困难样本,然后去优化这个图卷积过程。这两个方法组合在一起就是这个文章提出来的Class-wise dynamic graph convolution,简称CDGC,类动态图卷积。


四、方法

1. Coarse-to-fine Framework

       下图是这篇文章设计的一个整体框架,采用了Coarse-to-fine(从粗到精)的框架。首先用一个basic network(可以是任何最新的语义分割架构,文章中用的deeplabV3)去生成一个粗略的分割结果,以及对应的一个feature,称作coarse feature,然后再把这个coarse feature 放入CDGC模块去做refine过程,然后将reasoned feature和之前的coarse feature 二者concat起来或者是sum起来,然后再使用1*1卷积得到最终的预测结果。
在这里插入图片描述
2. Class-wise Graph Convolution

       下图是CDGC模块的详细结构,它主要包含两步,一步是图构建,一步是图卷积。构图时将经过一个backbone(resnet101),将降采样后的feature map上的每个点作为图的结点。和前人工作不同的是作者的图卷积过程是逐类别进行的,就是刚才说的class-wise learning strategy,主要就是想把属于同一类别的点进行构图,防止属于其它类别的点对这一类别的学习过程进行干扰,因此就需要basic network 预测出来的分割结果作为一个过滤器,去采样不同类别的对应的点来构图。然后在构图过程中就会采样到困难样本,然后为了缓解这一问题文章就提出采用Dynamic Sampling来去对这个困难样本进行一个优化。然后经过图卷积过程就得到了reasoned feature,然后再做一个1*1卷积得到一个和之前的coarse feature相同的形状,这样的话方便之后的结合和预测。
在这里插入图片描述
       下面通过公式具体介绍一下这篇文章中的图构建和图卷积。

       第一种构图方式:Similarity Graph

       利用结点间的相似度作为邻接矩阵的边的权值。因为在图卷积里构图其实就是在构邻接矩阵。具体来说就是假如对于两个结点的feature, x i x_i xi x j x_j xj,定义两个可以学习的线性变换, ϕ \phi ϕ ϕ ’ \phi’ ϕ 来衡量这两个feature的相似度,就得出公式:

                                           F ( x i , x j ) = ϕ ( x i ) T ϕ ′ ( x j ) F(x_{i},x_{j}) = \phi(x_{i})^{\scriptscriptstyle T}\phi'(x_{j}) F(xi,xj)=ϕ(xi)Tϕ(xj)

       这两个线性变换是可以学习的,相当于一个动态学习的构图方式,之后然后再进行一个softmax归一化就得到了邻接矩阵,公式如下:

                                           A i j = e x p ( F ( x i , x j ) ) ∑ j = 1 N e x p ( F ( x i , x j ) ) A_{ij} = \frac{exp(F(x_{i},x_{j}))}{\sum_{j=1}^{N}{exp(F(x_{i},x_{j}))}} Aij=j=1Nexp(F(xi,xj))exp(F(xi,xj))

       这种构图方式是一个非常朴素的构图方式,在实现中就是对于同类别的点来进行全连接的一个构图。

       第二种构图方式:Dynamic Sampling

       在Similarity Graph的基础上这篇文章采用了一种动态采样的方法来选点构图,在训练过程中同时利用在基础网络预测出来的预测map(记作C)和groundtruth mask(记作G)来选点,这样的话呢,这个叫Sampled的式子就是采样的一些类别:

               S a m p l e d = C − C ∩ G + G − C ∩ G + r a t i o ⋅ C ∩ G Sampled=C-C\cap G+G-C\cap G+ratio\cdot C\cap G Sampled=CCG+GCG+ratioCG

                                 = C ∪ G − ( 1 − r a t i o ) ⋅ C ∩ G =C\cup G-(1-ratio)\cdot C\cap G =CG(1ratio)CG

       第一项 C − C ∩ G C-C\cap G CCG 叫做hard negative,就是本不属于这一类的点却给它采样进来了;第二项 G − C ∩ G G-C\cap G GCG 叫做hard positive,就是本应该属于这一类的点却没有被采样进来;最后一项 C ∩ G C\cap G CG 叫做easy positive,就是属于这一类的点并且也给采样出来了,也就是简单样本。所以从这个公式可以看出在选点的时候就是把所有困难样本点先全部选出来,然后再有一定比率地去选择简单样本来辅助这个训练过程。

       具体示意图如下图,以“骑车的人”作为一个目标类别,图中红色和绿色的点就代表困难样本和简单样本。困难样本从图上可以看到,主要是在远的物体上和边界上,远的物体因为非常小然后经过降采样之后就很难去识别;边界的话是非常模棱两可的一个东西,它可能会划分到别的物体上。从这张图中我们可以看出远处有骑车的人和行人,所以被分类错误的远处的骑车的人和骑车人的边界(图中大部分红点)叫做hard positive。而远处的行人将它识别出来了但它本不属于“骑车的人”这一个类别,叫做hard negative。动态采样就是在这两个困难样本(红点)和简单样本(绿点)上采出来的点之间进行构图。
在这里插入图片描述
       在构图完毕后就可以进行图卷积,在图卷积的时候本文采用了一个非常标准的形式:

                                                  Z = σ ( A X W ) Z=\sigma(AXW) Z=σ(AXW)

       A是邻接矩阵,X是输入的一个feature map,W是要学习的网络参数, σ \sigma σ 是非线性激活函数,本文采用的是ReLU,Z是经过图卷积之后的一个feature。


五、实验

在这里插入图片描述
       为了证明文章提出的CDGC模块的有效性,作者在Cityscapes数据集上进行了一系列的消融实验,首先是验证了class-wise学习方式的有效性(第一个表格),主要是比较class-wise GCN和plain GCN的表现,plain-GCN就是单纯在feature map上进行图卷积,而resnet101 baseline指的是在backbone基础上再加一个1*1卷积去预测,可以看出采用class-wise的方式带来的mIOU的提升是最大的,也就是直接说明了class-wise learning strategy的有效性。

       在第二个表格中作者直接验证整体CDGC模块的有效性,第一行还是之前的baseline,第二行是resnet101加上一个ASPP就是代表deeplabV3,可以看出来单独加了CDGC也比单独加ASPP要表现得好一点,然后最后两行是在ASPP基础上再加上CDGC,相当于有一个更好的基础网络然后再去做一个coarse-to-fine的一个优化,可以看到这样取得了一个更好的精度,而其中sum和concat主要是两类feature的一个叠加方式。

       第三个表格主要是比较一下不同构图方式的表现,首先第一行是一个baseline,然后第二行是用一个简单的刚才说的Similarity来构图的一个方式,可以看到仅仅用相似度这种方法去构图也可以带来提升,然后之后的几行是用本文提出的Dynamic Sampling去构图,后面的值是对简单样本的一个采样率,由低到高的,可以看到当这个采样率超过0.4的时候就已经超过了用相似度来构图的方式,然后当这个采样率越来越高,它表现也是越来越高,当采样率达到1的时候也就是全采出来之后它的表现是最好的,达到在Cityscapes验证集的81.1的mIOU。

       表4是验证挖掘困难样本是否有效的一个实验,在训练的时候作者主要挖掘了hard positive和hard negative这两类困难样本来优化学习过程,从表中可以看到这两类困难样本的选择确实可以带来mIOU的提升。

       除了Cityscapes数据集,作者还在PASCAL VOC 2012数据集和COCO Stuff数据集上进行了实验,从表中可以看到CDGCNet在三个语义分割常用的数据集上取得了更好的结果。
在这里插入图片描述
       下图是一个class-wise feature的可视化,作者选取了几个特定的类别来看,从上到下是车子、植被和行人,可以看到基础网络识别出来的feature(第二列)有一些不确定的点或者识别错误的点,但是通过图卷积(第三列)直接可以把不确定的点或者错误的点把它给强化或者纠正掉,这样就会直接带来一个精度上的提升,也说明CDGCNet的有效性。
在这里插入图片描述
       然后下面这个图是一个更加广义的效果图,作者直接在验证集上挑了一些比较困难的样本去做一个分割可视化,也可以看到CDGCNet(第三列)确实要比基础网络deeplabV3(第二列)的识别效果要好一些。
在这里插入图片描述

### LlamaIndex 多模态 RAG 实现 LlamaIndex 支持多种数据类型的接入与处理,这使得它成为构建多模态检索增强生成(RAG)系统的理想选择[^1]。为了实现这一目标,LlamaIndex 结合了不同种类的数据连接器、索引机制以及强大的查询引擎。 #### 数据连接器支持多样化输入源 对于多模态数据的支持始于数据收集阶段。LlamaIndex 的数据连接器可以从多个异构资源中提取信息,包括但不限于APIs、PDF文档、SQL数据库等。这意味着无论是文本还是多媒体文件中的内容都可以被纳入到后续的分析流程之中。 #### 统一化的中间表示形式 一旦获取到了原始资料之后,下一步就是创建统一而高效的内部表达方式——即所谓的“中间表示”。这种转换不仅简化了下游任务的操作难度,同时也提高了整个系统的性能表现。尤其当面对复杂场景下的混合型数据集时,良好的设计尤为关键。 #### 查询引擎助力跨媒体理解能力 借助于内置的强大搜索引擎组件,用户可以通过自然语言提问的形式轻松获得所需答案;而对于更复杂的交互需求,则提供了专门定制版聊天机器人服务作为补充选项之一。更重要的是,在这里实现了真正的语义级关联匹配逻辑,从而让计算机具备了一定程度上的‘认知’功能去理解和回应人类意图背后所蕴含的意义所在。 #### 应用实例展示 考虑到实际应用场景的需求多样性,下面给出一段Python代码示例来说明如何利用LlamaIndex搭建一个多模态RAG系统: ```python from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, PromptHelper, ServiceContext from langchain.llms.base import BaseLLM import os def create_multi_modal_rag_system(): documents = SimpleDirectoryReader(input_dir='./data').load_data() llm_predictor = LLMPredictor(llm=BaseLLM()) # 假设已经定义好了具体的大型预训练模型 service_context = ServiceContext.from_defaults( chunk_size_limit=None, prompt_helper=PromptHelper(max_input_size=-1), llm_predictor=llm_predictor ) index = GPTSimpleVectorIndex(documents, service_context=service_context) query_engine = index.as_query_engine(similarity_top_k=2) response = query_engine.query("请描述一下图片里的人物表情特征") print(response) ``` 此段脚本展示了从加载本地目录下各类格式文件开始直到最终完成一次基于相似度排序后的top-k条目返回全过程。值得注意的是,“query”方法接收字符串参数代表使用者想要询问的内容,而在后台则会自动调用相应的解析模块并结合先前准备好的知识库来进行推理计算得出结论。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lil Wing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值