ContrastMask: Contrastive Learning to Segment Every Thing

news2025/1/9 16:53:41

在这里插入图片描述

摘要

部分监督实例分割是一种通过学习有限的base类和带注释的掩码来从novel类别中分割对象的任务,从而消除了沉重的注释负担。解决这一问题的关键是建立一个有效的类不可知掩码分割模型。与以前只在base类别上学习此类模型的方法不同,在本文中,我们提出了一种名为ContrastMask的新方法,该方法在统一的像素级对比学习框架下,在base类别和novel类别上学习mask分割模型。在这个框架中,base类别的带注释掩码和新类别的伪掩码作为对比学习的先验,其中来自掩码区域(前景)的特征被拉到一起,并与来自背景的特征进行对比,反之亦然。通过该框架,极大地提高了前景和背景之间的特征区分,便于类不可知的掩码分割模型的学习。在COCO数据集上的详尽实验证明了我们的方法的优越性,它优于以前的最先进技术。

1. Introduction

实例分割是计算机视觉中最基本的任务之一,它要求对整体图像进行像素级预测,并识别每个单独的物体。许多工作[8,13,18,20,27,32,40,43]通过依赖大量可用的像素级注释数据来提高实例分割性能。然而,执行像素级注释(掩码注释)是非常繁重的,这阻碍了大量新类别实例分割的进一步发展。

由于box注释比mask注释[12]更便宜,更容易获得,解决上述问题的常用方法是执行部分监督的实例分割[15,19,23,46]。这个实例分割任务最初是在论文Learning to Segment Every Thing[19]中提出的,其中对象类别分为两个部分:base和novel。它们都有box注释,而只有base类别有额外的掩码注释。然后,该任务的目标是利用带掩码注释的base类数据,将实例分割模型推广到新类别。在部分监督环境下,实现良好的实例分割性能的主要障碍是如何通过对具有有限注释的数据的学习来区分任意类别的每个框内的前景和背景。

之前的方法[2,15,19,23,30,31,46]通过学习一个类别不可知的掩码分割模型来分离前景和背景,通过捕获类别不可知的线索,如形状[23]和外观共性[15]来解决这一任务。然而,这些方法只在base类上学习类不可知的mask分割模型,忽略了大量新类别的训练数据,因此缺乏将mask分割模型在base类上的分割能力转移到新类别上的桥梁。

为了建立这种桥梁,在本文中,我们提出了一种新的部分监督实例分割方法ContrastMask,该方法在统一的像素级对比学习框架下,在base类别和novel类别上学习一种类不相关的mask分割模型。在此框架中,我们设计了一种新的查询共享像素级对比损失,以充分利用来自所有类别的数据。为此,通过类激活映射(Class Activation Map, CAM)[2,45]计算出的base类的带注释掩码或novel类的伪掩码作为区域先验,不仅表示前景和背景分离,还表示共享查询、正键和负键。具体来说,给定一个包含base类别和novel类别的训练图像batch,我们建立两个共享查询:前景query和背景query,通过平均掩码区域内和外部的特征来获得,分别包括注释掩码和伪掩码。然后,我们执行一种特殊的采样策略来选择合适的key。通过引入提议的损失,我们期望将掩码区域内/外的key拉到前景/背景共享查询中,并将其与掩码区域外/内的键进行对比。最后,将像素级对比学习框架学习到的特征融合到类别不相关的掩码头中进行掩码分割。

与之前的方法相比,ContrastMask有几个优点:1)充分利用训练数据,使得新类别的数据也有助于分割模型的优化过程;2)更重要的是,它通过统一的像素级对比学习框架搭建了一个桥梁,将base类别的分割能力转移到novel类别,特别是base类别和novel类别的共享query,不断提高了base类别和novel类别的前景和背景特征区分能力。

ContrastMask超越了所有以前最先进的部分监督实例分割方法在COCO数据集[26],以很大的差距。值得注意的是,我们的方法以ResNeXt-101-FPN[25,41]为骨干,对novel类别的mask分割达到39.8 mAP。

2. Related Work

2.1 Instance Segmentation

