BEVCar:用于BEV地图和目标分割的相机-雷达融合

news2025/1/11 9:51:27

BEVCar:用于BEV地图和目标分割的相机-雷达融合

  • 摘要
  • Introduction
  • Related Work
  • Technical Approach
    • Image Feature Lifting
    • BEV Segmentation Head

BEVCar: Camera-Radar Fusion for BEV Map and Object Segmentation

摘要

鸟瞰视角下的语义场景分割对于移动机器人的规划和决策至关重要。虽然最近的仅依靠视觉的方法在性能方面取得了显著进展,但它们通常在恶劣的光照条件下(如雨天或夜间)表现不佳。虽然主动传感器提供了解决这一挑战的方案,但激光雷达的 prohibitively 高成本仍然是一个限制因素。将摄像机数据与汽车雷达融合提供了一种更廉价的替代方案,但在先前的研究中受到了较少关注。在这项工作中,我们旨在通过引入 BEVCar,一种新颖的联合 BEV 对象和地图分割方法,推进这一有前途的途径。我们方法的核心创新在于首先学习原始雷达数据的基于点的编码,然后利用该编码有效地将图像特征提升到 BEV 空间。我们在 nuScenes 数据集上进行了大量实验,并展示了 BEVCar 超越了当前的技术水平。此外,我们表明,将雷达信息纳入显著提高了在具有挑战性的环境条件下的鲁棒性,并改善了对远距离对象的分割性能。为了促进未来的研究,我们提供了我们实验中使用的 nuScenes 数据集的天气分割,以及我们的代码和训练模型,网址为 http://bevcar.cs.uni-freiburg.de。

Introduction

移动机器人,如自动驾驶车辆,严重依赖于对其环境的准确和健壮的感知。因此,机器人平台通常配备有各种传感器[1, 2, 3],每种传感器提供互补的信息。例如,环视摄像头提供密集的RGB图像,而激光雷达或雷达系统提供稀疏的深度测量。然而,由于这些不同模态的数据结构本质上的不同,融合这些数据提出了一个重大挑战。解决这一挑战的常用方法是采用鸟瞰视图(BEV)表示作为共享参考框架[4, 5, 6, 7, 8, 9]。

虽然激光雷达和雷达数据可以直接转换成鸟瞰图(BEV)空间,基于摄像头的信息需要从图像平面转换成俯视图。因此,已经提出了各种提升策略[4、10、11],这些策略极大地提高了仅基于视觉方法的性能,其中一些策略已扩展到融合激光雷达数据[5、7]。尽管激光雷达能够生成高度精确的3D点云,但由于其成本相较于汽车雷达要高得多,其适用于大规模部署的适用性仍然存在争议。然而,摄像头-雷达融合在研究社区中受到的关注相对较少,通常仅在添加了激光雷达输入的情况下进行研究[12、8]。相比之下,雷达被批评太稀疏,无法在独立使用中有效利用[12]。

在这项工作中,作者强调了雷达在提高机器人感知鲁棒性中的关键作用。具体来说,作者关注于鸟瞰图(BEV)中的目标和地图分割,突出了雷达在视觉受损环境条件下的独特优势。虽然先前的研究已经探索了用于BEV分割的相机-雷达融合,但有些方法在训练过程中需要额外的激光雷达监督[9],或者依赖于特定雷达元数据[8, 6],而这些可能无法跨不同制造商的模型获取。为了解决这些限制,作者提出了一种新颖的方法,该方法独立于这些约束运作。作者提出的BEVCar架构包括两个特定传感器的编码器以及两个基于注意力的模块,分别用于图像提升和BEV相机-雷达融合。随后,作者将融合后的特征输入到多任务头中,以生成地图和目标分割图。作者在nuScenes[1]数据集上广泛评估了作者的方法,并证明了它在具有挑战性的光照条件下,在相机-雷达融合方面达到了最先进的表现。

主要贡献如下:

作者引入了全新的BEVCar,用于从摄像头和雷达数据中进行BEV地图和目标分割。

作者提出了一种新的基于注意力的图像提升方案,该方案利用稀疏雷达点进行 Query 初始化。

作者展示了基于学习的雷达编码优于使用原始元数据。

