2024年10月
精神股东浅谈博客园盈利的问题
历史上从来没有憋大招实现成功改革的前例,更何况赚钱
1方面憋大招 需要漫长的时间,另一方面漫长的时间后市场环境已经发生变化
2 博客园已经有了一批终生会员,为啥没有终生会员参与原子未来发展的讨论会呢
作为博客园的精神股东,这次从小处入手,谈谈园子的建设问题
1 捐助 功能
https://cnblogs.vip/donate
这个能不能作为一个组件 写文章的人可以选择让组件出现在自己博客页面上,捐助园子和作者分成
2 周边
https://cnblogs.vip/store
周边的进一步 就是众筹或者带货上链接,实在不行也可以大家砍砍价格
可以放在博客园标识限制,增加一个大家想买什么,例如水杯压什么的,作为一个卖东西的入口
3 博客页面广告位 组件
博客园接的广告放到博客页面 作者可以选择,作者和园子分成
大家不是讨厌广告,是讨厌吃独食的广告
4 班级 https://edu.cnblogs.com/
不少人自学一个东西都是边写边学,班级的进一步计划就是 自学见证
例如我用1块钱开始自学,写10篇文章,学完退款,自学的同一个主题的还可以拉群
现在能创建班级的都是老师
条件可以放宽吗 卖网课的博主也可以 看某个视频教程学习的也可以
keycloak~token配置相关说明
会话有效期
在 Keycloak 中,"SSO Session Idle" 和 "SSO Session Max" 是用于配置单点登录(SSO)会话的两个参数。这两个参数影响用户在系统中的会话过期和最大有效时间。
SSO Session Idle(单点登录会话空闲时间):
定义:
表示用户在系统中没有活动的时间阈值。如果用户在这段时间内没有与系统进行交互,那么他们的单点登录会话就被视为处于空闲状态。实际意义:
当用户登录后,在一段时间内没有进行任何操作,系统会认为用户不再活跃,这时候可以选择在一定的时间后自动注销用户,以提高安全性。例如,设置为 30 分钟,如果用户在 30 分钟内没有任何操作,他们的会话将被认为是空闲的,可以选择要求用户重新验证身份。
SSO Session Max(单点登录会话最大时间):
定义:
表示用户单点登录会话的最大有效时间。即使用户一直在系统中活跃,当达到此时间阈值后,他们的会话也会被强制注销。实际意义:
即使用户一直在系统中活跃,为了安全和资源管理的目的,可以设置一个最大时间,超过这个时间后,用户将被强制重新登录,以确保他们的身份验证状态是最新的。例如,设置为 8 小时,用户的会话将在 8 小时后过期,需要重新登录。
这两个参数通常与安全性和用户体验的平衡相关。设置得太短可能导致用户频繁需要重新登录,而设置得太长可能增加安全风险。具体的设置应该根据你的应用程序的安全需求和用户行为来确定。
Client Session有效期
"Client Session Idle" 和 "Client Session Max" 是 Keycloak 中用于配置客户端会话的两个参数。这两个参数影响与客户端相关的会话过期和最大有效时间。
Client Session Idle(客户端会话空闲时间):
定义:
表示用户与特定客户端之间没有活动的时间阈值。如果用户在这段时间内没有与特定客户端进行交互,那么与该客户端关联的会话就被视为处于空闲状态。实际意义:
当用户与特定客户端建立了会话后,在一段时间内没有与该客户端进行任何操作,系统会认为用户与该客户端的会话是空闲的。这可以用于自动注销与客户端的会话,以提高安全性。
Client Session Max(客户端会话最大时间):
定义:
表示用户与特定客户端的会话的最大有效时间。即使用户一直在与特定客户端进行交互,当达到此时间阈值后,与该客户端关联的会话也会被强制注销。实际意义:
即使用户与特定客户端一直在活跃,为了安全和资源管理的目的,可以设置一个最大时间,超过这个时间后,与该客户端关联的会话将被强制结束,用户可能需要重新进行身份验证。
这两个参数通常与客户端相关的会话管理和安全性相关。设置得太短可能导致用户频繁需要重新进行身份验证,而设置得太长可能增加安全风险。具体的设置应该根据你的应用程序的安全需求和用户行为来确定。
会话有效期谁小用谁
在 Keycloak 中,会话的有效期确实是由这些参数中的最小值决定的。换句话说,如果设置了 "SSO Session Idle"、"SSO Session Max"、"Client Session Idle" 和 "Client Session Max",则会话将在这些参数中的最小值所定义的时间段内过期。
这种行为是为了确保会话的有效期在所有相关配置中都被严格限制,以提供更加精确的控制。这也意味着无论是整体的单点登录会话有效期还是与特定客户端关联的会话有效期,都将受到最小值的限制。
空闲会话
空闲时间这块,keycloak14.0.0有些bug,这块我进行了源码调整,当session max和session idle不同时,用户在session idle时间内不操作,用户会话也会超时。
在Keycloak中,有四个与空闲会话(Idle Session)相关的设置参数。它们的作用和关系如下:
Offline Session Idle(领域设置):这是Keycloak的领域设置中的一个参数,用于定义空闲会话的超时时间。当用户在一段时间内没有与Keycloak进行任何交互时,会话会被视为处于空闲状态。默认情况下,该参数设置为30天。
Offline Session Max Limited(领域设置):这是Keycloak的领域设置中的一个参数,用于定义空闲会话的最大持续时间。该参数定义了会话的最长持续时间,从会话开始到会话终止的时间段,以秒为单位。超过这个时间段后,会话将被标记为过期,并将被销毁。默认情况下,该参数也设置为30天。
Offline Session Max(领域设置):这是Keycloak的客户端设置中的一个参数,用于定义特定客户端的空闲会话的最大持续时间。每个客户端可以具有自己的空闲会话最大持续时间,以使具有不同需求的客户端具有不同的会话时间。默认情况下,它继承自领域的 "Offline Session Max Limited" 值。
Client Offline Session Idle(客户端设置):这是Keycloak的客户端设置中的一个参数,用于定义特定客户端的空闲会话的超时时间。每个客户端可以具有自己的空闲会话超时时间,以使具有不同需求的客户端具有不同的会话时间。默认情况下,它继承自领域的 "Offline Session Idle" 值。
这些参数共同用于控制空闲会话的超时和最大持续时间。"Offline Session Idle" 和 "Client Offline Session Idle" 确定了用户在没有与Keycloak进行任何交互时,会话被认为是空闲的时间。而 "Offline Session Max Limited" 和 "Offline Session Max" 确定了会话可以持续的最长时间。如果会话超过这个时间段,它将被销毁。
请注意,领域设置中的参数适用于整个领域(realm),而客户端设置中的参数适用于特定的客户端。通过为每个客户端设置不同的值,您可以针对不同的客户端应用程序调整会话时间。
登录超时
- 如果用户在登录页,长时间停留(达到了后台配置的“登录超时”时间),不进行登录提交操作,会出现
登录超时,请重新开始登录
的提示,这时,页面自动刷新,用户重新提交登录请求即可。 - 登录超时配置:领域设置---tokens选项,如图
对于一种开源框架和产品的学习,我们主要还是实践中去总结它,只有在实践中才能发现它的问题及那些“不为你知”的功能。
计数系统设计
在营销的场景里有三要素
- 用户
- 商品
- 优惠
在这三个要素里,再加一些如时间,数量,频次等变量,会演化出各种组合,使得业务变得非常灵活。各业务线为了满足业务,一般都会各自实现,且多数情况下都会重复实现,而且实现起来各地方都会产生交叉配置,交叉互斥的问题。在观察到这些问题后,总结并尝试用一个计数频次中间件形态的系统统一解决。一是解决了复杂度、重复建设;二是统一处理后,数据层面上将整体打通,对于用户监控、风控、特征、行为上提供完整数据。
在电商的系统中,有商品、用户、优惠三种要素。这三种要素分别在数量,时间,频次上又有多维度的分类。
如商品限量100份(数量)对用户每天(时间)每人购买限量2份(频次),按这种规律下,用户使用优惠也同样遵循这种规则,即
优惠券总数100张(数量),用户每场(时间)可使用1张(频次)
抽奖优惠也一样,即
优惠总数100张,用户每天(时间)可领取1张(频次)
发放优惠也一样,即
优惠总额100元,用户每天(时间)可优惠1次(频次)
分类法
- 按主体,维度分类
主体\维度 | 数量 | 时间 | 频次 |
---|---|---|---|
商品 | 总数 | 指定周期,天,小时,周 | 不限,1份,多份 |
用户 | 总数 | 指定周期,天,小时,周 | 不限,1份,多份 |
优惠 | 总数 | 指定周期,天,小时,周 | 不限,1份,多份 |
活动 | 总数 | 指定周期,天,小时,周 | 不限,1份,多份 |
按上面这个分类,主体会变,维度会变,先设计领域模型,分别为实体(entity);维度(dimensions);实体维度关系(entityDimensionsRel),关系领域将表示,主体将拥有多个维度,并在多个维度中设定维度值,如商品每天限购1份,那么将在entityDimensionsRel中的limit_value中设定1,time_interval设定为1天
领域模型
数据模型
数据库表模型
- 主体表 (Entities)
- EntityID: 主键,唯一标识某个主体(如商品、优惠、活动等)
- EntityType: 主体类型(如商品、优惠、抽奖等)
- EntityName: 主体名称
CREATE TABLE Entities (
EntityID INT PRIMARY KEY,
EntityType VARCHAR(50),
EntityName VARCHAR(100)
);
- 维度定义表 (Dimensions)
- DimensionID: 主键,唯一标识某个维度(如数量、时间、频次)
- DimensionName: 维度名称(如“数量”、“时间”、“频次”)
- DimensionType: 维度类型(如整数、日期、时间区间等)
CREATE TABLE Dimensions (
DimensionID INT PRIMARY KEY,
DimensionName VARCHAR(50),
DimensionType VARCHAR(50)
);
- 主体-维度关系表 (EntityDimensions)
- EntityDimensionID: 主键,唯一标识某个主体-维度关系
- EntityID: 外键,关联到Entities表
- DimensionID: 外键,关联到Dimensions表
- LimitValue: 该维度的限制值(如限量、限次等)
- TimeInterval: 时间间隔(如每天,每场活动等),适用于时间维度
CREATE TABLE EntityDimensions (
EntityDimensionID INT PRIMARY KEY,
EntityID INT,
DimensionID INT,
LimitValue INT,
TimeInterval VARCHAR(50),
FOREIGN KEY (EntityID) REFERENCES Entities(EntityID),
FOREIGN KEY (DimensionID) REFERENCES Dimensions(DimensionID)
);
上面这些表可以完整记录主体在各维度的限制值。还需要一张实时记录主体数据在各维度的过程数据
- 实例数据记录表 (EntityDimensionRecords)
- RecordID: 主键,唯一标识某条记录
- EntityID: 外键,关联到Entities表
- DimensionID: 外键,关联到Dimensions表
- UserID: 外键,关联到用户表(适用时)
- Value: 在该维度上记录的数值
- RecordDate: 记录的日期或时间。
CREATE TABLE EntityDimensionRecords (
RecordID INT PRIMARY KEY,
EntityID INT,
DimensionID INT,
UserID INT,
Value INT,
RecordDate DATETIME,
FOREIGN KEY (EntityID) REFERENCES Entities(EntityID),
FOREIGN KEY (DimensionID) REFERENCES Dimensions(DimensionID)
);
数据流转
样例1
用户参与大转盘活动,活动周期内只能抽一次奖
主体:大转盘活动
维度:时间,计数
关系:限制值(一次);限制时间(活动周期);
简单填入数据,业务就可以满足了。
现在又有新的业务需求,即这个活动周期为1个月,用户每天都要能参与一次,现有的表模型就不支持了!
关系表(EntityDimensions)的时间字段TimeInterval是个varchar,表示1天、1小时等枚举值是可以,如果表示时间段,每天等带频次的复杂时间是不够的,所以,最好的办法之一就是将时间维度拆出一张表
CREATE TABLE TimePeriods (
TimePeriodID INT PRIMARY KEY,
PeriodName VARCHAR(50),
TimeInterval VARCHAR(50), -- 时间周期(每天、每小时、每半小时、每分钟)
StartTime TIME, -- 时间段开始时间
EndTime TIME -- 时间段结束时间
);
有了这张表后,就可以表示周期时间段的计数关系了。
有了这张表后,业务在查询EntityDimensionRecords,就知道这条记录的周期,开始时间结束时间。
如果时间频次TimeInterval是天,当前时间为2022-12-12时,EntityDimensionRecords.RecordDate值为2022-12-11时,那么EntityDimensionRecords需要重新生成一条记录,并且RecordDate值为2022-12-12;
越往深入,能够枚举出的维度是有限的,在大的方向上,每一个维度也可以拆分出一个领域也是可行的。因为维度值不一样,单纯用维度一个变量有点满足不了需求,如时间维度和数量维度,维度值用一个变量就表示不了,时间范围最少需要2个字段。所以在不同的业务发展时期,只有当时最合适的设计,没有永远对的设计。在考虑扩展性的同时,也需要考虑研发成本。
如果以后有需求对计数的方式有变化,比如一次计数消耗2次机会,那相应的,再在EntityDimensions.LimitValue字段上做一个新表来表示计数的复杂方式。万变不离其宗,好的设计一定是支持业务慢慢成长起来的。糟糕的设计是不停的妥协设计,随着时间推移开发和维护将会越来越困难!
OpenPSG:离AGI再进一步,首个开放环境关系预测框架 | ECCV'24
全景场景图生成(
PSG
)的目标是对对象进行分割并识别它们之间的关系,从而实现对图像的结构化理解。以往的方法主要集中于预测预定义的对象和关系类别,因此限制了它们在开放世界场景中的应用。随着大型多模态模型(
LMMs
)的快速发展,开放集对象检测和分割已经取得了重大进展,但
PSG
中的开放集关系预测仍然未被探索。论文专注于开放集关系预测任务,并将其与一个预训练的开放集全景分割模型结合,以实现真正的开放集全景场景图生成(
OpenPSG
)。
OpenPSG
利用
LMMs
以自回归的方式实现开放集关系预测,引入了一个关系查询变换器,以高效地提取对象对的视觉特征,并估计它们之间关系的存在。后者可以通过过滤不相关的对来提高预测效率。最后,论文设计了生成和判断指令,以自回归的方式在
PSG
中执行开放集关系预测。大量实验表明,该方法在开放集关系预测和全景场景图生成方面取得了最先进的性能。来源:晓飞的算法工程笔记 公众号,转载请注明出处
论文: OpenPSG: Open-set Panoptic Scene Graph Generation via Large Multimodal Models
Introduction
全景场景图生成(
PSG
)的目标是对图像中的对象进行分割并识别它们之间的关系,从而构建一个全景场景图,以实现对图像的结构化理解。鉴于其在视觉问答、图像描述和具身导航等应用中的重大潜力,自从出现以来,
PSG
就吸引了研究人员的广泛关注。
以往的
PSG
方法仅能够预测封闭集对象和关系类别,而无法识别超出预定义类别的对象/关系。近年来,随着
CLIP
、
BLIP-2
等大型多模态模型(
LMMs
)的出现,出现了大量用于对象检测和分割的开放集预测方法,这得益于
LMMs
对语言的丰富理解以及视觉和语言之间的强关联。然而,开放集的关系预测迄今为止仍未被探索。
与开放集对象检测和分割相比,开放集关系预测更为复杂:模型不仅需要理解不同的对象,还需要基于它们的交互识别对象对之间的关系。尤其是,后者的计算可能呈指数级增长。为了解决这个问题,论文聚焦于开放集关系预测。
大型语言模型(
LLMs
)在各种多模态任务中展示了卓越的语义分析和理解能力。特别是在文本处理方面,
LMMs
不仅擅长解析名词(即表示对象),还对谓词(即表示对象之间的关系)给予了相当的关注,从而确保它们生成的内容具有足够的一致性。受到这一点的启发,论文提出了开放集全景场景图生成架构
OpenPSG
,利用一个大型多模态模型(例如,
BLIP-2
)来实现开放集关系预测。
具体而言,模型包括三个部分。首先是开放集全景分割器,适配了一个现有模型(例如,
OpenSeeD
),该模型能够从整个图像中提取开放集对象类别、掩码和视觉特征,形成对象对和对掩码。其次是关系查询变换器,它具有两个功能:基于对掩码提取对象对的视觉特征,并特别专注于对象之间的交互;判断对象对之间潜在的关系。这两个功能通过两组查询实现,即对特征提取查询和关系存在估计查询。只有那些被判断为可能有关系的对象对才会被送入第三部分,即多模态关系解码器。该解码器直接继承自
LMM
,以自回归的方式预测给定对象对的开放集关系,前提是特定设计的文本指令和预先提取的对视觉特征。
论文是首个提出开放集全景场景图生成任务的研究,能够实现对象掩码和关系的开放集预测。大量实验表明,
OpenPSG
在闭集设置中达到了最先进的结果,并在开放集设置中表现出色。
Task Definition
给定图像
\(I \in \mathbb{R}^{H \times W \times 3}\)
,开放集全景场景图生成的目标是从图像
\(I\)
中提取开放集全景场景图
\(G = \{O, R\}\)
,其中
\(H\)
和
\(W\)
是图像的高度和宽度。
\(O = \{o_i\}_{i=1}^{N}\)
表示从图像中分割出的
\(N\)
个对象,每个对象定义为
\(o_i = \{c, m\}\)
,其中
\(c\)
是对象类别,可以属于预定义的基础对象类别
\(C_{base}\)
或未定义的新奇对象类别
\(C_{novel}\)
。
\(m\)
表示对象在
\(\{0, 1\}^{H \times W}\)
中的二进制掩码。\(R = \{r_{i,j} \mid i,j \in \{1, 2, \ldots, N\}, i \neq j\}\)
表示对象之间的关系,其中
\(r_{i,j}\)
表示
\(o_i\)
和
\(o_j\)
之间的关系,其中
\(o_i\)
是主语,
\(o_j\)
是宾语。每个关系
\(r\)
可以属于预定义的基础关系类别
\(K_{base}\)
或未定义的新奇关系类别
\(K_{novel}\)
。
Method
如图
2
所示,
OpenPSG
包含三个组件:对象分割器、关系查询变换器 (
RelQ-Former
) 和多模态关系解码器 (
RelDecoder
)。
对于对象分割器,利用预训练的开放集全景分割模型将输入图像转换为对象类别和掩码,以及表示整个图像的视觉特征。随后,将对象类别、掩码和视觉特征输入到
RelQ-Former
中。通过两组可学习的查询,并结合设计的指令,获得与
LMM
输入格式兼容的对象对的视觉特征,以及对潜在关系存在的判断。最后,只有那些被判断可能存在关系的对象对才会被送入
RelDecoder
进行开放集关系预测,最终生成开放集全景场景图。
Object Segmenter
给定一幅图像
\(I\)
,利用预训练的开放集对象分割器(例如,
OpenSeeD
)预测图像中的对象
\(O\)
以及整个图像的视觉特征
\(F_I \in \mathbb{R}^{h \times w \times D}\)
。这里,
\(h\)
和
\(w\)
分别表示
\(F_I\)
的高度和宽度,
\(D\)
表示特征维度。
分割器的架构与
Mask2Former
类似,包括一个像素解码器。整个图像的视觉特征
\(F_I\)
指的是由像素解码器输出的视觉特征。论文开发了
patchify
模块和
pairwise
模块来处理分割器的输出,生成
RelQ-Former
的输入。
Patchify Module
Patchify
模块旨在对视觉特征
\(F_I\)
和对象掩码
\(m\)
进行序列化,使它们能够作为输入被
RelQ-Former
处理。
类似于视觉变换器(
ViT
)的输入
patchify
层,利用单个卷积层将提取的
\(F_I\)
转换为视觉标记序列
\(F_{Iseq} \in \mathbb{R}^{L \times D}\)
,其中
\(L\)
是
patch
的数量,
\(D\)
是特征维度。当卷积层的卷积核大小和步幅均为
\(p\)
时,
\(L\)
的计算公式为
\(L = \frac{h}{p} \times \frac{w}{p}\)
。
同时,对每个提取对象的掩码
\(m_i\)
采用最近邻插值,其中
\(m_i\)
的大小为高度
\(\frac{h}{p}\)
和宽度
\(\frac{w}{p}\)
,然后将其重塑为长度为
\(L\)
的一维向量。通过以相同方式处理所有掩码,为所有对象获得掩码序列
\(m_{seq} \in \{0, 1\}^{N \times L}\)
。
Pairwise Module
成对模块旨在构建主语-谓语对。给定图像
\(I\)
中的
\(N\)
个对象,将所有对象
\(O\)
成对组合为主语-谓语对
\(P = \{(o_i, o_j) | i, j \in \{1, 2, \ldots, N\}, i \neq j\}\)
。
\(P\)
中的主语-谓语对的数量为
\(N \times (N - 1)\)
,随着
\(N\)
的增加,此数量呈指数增长。因此,还获得了组合的主语-谓语对类别集
\(c^{pair} \in \{(c_i, c_j) | i, j \in \{1, 2, \ldots, N\}, i \neq j\}\)
。
通过对每一对主语-谓语使用逻辑
OR
操作(对两个对象的
\(m_{seq}\)
),从
\(m_{seq}\)
中构建对应于索引
\(i\)
和
\(j\)
的两个对象的掩码序列。该操作适用于所有主语-谓语对,从而得到主语-谓语对的成对掩码序列
\(m_{seq}^{pair} \in \{0, 1\}^{N \times (N-1) \times L}\)
,其中
\(L\)
是
patch
的数量。
Relation Query Transformer
关系查询变换器利用获得的
\(F_{Iseq}\)
、
\(c^{pair}\)
和
\(m_{seq}^{pair}\)
,采用两种不同类型的查询,即成对特征提取查询和关系存在估计查询,并结合定制的指令。这种方法有助于提取主语-谓语对特征,并评估哪些主语-谓语对可能存在关系。
Pair Feature Extraction Query
成对特征提取查询的目标是基于主语-谓语对掩码,从整个图像视觉特征中提取对应的主语-谓语对特征。
常见的提取方法包括掩码池化,它为目标的主语-谓语对提取特征,平等地对待主语-谓语对上的每个区域。然而,用于关系预测的特征应更关注对象之间发生交互的区域。通过利用注意力机制,论文促进了代表主语-谓语对视觉特征序列
\(F_{Iseq}\)
中不同区域的视觉标记之间的交互。这种方式可以增强对关系预测至关重要的区域。此外,受到先前研究的启发,论文设计了一条指令以帮助这个可学习查询理解其提取主语-谓语对特征的目的。
具体而言,对于每一对主语-谓语对
\((o_i, o_j)\)
,首先将成对特征提取查询
\(Q^{feat} \in \mathbb{R}^{E \times D}\)
输入到自注意力层 (
\(SA(\cdot)\)
),同时加入专门为成对特征提取查询设计的成对指令。这个成对指令经过分词器层处理,以得到
\(F_{Inst}^{feat} \in \mathbb{R}^{X^{feat} \times D}\)
,其指定了成对特征提取查询的功能,即“根据掩码从视觉特征中提取主语-谓语 (
\(c_i\)
,
\(c_j\)
) 特征”。这里
\(E\)
是成对特征提取查询的标记数量,
\(X^{feat}\)
是成对指令的标记数量。需要注意的是,还将主语和谓语的类别名称
\((c_i, c_j)\)
纳入这个成对指令中。此操作可表示为
F_{SA}^{feat} = Trunc(SA(Concat(Q^{feat}, F_{Inst}^{feat})), E),
\end{equation}
\]
其中
\(Concat(\cdot)\)
表示拼接操作,
\(Trunc(\cdot)\)
表示截断操作,而在该截断操作中
\(E\)
表示仅提取前
\(E\)
个特征,即与成对特征提取查询对应的特征。
接下来,使用掩码交叉注意力层 (
\(MaskCA(\cdot)\)
),将
\(F_{SA}^{feat}\)
作为查询,将
\(F_{Iseq}\)
作为键和值,将
\(m_{seq}\)
作为掩码,提取与主语-谓语对对应的特征
F_{CA}^{feat} = MaskCA(F_{SA}^{feat}, F_{Iseq}, m_{seq}).
\end{equation}
\]
特征
\(F_{CA}^{feat}\)
通过前馈网络 (
\(FFN(\cdot)\)
) 进一步精炼,表示为
\(F_{FFN}^{feat} = FFN(F_{CA}^{feat})\)
。
通过重复这个过程两次,获得要输入到多模态关系解码器中的主语-谓语对的视觉特征
\(F_{I}^{pair(i,j)} \in \mathbb{R}^{E \times D}\)
。对所有主语-谓语对并行执行这些操作,以获得所有对的相应特征。
Relation Existence Estimation Query
除了成对特征提取查询,论文还设计了一种关系存在性估计查询,以确定主体
\(o_i\)
和对象
\(o_j\)
之间是否可能存在关系,而不预测具体的关系类别。其目的是过滤掉不相关的主语-谓语对,以节省后续
LMM
解码的计算。
具体来说,对于每一个主语-谓语对
\((o_i, o_j)\)
,关系存在性估计查询
\(Q^{exist} \in \mathbb{R}^{1 \times D}\)
,类似于成对特征提取查询,被输入到自注意力、掩蔽交叉注意力和前馈网络层,分别与
\(F_{Iseq}\)
、
\(m_{seq}\)
以及特别设计的关系指令进行交互。关系指令的目的是指导关系存在性估计查询以确定主语-谓语对中是否可能存在关系,例如“
\(o_i\)
和
\(o_j\)
之间是否存在关系?”在经过分词器处理后,关系指令产生
\(F_{Inst}^{exist} \in \mathbb{R}^{X^{exist} \times D}\)
,其中
\(X^{exist}\)
表示标记的数量。
最终,提取的特征被输入到一个关系存在性预测层,该层包括一个
2
层的多层感知机(
MLP
),并使用
sigmoid
函数将预测得分标准化到
\([0, 1]\)
范围内。值得注意的是,论文使用二进制标签进行训练,以指示对象之间是否存在关系,并在推理过程中利用下面指定的选择模块进行过滤。
Selector
由
2
层多层感知机(
MLP
)实现的选择模块被设置为过滤不相关的主语-谓语对。只有得分高于阈值
\(\theta\)
的对才能被输入到多模态关系解码器中。与对所有主语-谓语对进行预测相比,可以实现
\(20 \times\)
的加速。
Multimodal Relation Decoder
多模态关系解码器的目标是利用上述模块提取的主语-谓语对特征
\(F_I^{i, j}\)
,结合指导其进行开放集关系预测的指令。受到先前研究的启发,首先设计了一种生成指令,以自回归的方式执行开放集关系预测。这种方法效果良好,但发现它在一定程度上倾向于更常见的关系。因此,论文进一步设计了一种判断指令,利用
LMM
的强大分析和判断能力。判断指令同样采用自回归的方法,但用于判断对象之间是否存在特定关系,从而简化开放集关系预测的复杂性。接下来,将分别细化这两种指令。
Generation Instruction
对于生成指令,遵循开放集物体识别中使用的指令设计,利用“
\(c_i\)
和
\(c_j\)
之间有哪些关系?”,
\(c_i\)
和
\(c_j\)
分别指主语和谓语的名称。使用分词器将该指令转换为特征
\(F_{inst}^{gen} \in \mathbb{R}^{X^{gen} \times D}\)
,其中
\(X^{gen}\)
是生成指令的标记数。将生成指令的特征
\(F_{inst}^{gen}\)
与主语-谓语对特征
\(F_{I}^{pair(i,j)}\)
一起输入到多模态关系解码器
\(Dec(\cdot)\)
中,以自回归的方式预测所有可能的关系,公式形式为:
r_{i,j} = Dec(Concat(F_{I}^{pair(i,j)}, F_{inst}^{gen})).
\end{equation}
\]
如果预测到多个关系,它们将通过分隔符 "[
SEP
]" 分开。
Judgement Instruction
与生成指令不同,判断指令指导关系解码器根据给定的关系名称判断该关系是否存在于主语和谓语之间。例如,“请判断
\(c_i\)
和
\(c_j\)
之间是否存在关系
\(r_k\)
”。在这种情况下,只需要多模态关系解码器回答“是”或“否”来确定该关系的存在。值得注意的是,将每个关系的完整判断指令输入解码器可能会非常复杂。因此,将关系名称放在指令的末尾。在推理过程中,将判断指令分为两部分:在关系名称之前的部分,通过分词器转换为
\(F_{inst}^{judge}\)
,而关系名称本身则处理为
\(F_{inst}^{rel}\)
。
借助自回归方式进行开放集关系预测,首先将主语-谓语对特征
\(F_{I}^{pair(i,j)}\)
与
\(F_{inst}^{judge}\)
输入多模态关系解码器,公式形式为:
F_{prefix}^{(i,j)} = Dec(Concat(F_{I}^{pair(i,j)}, F_{inst}^{judge})),
\end{equation}
\]
随后该结果会被缓存,以便对每个关系进行后续计算。对于每个关系
\(r_k\)
,多模态关系解码器只需要处理
\(F_{prefix}\)
和
\(F_{inst}^{rel(k)}\)
以实现关系预测,公式形式为:
J_{i,j,k} = Dec(Concat(F_{prefix}^{(i,j)}, F_{inst}^{rel(k)})),
\end{equation}
\]
其中
\(J_{i,j,k}\)
表示对三元组
\((o_i, r_k, o_j)\)
的判断。当
\(J_{i,j,k}\)
为“是”时,表示关系
\(r_k\)
存在于
\(o_i\)
和
\(o_j\)
之间;否则,则表示该关系不存在。通过这种方法,可以保持与生成指令相同的预测时间。
对所有可能存在关系的主语-谓语对执行上述过程,最终实现开放集关系预测。对于使用生成指令的方法,将其称为
OpenPSG-G
,而对于使用判断指令的方法,则称为
OpenPSG-J
,而
OpenPSG
默认指的是后者。
Loss Function
在模型训练过程中,涉及两个损失函数:用于通过关系查询变换器中的关系存在估计查询来估计关系存在性的二元交叉熵损失
\(\mathcal{L}_{exist}\)
,以及与多模态关系解码器使用的语言模型训练一致的交叉熵损失
\(\mathcal{L}_{LM}\)
。总损失为:
\(\mathcal{L} = \lambda \mathcal{L}_{exist} + \mathcal{L}_{LM}\)
,其中
\(\lambda\)
是一个权重因子。
Implementation details
在实验中,使用预训练的
OpenSeeD
作为开放集对象分割器。
pathify
模块的
patch
大小
\(p\)
设置为
8
。在关系查询变换器中,配对特征提取查询的长度
\(E\)
为
32
,用于过滤主语-宾语对的阈值
\(\theta\)
设置为
0.35
。在多模态关系解码器中,采用
BLIP-2
的解码器。在模型训练期间,损失的权重因子
\(\lambda\)
设置为
10
。采用与以前的方法相同的数据增强策略。使用
AdamW
优化器,学习率为
\(1e^{-4}\)
,权重衰减为
\(5e^{-2}\)
。总共训练
12
个周期,在第
\(8\)
个周期将学习率降低到
\(1e^{-5}\)
。实验使用四个
A100 GPU
。需要注意的是,在训练期间,冻结对象分割器和多模态关系解码器的参数,仅训练提出的
RelQ-Former
。
Experiments
如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】