实例分割是一种结合对象检测和语义分割的任务,即将每个像素同时分配给特定的类别和单个实例。Mask R-CNN[18]通过扩展Faster R-CNN,为每个检测到的包围框生成一个Mask。PANet[27]通过建立自底向上的路径aug和跨多层特征的横向连接提高了分割性能。HTC[8]实现了交叉执行和掩码信息流,取得了较好的性能。DSC[13]在检测和分割任务之间形成了双向关系,并取得了最先进的性能。BMask[11]建立了一个平行头部来预测物体的边界,可以将其融合到mask头部来细化分割结果。BC-Net[21]分别采用双层GCN和自注意对目标轮廓和实例掩码进行回归。除了这些两阶段方法外,CondInst[32]、BlendMask[7]、SOLO[36]、SOLOv2[37]、YOLACT[5]、FCIS[24]等一阶段方法也获得了相当的性能,推理速度较快。

2.2 Pixel-level contrastive learning

最近,一些工作[1,6,29,38,39,42,44]被提出来执行像素级对比学习,以弥补分类任务和密集预测任务之间的错位。然而,这些方法和我们的方法在目标和设计理念上都不同:它们的目标是学习逐像素多类分类的一般密集表示,因此它们通过从两个不同的增强视图中采样key来执行像素级实例辨别;而我们的目标是改善前景和背景的辨别,所以我们通过在一张图像中从前景和背景区域采样key来进行像素级的实例辨别。

2.3 Partially-supervised instance segmentation

MaskX R-CNN[19]作为部分监督实例分割的先驱方法,在mask R-CNN[18]中设计了边界盒头与掩码头之间的参数化转换函数,基于边界盒头编码所有类别的嵌入假设,实现了对新类别的分割。shapemask[23]利用掩码注释从有限的数据中学习形状先验,并期望这些形状先验可以推广到新对象。ShapeProp[46]利用box监督来学习突出区域,并通过有效的消息传递模块将这些区域传播到整个盒子建议中,可以生成更准确的形状先验。CPMask[15]通过解析不同类别之间的形状共性和外观共性,取得了良好的性能。它声称,共享这些共性可以促进掩码预测的泛化能力,以类不可知的方式。OPMask[2]利用对象掩码先验(OMP)为掩码头学习提供前景的一般概念,使网络能够集中在一个区域内的主要对象上。最近,Deep-MAC[4]研究了mask头架构对新类别细分性能的影响。它采用了更重的架构,如Hourglass-52[28]作为掩模头,并取得了出色的性能。然而,在实践中,轻量化的mask头总是更受欢迎。

这些方法都只在base类上优化掩码分割模型,忽略了大量novel类别的数据,缺乏将base类分割能力转移到新类别的桥梁。我们通过为密集掩码预测引入统一的对比学习框架来解决这个问题,其中base类别和novel类别都有助于掩码分割模型学习。

3. ContrastMask

我们首先描述了所提议的对比度蒙版的整个流程图。然后,我们展示了如何实例化统一的像素级对比学习框架,以增强base类别和novel类别上前景和背景之间的特征区分。最后,我们引入损失函数来学习部分监督实例分割模型。

3.1. Overview

在这里插入图片描述
图2。ContrastMask的整个架构,这是建立在mask R-CNN[18]基础上,包含一个额外的对比学习头。Sn表示特征图的大小为 n × n n \times n n×n, X和Y分别为输入RoI特征图和其增强特征图。

如图2所示,我们的方法是建立在经典的两级mask R-CNN[18]架构上,带有一个额外的对比学习头,称为CL head,它在base和novel类别上执行统一的像素级对比学习。CL Head以RoI特征图和box头生成的CAM作为输入。它由我们提出的像素级对比损失(第3.3节)监督,并为掩码头输出增强的特征图。最后,掩码头以融合的特征图为输入,预测类别不可知的分割图。接下来,我们将描述方法的每个组件的细节。

3.2. Contrastive Learning Head (CL Head)

CL Head的目标是增加base类别和novel类别在前景和背景之间的特征区分,减少每个区域(背景或前景)内的特征差异,从而便于掩模头的学习。我们通过学习新的像素级对比损失来实现这一点。

如图3所示,对比学习头(CL head)的架构灵感来自SimCLR[10],它由用于对比学习的轻量级编码器 f ( ⋅ ) f(·) f()和映射器 g ( ⋅ ) g(·) g()组成。编码器 f ( ⋅ ) f(·) f()包含8个3*3 Conv-ReLU层,映射层 g ( ⋅ ) g(·) g()是一个三层MLP,其中最后一层后面没有ReLU函数。