作者在具有挑战性的环境条件下广泛地将BEVCar与之前的 Baseline 进行了比较,并展示了利用雷达测量的优势。

作者将nuScenes [1] 上使用的日/夜/雨天数据分割公开,并发布了代码和训练模型。

Related Work

在本节中,作者概述了仅基于视觉的鸟瞰图(BEV)方法,并回顾了基于雷达的感知的先前方法。

基于相机的BEV感知: 当前在基于相机的BEV感知领域的研究旨在处理图像空间与BEV空间之间的视图差异。现有方法通常采用编码器-解码器架构,并融入一个独特的视图转换模块来处理图像与BEV平面之间的空间变化。早期工作利用变分自编码器将特征直接解码为2D俯视图笛卡尔坐标系[13]。相比之下,VPN[14]使用多层感知机(MLP)来建模图像和BEV特征图之间空间位置的依赖关系,确保在视图转换中的全局覆盖。Roddick等人[15]通过引入更明确的几何建模改进了这些工作。特别是,他们提出了一种金字塔占用网络,并配备了一个每级密集变换模块来学习图像视图中的列与BEV图中的射线之间的映射。PoBEV[16]通过分别用不同的变换模块处理平坦和垂直特征,从而扩展了这一概念,并进一步提高了性能。

近期的方法可以分为提升(lifting)基于机制和注意力基于机制。提升方法采用要么是隐式的深度分布模块[10]将特征投影到潜在空间,要么是显式的深度估计模块生成中间3D输出,例如用于目标检测[17]或场景补全[18]任务。注意力基于方法将视图变换公式化为从图像空间到鸟瞰图(BEV)的序列到序列的翻译。TIIM[19]在BEV空间中的极坐标光线与图像中的垂直列之间应用平面间注意力,并结合在每个相应极坐标光线上的自注意力,与基于深度的方法如LSS[10]相比,性能有显著提升。

近期的发展包括全环绕视角的BEV感知方法,例如CVT [20],它使用带有学习位置嵌入的跨视角 Transformer 来避免显式几何建模。相比之下,BEVFormer [4] 和 BEVSegFormer [21] 明确使用相机校准参数建模几何,并提出了基于可变形注意力[22]的空间跨注意力模块进行视角逆投影。BEVFormer [4] 还采用时间注意力模块,通过车辆自身运动在时间上聚合BEV地图,这代表了3D目标检测的最新技术。时间聚合也在BEVerse [11]中得到应用,它通过增加运动预测 Head 扩展了现有方法,并展示了所提出的多任务网络优于单任务网络,表明任务之间存在正向迁移。

上述方法通常与新颖的数据增强技术[23]结合使用,这些技术通过在各个中间嵌入之间保持空间一致性来解决图像与BEV之间的视角差异。最后,SkyEye [24]提出了一种限制较少的方法,通过在时间上重建语义图像,从标记的正面视角图像学习语义BEV地图。作者的工作利用了单目BEV感知方面的最新进展,并利用雷达模态进行更几何可行的视角投影。这是通过使用雷达 Query 的基于注意力的新颖图像提升方案实现的。此外,作者还 Proposal 利用已通过对比学习进行预训练的现有图像骨架来进一步规范化模态特定分支。

雷达感知基础: 雷达通过发射无线电波和接收其反射之间的时间差来测量到目标的距离。公开发布的用于机器人应用的雷达数据集包括不同类型的雷达,如旋转雷达[2],汽车雷达[1],或4D成像雷达[3]。在这项工作中,作者专注于汽车雷达。由于雷达是一种相对低成本的直接测量距离的技术,因此它已被用于提高基于视觉的3D目标检测。尽管ClusterFusion [27]仅在图像空间融合雷达和相机数据,但SparseFusion3D [28]在图像空间和鸟瞰图(BEV)空间都进行了传感器融合。

在分割领域,最初的工作研究了雷达点云的语义分割[29],并未涉及额外的视觉输入。近期,多模态鸟瞰图(BEV)和目标分割的研究受到了越来越多的关注。《FISHING Net》[12]这篇开创性工作的作者们提出了基于MLP的提升策略用于相机特征。为了将这些特征与由类似UNet的网络编码的雷达数据相结合,FISHING Net采用了基于类别的优先级池化。相比之下,Simple-BEV[6]以栅格化的BEV格式处理原始雷达数据,并将其与通过双线性采样提升的图像特征进行拼接。尽管Simple-BEV的目标是对车辆进行与目标无关的分割,但其训练依赖于额外的实例信息。