在这里插入图片描述
图3。我们的对比学习头(CL head)的流程图由一个编码器和一个映射器组成,由一个像素级的对比损失监督。GT掩码(如果是base类)或从CAMs转换而来的伪掩码(如果是novel类)用于计算对比损失。

给定RoIAlign[18]提取的感兴趣区特征图X,形状为C、H、W,CL Head将其输入编码器,得到增强的特征图 Y = f ( X ) Y = f(X) Y=f(X),并将其纳入掩码头进行掩码分割。接下来,Y首先被压平,然后送到映射器,它将表示映射到应用像素级对比损失的空间: Z = g ( Y ) Z = g(Y) Z=g(Y) 。映射后,特征图Z被reshape为与Y相同的大小。

3.3. Query-sharing Pixel-level Contrastive Loss

现在,我们介绍我们新的像素级损失,它可以在统一的对比学习框架下学习base类别和novel类别的掩码分割模型。该损失函数的核心设计思想是base类和novel类别共享两个类不可知query,一个是前景 q + q^+ q+,另一个是背景 q − q^- q,从而形成一个桥梁,将base类的分割能力转移到novel类别。因此,我们将损失函数命名为查询共享像素级对比损失。

查询共享像素级对比损失分别由前景和背景组成。以前景为例,设 K + K^+ K+ K − K^- K分别表示一组前景key和一组背景key。然后将查询共享像素级的前景对比损失定义为:

在这里插入图片描述
其中 τ τ τ为温度超参数, φ ( ⋅ , ⋅ ) φ(·,·) φ()表示余弦相似度。同样,我们可以得到背景 L K − , K + q + L^{q^+}_{K^-,K^+} LK,K+q+的查询共享像素级对比损失。接下来,我们详细描述了如何获取前景和背景 query q + q^+ q+ q − q^- q,以及前景和背景key集 K + K^+ K+ K − K^- K。我们在图4中说明了这些细节。

(1)Foreground and background partition

给定一个投影特征映射Z ,设 M ∈ { 0 , 1 } H × W M \in \{0,1\}^{H \times W} M{0,1}H×W A ∈ { 0 , 1 } H × W A \in \{0,1\}^{H \times W} A{0,1}H×W分别是与Z对齐的ground-truth mask和class-activation map (CAM)。设 I I I表示特征图Z的 H × W H \times W H×W空间位置格,那么给定一个位置 i ∈ I i \in I iI,我们可以从特征图Z得到一个位置 i i i的特征向量 z i z_i zi,同样从GT掩码和CAM分别得到位置 i i i的掩码标签 m i m_i mi和CAM值 a i a_i ai。整个空间位置格可以划分为两个不相交的格:前景位置格 I + I^+ I++和背景位置格 I − I^- I。对于base类,我们可以通过使用ground-truth mask来实现这种划分: I + = { i ∈ I ∣ m i = 1 } a n d I − = { i ∈ I ∣ m i = 0 } ; I^+ = \{i \in I|m_i = 1\} and I^- = \{i \in I|m_i = 0\}; I+={iImi=1}andI={iImi=0};而对于novel类别,由于ground-truth mask不可用,我们可以使用CAM来指导前景和背景的划分: I + = { i ∈ I ∣ a i > = 1 − δ } 和 I − = { i ∈ I ∣ a i < = δ } I^+ = \{i \in I|a_i >= 1 -δ\}和I^- = \{i \in I|a_i <= δ\} I+={iIai>=1δ}I={iIai<=δ},其中 δ = 0.1 δ = 0.1 δ=0.1是一个小的阈值,在我们的方法中是固定的。

(2)Query and key set generation

I ( n ) + I^+_{(n)} I(n)+ I ( n ) − I^-_{(n)} I(n)分别是第n个RoI提案的前景和背景分区,该批处理由n个RoI提案 { Z ( n ) } n = 1 N \{Z^{(n)}\} ^N _{n=1} {Z(n)}n=1N组成,分别来自基本类别和新类别。前景和背景查询 q + , q − q^+, q^- q+q是通过对所有proposal的前景和背景分区中的特征进行平均得到的。以前景query q + q^+ q+为例,通过下式计算:

在这里插入图片描述
一个RoI proposal的前景和背景key(这里为了简便起见,我们省略了索引n)分别由 K + = { z i ∣ i ∈ ξ ( I + , σ ) } 和 K − = { z i ∣ i ∈ ξ ( I − , σ ) } K^+ = \{z_i|i \in \xi (I^+, σ)\}和K^- = \{z_i|i \in \xi (I^-, σ)\} K+={ziiξ(I+,σ)}K={ziiξ(I,σ)}得到,其中 ξ ( ⋅ , σ ) \xi(·,σ) ξ(σ)是一个随机抽样算子,它以比例 σ σ σ从集合中随机抽样一个子集。

(3)Hard and easy key mining

以往的研究表明,挖掘hard key和easy key有助于通过对比学习来学习判别特征[34,35]。对于base类别,我们将靠近对象边界的key指定为hard key,远离对象边界的key指定为easy key。从GT掩模中可以很容易地得到GT边界。假设 b i 是 b_i是 biRoI proposal Z Z Z上距离位置 i i i最近的边界位置。然后,我们有一组hard key和一组easy key:

在这里插入图片描述

对于novel类别,由于ground-truth边界不可用,我们简单地通过随机采样来挖掘hard key和easy key,即 K H = { z i ∣ i ∈ ξ ( i , σ ) } K^H = \{z_i | i \in \xi(i, σ)\} KH={ziiξ(iσ)} K E = { z i ∣ i ∈ ξ ( i , σ ) } K^E = \{z_i | i \in \xi(i, σ)\} KE={ziiξ(iσ)}

在这里插入图片描述
图4。说明如何获取query和key的示意图。对于base类,我们使用ground-truth mask进行分区和提取边来指导hard key的采样。对于novel类别,我们首先通过阈值 δ δ δ对CAM进行二值化,然后进行分区,并根据分区随机采样easy key和hard key。前景query q + q^+ q+和背景query q − q^- q是通过对一批对象proposal的对应分区的特征进行平均得到的。

(4)Instantiation of the proposed contrastive loss

现在,给定一个RoI proposal Z Z Z,无论是base类别还是novel类别,我们都描述了如何从中获取前景和背景key集,以及如何从中挖掘hard key集和easy key集。由此,我们可以得到四种类型的key集(如图4)。参考式(1),我们的查询共享像素级对比损失定义为:

在这里插入图片描述

3.4. Class-agnostic mask head

如图5所示,掩码头的结构和相应的损失函数与mask R-CNN[18]相同,只是做了三处修改:1)在[2,15,46]中,我们将最后一个卷积层的输出通道从80改为1,得到了一个类不相关的掩码头。2)我们将CL Head的输出特征图与掩码头的输入特征图进行拼接,使得掩码头的输入特征更加鲜明,便于学习。3)我们利用CAM[2]来告诉掩模头应该聚焦在哪个区域。这可以通过将CAM添加到输入特征映射中轻松实现。

3.5. Loss Function

在这里插入图片描述

4. Experiments

在本节中,我们首先描述实验的设置和实现细节。然后,我们将ContrastMask与最先进的部分监督实例分割方法进行比较。最后,我们进行了消融研究,以显示在我们的方法中每个成分的贡献。

4.1. Experimental Setup

我们的实验是在具有挑战性的COCO数据集[26]上进行的。为了模拟base类别和novel类别,训练集被分为两个子集。通常,在PASCAL VOC数据集[14]中显示的类别被称为VOC,其余类别为nonVOC。我们主要在这两个子集上进行实验,nonvoc --> voc表明非voc类别被视为base,voc类别被视为novel,反之亦然。我们使用COCO-train2017中的图像进行训练,使用COCO-val2017中的图像进行评估。实例分割的典型指标,即mask AP,包括mAP, AP50, AP75, APS, APM和APL,用于评估。这些指标是根据novel类别计算的。

(1) Implementation details

我们基于MMDetection[9]实现了我们的方法。我们采用ResNet-50- fpn作为大多数消融实验的骨干,ResNet- 101-FPN作为骨干,以便与其他方法进行公平的比较。为了公平比较,均采用1X和3X,所有消融实验均采用1X进行,以提高效率。在训练过程中,我们采用带动量的SGD进行优化,初始学习率为0.02。所有实验都在8个V100 GPU上进行,批大小为16,即每个GPU 2张图像。每个输入图像都调整了大小,以保持图像的长边小于1333,短边小于800的规则。采样比σ设为σ = 0.3,easy key和hard key的温度超参数 τ τ τ (Eq. 1)设为 τ = 0.7 τ = 0.7 τ=0.7KaTeX parse error: Expected group after '^' at position 2: τ^̲'= 1- τ = 0.3。我们将 L c o n L_{con} Lcon的λ从0.25线性升温到1.0。此外,还采用了常用的增强方法,如随机翻转和多尺度训练。

4.2. Experimental Results

在这里插入图片描述

4.3. Ablation Study

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx root 以及alias差别

1. 前言 今天的目的主要是梳理下在 nginx 中 root 以及 alias 在用法上有什么不同。其实这个问题看起来很简单。但是对于前端同学而言还是很困难的&#xff0c;毕竟有的前端同学都没弄过服务器 2. 结论 root 以及 alias 都是对 url 发起根目录进行控制。但是颗粒度有所不同roo…

【深基18.例3】查找文献(C++,图的遍历)

题目描述 小K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个&#xff08;也有可能没有&#xff09;参考文献的链接指向别的博客文章。小K 求知欲旺盛&#xff0c;如果他看了某篇文章&#xff0c;那么他一定会去看这篇文章的参考文献&#xff08;如果他之前已经看过这篇参…

JavaScript 中如何代理 Set(集合) 和 Map(映射)

ECMAScript6 中 Set 和 Map 的代理方法上一节&#xff1a;《JavaScript 中如何代理数组 》| 下一节&#xff1a;《JavaScript 中的反射&#xff08;Reflect&#xff09;原理与应用 》今日正在编写中&#xff0c;未完待续… jcLee95 邮箱 &#xff1a;291148484163.com CSDN…

Git分支操作

实操记录 假定非管理人员操作&#xff1a; 直推&#xff1a; 新建特性分支cbry&#xff1a; 刷新分支&#xff1a; checkout切换&#xff1a; 本地文件查看&#xff1a; 再merge&#xff1a; 就此&#xff0c;master的代码就合并到特性分支cbry&#xff1a; 新增内容&#xff…

数字化技术转型

这篇老生常谈&#xff08;我写过N次&#xff09;&#xff0c;是应一位IM群中的朋友的困惑问答汇集而成的。&#xff08;1&#xff09;学科分类我上学学的是计算机系。我上的大学一开始并没有计算机系&#xff0c;后来是电子工程系和数学系的老师抽调组成了计算机系。后来&#…

申请大学用的是IB预估分?

IB课程体系以其独特的优越性成为越来越多国际高中生的选择。如今全球共有3300多所高校接受IB成绩申请&#xff0c;其中包括美国常春藤盟校、英国G5在内的多所名校。 但是&#xff0c;大家知道吗&#xff0c;国内学习IB课程的学生是需要用预估分来申请大学的。今天&#xff0c;小…

多用户及时通信系统

目录1. QQ用户登录1.1 用户登录11.2 用户登录21.3 用户登录32. 拉取在线用户3. 无异常退出4. 私聊系统5. 群聊3. 发送文件3.1 服务端推送新闻3.2 离线留言和离线发文件1. QQ用户登录 1.1 用户登录1 qqcommon包下 User类序列化 Message消息类序列化 MessType接口 qqclient.ut…

拉伯杠杆平台|沪指上涨,大金融板块领涨,有股票连续5涨停!

A股周二上午全体小幅上涨&#xff0c;大金融集体上涨&#xff0c;推动指数上行&#xff0c;商场全体动摇不大。A50期货高开高走&#xff0c;盘中暴拉超2.6%。 不过&#xff0c;部分个股仍然动摇不小&#xff0c;有多只股票接连涨停。 别的&#xff0c;新股持续分解&#xff0c…

ATAC-seq分析:数据介绍(2)

1. 简介 ATACseq (Assay for Transposase-Accessible Chromatin using sequencing) 使用转座酶在测序前有效地片段化可访问的 DNA&#xff08;DNA可极性&#xff09;。结果提供了一种绘制可访问/开放染色质基因组范围的方法。 与其他技术相比&#xff0c;ATACseq 有几个优点&am…

嵌入式开发学习之--串口通讯(下)