由于纯粹基于拼接的融合可能会受到空间对齐不良的影响,CRN[9]采用了可变形注意力[22]来聚合图像和雷达特征。然而,该方法使用LSS[10]来提升图像特征,并且在训练过程中需要激光雷达(LiDAR)来监督深度分布网络。最后,BEVGuide[8]在部署期间除了利用现有的知识外,没有进一步利用其他知识。通过基于单应性投影的方法,将来自EfficientNet[30]图像 Backbone 网络的特征转换成了一种比例不明确的自上而下表示。雷达数据被转换到BEV空间,然后由两个卷积层进行编码。与之前的工作不同,BEVGuide提出了一种自下而上的提升方法,通过从统一的BEV空间 Query 传感器特征来获取传感器特定的嵌入,然后将它们进行拼接。在这项工作中,作者进一步发展了这些想法,并使用了一种受到激光雷达处理[26]启发的更为精细的雷达编码器。此外,作者还提出了一种新的提升方案,该方案明确利用雷达点作为强有力的先验知识。

Technical Approach

在这一部分,作者提出了BEVCar方法,用于从环视摄像头和汽车雷达进行鸟瞰视角(BEV)的目标和地图分割。如图2所示,BEVCar包括两个特定于传感器的编码器,分别用于图像和雷达数据。作者通过可变形注意力将图像特征提升到BEV空间,在此过程中利用雷达数据来初始化 Query 。采用中间融合策略后,作者接着使用交叉注意力模块将提升的图像表征与学习的雷达特征相结合。最后,作者在瓶颈操作中降低空间分辨率,并使用单一多类 Head 同时对车辆和地图进行BEV分割。在接下来的小节中,作者将提供每个步骤的进一步细节。
在这里插入图片描述
在这里插入图片描述

相机:为了编码相机数据,作者采用了一个冻结的DINov2 ViT-B/14[25],其图像表示捕获的语义信息比基于ResNet的骨架网络[31]更多。遵循常见的方法[32,33],作者使用了一个具有可学习权重的ViT Adapter [34]。为了覆盖环视视觉,作者在每个时间戳将来自 N N N个相机的图像进行ConCat,形成一个维度为 N × H × W N \times H \times W N×H×W的输入,其中 H H H W W W分别表示图像的高度和宽度。对于下游处理,ViT Adapter输出具有 F F F个通道的多尺度特征图,这些特征图对应于图像尺寸的KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{4}KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{8}KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{8}KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{2}比例。

雷达:雷达数据由一个点云表示,每个点都具有多种特征。与先前的作品[6,8]不同,作者强调依赖于特定雷达模型的内置后处理会降低方法的通用性。因此,类似于SparseFusion3D[28],作者只利用雷达点的 D D D个基本特征: 3D位置 ( x , y , z ) (x,y,z) (x,y,z),未补偿的速度 ( z , v g ) (z, v_g) (z,vg),以及雷达散射截面 RCS \text{RCS} RCS,它捕捉了表面的可检测性。与利用原始数据[6]不同,作者提出学习一个由编码LiDAR点云[26]启发的雷达表示。首先,作者根据雷达点在尺寸为 X × Y × Z X \times Y \times Z X×Y×Z的Voxel 网格中的空间位置将它们分组,该Voxel 网格对应于BEV空间的分辨率和高度的离散化。为了限制内存需求和减轻对高密度Voxel的偏见,作者在包含超过 P P P个雷达点的Voxel中进行随机采样。每个点及其元数据随后通过图3所示的点特征编码输入,其中FCN指的是全连接层。请注意,点特征编码不积累来自多个Voxel 的信息。随后,作者对每个Voxel应用最大池化以获得大小为 F F F的单个特征向量。最后,作者将Voxel特征通过基于CNN的 Voxel空间编码器,沿着高度维度压缩特征,得到整体的雷达BEV编码 F r a d F_{rad} Frad
在这里插入图片描述

Image Feature Lifting

作者采用基于学习的方法,将编码的视觉特征从2D图像平面提升到BEV空间。受到BEVFormer [4]的启发,作者使用了可变形注意力[22],但提出了一种新颖的 Query 初始化方案,该方案利用了稀疏的雷达点。
根据CSDN的规则,我会将公式环境中的斜杠 “/” 替换为 “ " ,而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为"$”。下面是修复后的内容:

Query初始化:作者提出的Query初始化方案的核心动机是利用雷达测量中的3D信息,将2D图像特征初步提升到BEV空间。如图4所示,作者首先创建一个大小为 X × Y × Z X \times Y \times Z X×Y×Z的Voxel空间,该空间由BEV分辨率 X × Y X \times Y X×Y、附加的高度离散化 Z Z Z以及朝向前方的摄像机中心确定。其次,作者根据摄像机的视场将每个Voxel分配给一个或两个摄像机。第三,作者通过射线投影将视觉特征从2D图像平面推送到3D Voxel空间,即沿着射线锥体内的每个Voxel包含相同的图像特征。特别是,作者使用了尺度为KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{8}的图像特征。如果两个摄像机的视场重叠,作者将在受影响的Voxel内平均特征。随后,作者使用1×1卷积层去除高度分量,得到具有 F F F个特征通道的 X × Y X \times Y X×Y Voxel网格。请注意,在这个阶段,图像特征仍然是均匀分布的,没有深度的概念。因此,作者使用由稀疏雷达点云引导的可变形注意力[22]来过滤特征图,从而得到初始化 Query Q m Q_m Qm,其大小为 F × X × Y F \times X \times Y F×X×Y
在这里插入图片描述

提升:在下一步中,作者将数据驱动的初始Query Q m g Q_{mg} Qmg 与可学习位置嵌入 Q p o s Q_{pos} Qpos 结合起来,以实现排列不变性,并学习可学习的鸟瞰图(BEV) Query Q b e v Q_{bev} Qbev
l = Q m g + Q p o s + Q b e v l = Q_{mg} + Q_{pos} + Q_{bev} l=Qmg+Qpos+Qbev
采用可变形注意力机制[22],作者构建了一个尺寸为 X × Y × Z X \times Y \times Z X×Y×Z的3D Voxel空间,以从图像中提取视觉编码。与Query初始化相比,作者现在在图像平面上而不是BEV空间上采样偏移量。经过六个级联的Transformer模块后,作者得到了最终的特征图 f i m g , b e v f_{img,bev} fimg,bev,其维度与编码后的雷达数据相同,即 F × X × Y F \times X \times Y F×X×Y

BEV Segmentation Head

根据CSDN的规则,我会将公式环境中的斜杠 “/” 替换为 “ " ,而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为"$”。下面是修复后的内容:

作者采用单个Head进行多类鸟瞰图(BEV)分割。具体来说,作者使用两个带有ReLU激活函数的卷积层,然后是一个最终的1×1卷积层来输出一个目标类别和 M M M个地图类别。考虑到BEV空间的分辨率,分割Head产生的输出大小为 M + 1 × X × Y M+1 \times X \times Y M+1×X×Y。因此,一个像素不仅可以同时捕捉到车辆和地图类别预测,还可以被分配到多个地图类别中。