提示&#xff1a;本篇来做一个关于串口的输入输出实验。 文章目录前言一、项目概况1.1、项目需求1.2、项目来源1.3、开发环境1.4、项目意义1.5、项目效果展示二、开发步骤2.1、涉及硬件电路2.2、项目代码2.2.1、串口配置总结前言 前一篇文章我们介绍了串口的几种类型以及串口标…

Linux Shell 编程,运算符,条件与分支,循环

Linux Shell 编程&#xff0c;运算符&#xff0c;条件与分支&#xff0c;循环1.Shell运算符2.判断语句3.for循环4.while循环1.Shell运算符 学习如何在shell中进行各种运算操作 案例&#xff1a;计算&#xff08;57&#xff09;3的值&#xff1a; #!/bin/bash res$(((57)*3)) …

游戏物体GameObject

在unity中所有游戏物体都是GameObject&#xff0c;这也是编程中的对象。 创建物体 在hierarchy窗口中&#xff0c;右击可以创建一个物体&#xff0c;当然也可以创建空物体。 物体属性 创建完物体后&#xff0c;一般可以在此处用这些工具来改变物体。 移动&#xff0c;旋转和…

戴尔科技集团助力中国石油大学打造现代数据中心

小的时候      总是幻想着      能够躺在床上上课      没想到现在竟然实现了      没错,对于当代大学生尤其是19级、20级来说,大学生活似乎是个虚无缥缈的词汇,因为相比与在校生活,在家上网课的时间可能会更长,一不留神就上了三年的“家里蹲”。      即使…

安装配置高度安全的匿名操作系统,利用暗网情报数据抓取工具获取普通人根本查看不到的信息

安装配置高度安全的匿名操作系统,利用暗网情报数据抓取工具获取普通人根本查看不到的信息。 Whonix匿名操作系统,Whonix 是一个专注于匿名,隐私和安全的操作系统。它基于Tor匿名网络,Debian GNU / Linux和隔离安全性。DNS泄漏是不可能的,即使具有root权限的恶意软件也无法…

“多点”开花,独立走向新零售

12月7日&#xff0c;亚洲最大的数字零售服务商多点Dmall正式向港交所递交招股说明书&#xff0c;在零售行业逐渐向线上线下一体化、店仓一体模式迈进之时&#xff0c;多点Dmall成为很多传统零售商转型路上的首选合作伙伴&#xff0c;给予了资本市场一定想象空间。 但也有观点认…

【Lua】ToLua逻辑热更新

1 前言 Lua基础语法 中系统介绍了 Lua 的语法体系&#xff0c;本文将进一步介绍 Unity3D 中基于 ToLua 实现逻辑热更新。 逻辑热更新是指&#xff1a;在保持程序正常运行的情况下&#xff0c;在后台修改代码逻辑&#xff0c;修改完成并推送到运行主机上&#xff0c;主机无缝接入…

HarmonyOS原子化服务最新概念、呈现形式与触发方式

一、HarmonyOS原子化服务最新概念 总体介绍&#xff1a; 原子化服务&#xff08;Ability&#xff09;是由HarmonyOS服务开放平台接入的一种技能&#xff0c;为华为智慧服务、智慧搜索、服务直达、智慧语音以及智慧视觉等流量入口提供服务技能。原子化服务以轻量化的呈现形式&…

高级网络应用复习——TCP与UDP,ACL列表, 防火墙,NAT复习与实验(带命令)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.知识点总结 1.传输层的协议 &#xff08;1&#xff09;TCP 和…

「实操」结合图数据库、图算法、机器学习、GNN 实现一个推荐系统

本文是一个基于 NebulaGraph 上图算法、图数据库、机器学习、GNN 的推荐系统方法综述&#xff0c;大部分介绍的方法提供了 Playground 供大家学习。 基本概念 推荐系统诞生的初衷是解决互联网时代才面临的信息量过载问题&#xff0c;从最初的 Amazon 图书推荐、商品推荐&…

TCP的三次握手四次挥手详解

想要了解TCP的三次握手和四次挥手&#xff0c;首先要了解TCP的头部结构 TCP的头部结构如下 16位源端口号&#xff1a; 客户端地址信息16位目标端口号&#xff1a; 服务端地址信息32位序列号&#xff1a; 请求报文端数据流子节开始的位置&#xff08;比如位1024&#xff5e;2…