目标分割:在分割目标时,作者考虑所有类似车辆的实体,例如乘用车和卡车。与先前的作品[6]不同,作者强调在训练过程中,目标无关的分割不应依赖于实例感知信息,因为这将使得方法的应用灵活性降低。因此,作者仅通过二进制交叉熵损失来监督分割头中的目标通道:
L B C E = − 1 N ∑ i = 1 N log ⁡ ( P i , t ) , \mathcal{L}_{BCE} = -\frac{1}{N} \sum_{i=1}^{N} \log(P_{i,t}), LBCE=N1i=1Nlog(Pi,t),
在公式中, P i , t P_{i,t} Pi,t是针对每个像素 i ∈ [ 1 , N ] i \in [1,N] i[1,N]定义为:
P i , t = { p i if  y i = 1 1 − p i otherwise . P_{i,t} = \begin{cases} p_i & \text{if } y_i = 1 \\ 1 - p_i & \text{otherwise}. \end{cases} Pi,t={pi1piif yi=1otherwise.
二进制真值标签 y i ∈ { 0 , 1 } y_i \in \{0,1\} yi{0,1}指定了像素 i i i是否属于车辆类别。对于 y i = 1 y_i=1 yi=1的相应预测概率用 p i p_i pi表示。

地图分割: 尽管大多数先前的方法[4,8,9]仅预测道路,有时也包括车道分隔线,但作者进一步包含了如人行横道和人行道等地图类别。详尽的列表请参见第IV-A节。为了在训练过程中监督分割Head 的地图通道,作者采用了α-平衡焦损失的多类别变体[35]:
L F o c a l = − 1 N ∑ i = 1 N ( 1 − p i , t ) α ⋅ log ⁡ ( p i , t ) , \mathcal{L}_{Focal} = -\frac{1}{N} \sum_{i=1}^{N} (1 - p_{i,t})^\alpha \cdot \log(p_{i,t}), LFocal=N1i=1N(1pi,t)αlog(pi,t),

根据CSDN的规则,我会将公式环境中的斜杠 “/” 替换为 “ " ,而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为"$”。下面是修复后的内容:

在这段文本中, c ∈ [ 1 , C ] c \in [1,C] c[1,C]指的是语义类别,而 y y y是一个聚焦参数,用于区分简单/困难样本。另外, α i , t \alpha_{i,t} αi,t是按照方程式(4)类似定义的:
在这里插入图片描述
具有可调参数 α \alpha α以解决前景与背景的不平衡问题。

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

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

相关文章

Python-VBA函数之旅-globals函数

目录 一、globals函数的常见应用场景: 二、globals函数与locals函数对比分析: 1、globals函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:https://blog.csdn.net/ygb_1024?spm101…

分保、等保、关保、密评之间联系与区别

分保、等保、关保、密评之间联系与区别 什么是“三保一评”分保等保关保密评 相关的法律法规依据分保等保关保密评 分保工作简介分保工作流程分级保护技术要求 等保工作简介关保工作简介密评工作简介三保一评联系与区别 什么是“三保一评” 分保 涉密信息系统分级保护 指涉密信…

CCleaner怎么清理软件缓存 CCleaner清理要勾选哪些 ccleanerfree下载

CCleaner软件是一款优秀的数据清理软件,其中没有硬盘和内存的设置,也不含任何广告软件,其出色的注册表清洁功能能够保证您的电脑更稳定运行。本文将围绕CCleaner怎么清理软件缓存,CCleaner清理要勾选哪些的相关内容进行介绍。 一、…

2024上海国际半导体制造设备材料与核心部件展览会

2024上海国际半导体制造设备材料与核心部件展览会 2024 Shanghai International Semiconductor Manufacturing Equipment Materials and Core Components Exhibition 时间:2024年11月18日-20日 地点:上海新国际博览中心 详询主办方陆先生 I38&#…

C语言转型之路:从C到C++的类与对象初探

欢迎来CILMY23的博客 本篇主题为 C语言转型之路:从C到C的类与对象初探 个人主页:CILMY23-CSDN博客 个人专栏系列: Python | C语言 | 数据结构与算法 | C 感谢观看,支持的可以给个一键三连,点赞关注收藏。 写在前头…

PAN2416AF 2.4GHz 无线收发 SOC 芯片

1 概述 PAN2416AF 芯片是工作在 2.400~2.483GHz 世界通用 ISM 频段的单片无线收发芯片。该芯片集 成射频收发机、频率发生器、晶体振荡器、调制解调器和低功耗 MCU 等功能模块,并且支持 一对多组网和带 ACK 的通信模式。 用户通过 MCU 的 I/O 口向芯片发出指令…

【源码】基于I.MX6ull驱动移植ds18b20的实验详解

文章目录 前言一、硬件连接二、代码移植1.驱动代码2.编译程序 三、移植到开发板参考连接 前言 提示:基于I.MX6ull驱动移植ds18b20的实验: 实验平台:正点原子alpha开发板V2.2 传感器:ds18b20模块 一、硬件连接 ds18b20的VCC&…

将windows作为网关

开启转发 reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v IPEnableRouter /D 1 /f开启routing and remote access服务 这样局域网里面别的设备能通过windows进行上网 参考:https://www.cnblogs.com/chrishg/articles/12861053.html

Android的一些总结

先打开自定义的app显示欢迎->消失 打开桌面应用程序->在桌面应用程序中也要能一键启动打开视频播放的app 桌面应用程序广播接收者进行监听,然后打开服务/activity是可行的。 ########################## 日志,调试: Usb 无线 串口…

全新Linux教程-驱动大全-PCI和PCIe子系统-P1-从软件角度看PCI和PCIE

主题:为什么要引入PCI, 为什么要引入PCIE,PCIE和PCI的硬件接口大概如何?理解一下CPU地址和PCI地址空间的概念。 参考资料: * 《PCI Express Technology》,Mike Jackson, Ravi Budruk; MindShare, Inc. *…

比较转录组学方法推断基因共表达网络及其在玉米和水稻叶片转录组中的应用 TO-GCN时序分析-文献精读-8

Comparative transcriptomics method to infer gene coexpression networks and its applications to maize and rice leaf transcriptomes 比较转录组学方法推断基因共表达网络及其在玉米和水稻叶片转录组中的应用 TO-GCN时序分析,媲美加权基因共表达网络分析-WG…

免费证书和付费证书的区别

免费SSL证书和付费SSL证书都是用来实现HTTPS加密通信的安全工具,旨在为网站提供数据传输的机密性和完整性保护。尽管它们的基本功能相似,即通过公钥加密技术建立安全连接,但两者在以下几个方面存在显著区别: 1. 类型与验证级别 免…

项目二:学会使用python爬虫请求库(小白入门级)

上一章已经了解python爬虫的基本知识,这一次让我们一起来学会如何使用python请求库爬取目标网站的信息。当然这次爬虫之旅相信我能给你带来不一样的体验。 目录 一、安装requests 库 简介 安装 步骤 1.requests的基本使用3步骤 2.查看所使用编码 3.设置编码…

Spring Boot入门(16):让你的API文档更亮眼:Spring Boot与Swagger-UI完美整合!

1. 前言 在实际开发过程中,我们经常需要编写API文档来描述接口的调用方法、参数、返回值等信息。为了提高开发效率和维护便利性,Swagger-UI成为了API文档自动生成的一种流行方案。本文将介绍如何利用Spring Boot和Swagger-UI实现在线API文档。 2. 摘要…

应用编程之进程(三-通信篇)

所谓进程间通信指的是系统中两个进程之间的通信,不同的进程都在各自的地址空间中、相互独立、隔离,所以它们是处在于不同的地址空间中,因此相互通信比较难,Linux 内核提供了多种进程间通信的机制。 大部分的程序是不要考虑进程间…

unity学习(86)——细节优化

东西已经做出来了,现在需要的是优化,说得简单,做起来难。 1.122包的优化,避免重复创建! 2.为何会出现一边动,一边不动的情况。重复登录后依旧是unity可以看到移动,但是exe那边看不到移动&#…

NAT基本配置

配置IP完成及缺省的路由如下; 此时R1pingISP是ping不通的,因为缺省是可以将数据传给R3,但是R3传不回去,知道目标IP地址但因其是私有内部IP,而自己的是公有IP,所以传不过去,此时就需要R2这个边界…

Linux 基于 TCP 协议的简单服务器-客户端应用

目录 一、相关函数 1、listen() 2、accept() 3、connect() 4、两种IP地址转换方式 5、TCP和UDP数据发送和接收函数对比 5、log.hpp自定义记录日志 二、udp_server.hpp单进程版本 三、tcp_server.cc 四、Telnet客户端(代替tcp_client.cc) 五…

TorchEEG文档_学习笔记1【代码详解】

文章目录 一、用户文档1.安装Pytorch2.安装TorchEEG3.安装与图算法的插件 二、教程1.使用TorchEEG完成深度学习工作流程2datasets模块3.transforms模块4.models模块5.trainer模块6.使用Vanilla PyTorch训练模型 一、用户文档 1.安装Pytorch TorchEEG依赖于PyTorch,根据系统、…

PTA L2-047 锦标赛

题目 解析 把每一场比赛看作满二叉树的一个节点&#xff0c;父节点递归遍历子节点的结果&#xff0c;进行试填。 代码 #include <bits/stdc.h>using i64 long long;struct Node {int win, lose; };void solve() {int k;std::cin >> k;int siz (1 << k);…