BEVFormer v2论文阅读

news2024/11/18 4:36:34

摘要

本文工作

提出了一种具有透视监督(perspective supervision)的新型鸟瞰(BEV)检测器,该检测器收敛速度更快,更适合现代图像骨干。现有的最先进的BEV检测器通常与VovNet等特定深度预训练的主干相连,阻碍了蓬勃发展的图像主干和BEV检测器之间的协同作用。为了解决这一限制,我们优先考虑通过引入透视图监督(perspective view supervision)来简化BEV探测器的优化。为此,我们提出了一个两阶段的BEV检测器,其中来自透视头的proposals被输入入鸟瞰头进行最终预测。

实验效果

为了评估我们的模型的有效性,我们进行了广泛的消融研究,重点是监督的形式和所建议的探测器的类型。在大规模NUSCENES数据集上,对该方法进行了广泛的传统和现代图像主干的验证,取得了新的SOTA结果。

1. 介绍(Introduction)

鸟瞰识别模型吸引了人们对自动驾驶的兴趣,因为它们可以自然地将多个传感器的部分原始观测集成到一个统一的整体3D输出空间中。一个典型的BEV模型建立在一个图像骨干网络上,然后是一个视图转换模块,该模块将每个特定的图像特征提升为BEV特征,然后由BEV特征编码器和一些特定任务的头进行处理。
虽然在设计视图转换器上投入了很多心血,和不断增加的下游任务并入新的识别框架中,对BEV模型中的图像骨干网络的研究受到的关注要少得多。自动驾驶作为一个前沿、高要求的领域,将现代图像骨干网络引入到自动驾驶中是顺理成章的事情。令人惊讶的是,学术界为了大规模深度预训练,选择坚持Vovnet。在本工作中,我们致力于充分发挥现代图像特征提取器在BEV识别中的作用,为未来研究人员在该领域探索更好的图像骨干网络设计打开大门。

然而,简单地使用这些现代图像骨干网络而不进行适当的预训练是不能产生令人满意的结果的。 例如,ImageNet预先训练的ConvNext-XL主干的性能与DDAD-15M预先训练的用于3D目标检测的Vovnet-99不相上下。尽管后者有前者的3.5倍的参数。

我们需要努力适应现代图像骨干的以下问题:

  • 自然图像和自动驾驶场景之间的领域差距。在一般的二维识别任务中预先训练的骨干对三维场景的感知能力不足,尤其是对深度的估计。
  • 目前BEV探测器结构复杂。拿Bevformer作为一个例子。通过视图编码器和对象解码器将三维包围盒和对象类别标签的监督信号从图像主干中分离出来,每个视图编码器和对象解码器都由多层transformer组成。适用于自动驾驶任务的一般2D图像骨干的梯度流被堆叠的transformer 层扭曲。

为了克服上述困难,采用现代图像主干进行BEV识别,我们在Bevformer中引入透视监督,即从透视任务发出的监督信号,并直接应用于主干。它引导骨干学习二维识别任务中缺少的三维知识,克服了BEV检测器的复杂性,极大地方便了模型的优化。

具体来说,我们构建一个透视3D检测头在主干上,以图像特征为输入,直接预测目标对象的三维边界框和类标签 作为辅助检测损失,将该透视头的损失(perspective loss)添加到从BEV头导出的原始损失(BEV loss)中。用相应的损失项联合训练两个分解头。此外,我们发现可以很自然的将这两个探测头组合成一个两级BEV探测器,BEV-Former V2。由于透视头是完全成熟的,它可以在perspective视图中生成高质量的对象建议,我们将其用作第一阶段建议。我们将它们编码为对象查询,并将它们与原始Bevformer中的可学习查询集合在一起,形成混合对象查询,然后将混合对象查询送入第二级DetectionHead以生成最终预测。

我们进行了大量的实验来证实我们提出的透视超视觉的有效性和必要性。perspective loss 促进了图像骨干的自适应,从而提高了检测效率,加快了模型的收敛速度。如果没有这种监督,即使用更长的时间表训练,该模型也无法实现可比的再输出。因此,我们成功地将现代图像主干与BEV模型相适应,在NUSCENES上获得了63.4%的NDS2]测试集。
我们的贡献可概括如下:

  • 我们指出透视监督是使一般2D图像骨干网络适配到BEV模型的关键。我们通过透视图中的检测损失明确地添加了这种监督。
  • 我们提出了一种新型的两级BEV探测器,BEV-former V2。它由透视3D和BEV检测头组成,前者的建议与后者的对象查询相结合。
  • 我们通过将其与最新的图像骨干网络结合起来,并在Nuscenes数据集上实现了对以前最优结果的显著改进,从而显示了我们方法的有效性。

2. 相关工作(Related Works)

2.1. BEV三维物体探测器 (BEV 3D Object Detector)

因为在自动驾驶领域的巨大成功,BEV目标检测器获得了较多的关注。早期的工作主要是利用单目深度估计和逆透视变化生成伪点云。近期的一些工作倾向于把不同视角下的特征通过2D-3D转换得到3D特征。

2.2. 摄像机三维目标检测中的辅助损失 (Auxiliary Loss in Camera 3D Object Detection)

辅助损失在单目3D目标检测中是普遍存在的。但是它们的辅助损失很少在2D监督上有明确的意义。

2.3. 二阶段的三维物体探测器(Two-stage 3D Object Detector)

两阶段检测方法在激光雷达3D目标检测中较为常见,但图像3D目标检测中极为少见。

3. BEVFormer v2

采用现代2D图像骨干网络进行BEV识别,无需进行繁琐的深度预训练,可以提高BEV识别效率,为下游的自动驾驶任务提供了多种可能性。

在这项工作中,我们提出了Bevformer V2,一个两阶段的BEV检测器,它结合了BEV和透视监督,在BEV检测中避免了采用图像骨干的麻烦。

3.1 总体架构(Overall Architecture)

如图1所示 Bevformer V2主要由图像骨干网络、透视3D检测头、空间编码器、改进型时间编码器和BEV检测头五部分组成。与原始Bevformer相比,除了空间编码器以外的所有组件都进行了改造。具体地说,Bevformer V2中使用的所有图像骨干网络都不是用任何自动驾驶数据集或深度估计数据集预先训练的。引入透视3D检测头,以方便2D图像骨干的自适应,并为BEV检测头生成对象proposals。采用了一种新的时域BEV编码器,以更好地融合长期的瞬态信息。BEV检测头现在接受混合对象查询集作为输入。我们将第一阶段的建议和学习到的对象查询结合起来,形成新的混合对象查询,用于第二阶段。

图1: Bevformer V2的整体架构。图像骨干网各生成多视图图像的特征。透视3D头进行透视预测,然后将其编码为对象查询。BEV头为编码器-解码器结构。空间编码器通过聚合多视图图像特征生成BEV特征,其次是时间编码器收集历史BEV特征。译码器以混合对象查询为输入,根据BEV特征进行最终的BEV预测。整个模型用两个检测头的两个损失项L_{pers}L_{bev}训练。

3.2. 透视监督(Perspective Supervision)

我们首先分析了鸟瞰模型的问题,以解释为什么额外的监督是必要的。一个典型的BEV模型在BEV平面上有对应的网格状的特征,其中每个网格聚集来自多视图图像对应的2D像素处的特征的3D信息。它根据BEV特征预测目标对象的3D检测框,我们将这种强加在BEV特征上的监督命名为BEV监督。
以Bevformer作为一个例子,它使用编码器-解码器结构来生成和利用BEV特性。编码器为BEV平面上的每个网格单元分配一组3D参考点,并将它们作为2D参考点投影到多视图图像上。然后,对二维参考点周围的图像特征进行采样,并利用交叉注意力将其聚合为BEV特征。解码器是一个Deformable DETR头,它在BEV坐标中预测3D包围盒,并进行少量固定数量的对象查询。图 2 介绍了由3D到2D视图转换和DETR头引入的BEV监督的两个尚未解决的问题:

  • 对图像特征的监督是隐含的。这种损失直接作用于BEV特征,而经过3D到2D投影和注意力采样(attentive samplin)后,这种损失就间接作用于BEV特征。
  • 对图像特征的监督是稀疏的。只有少量用于目标查询的BEV网格才能导致损失。 因此,只有那些网格的2d参考点周围的稀疏像素获得监督信号。

因此,在训练过程中,BEV检测头依赖于包含在图像特征中的三维信息,但对骨干如何编码这些信息提供了不足的指导。

以前的BEV方法并没有严重地受到这种不一致性的困扰,它们甚至可能没有意识到这个问题。这是因为它们的主干网络要么有相对较小的尺度,要么已经用单目检测头预先训练过3D检测任务。与BEV头相比,透视3D头对图像特征进行每像素预测,为适应2D图像骨干提供更丰富的监督信号。我们将这种强加在图像特征上的监督定义为透视监督。如图2所示,与BEV监督不同的是,透视检测损失直接密集地应用于图像特征。我们假设透视监督显式地引导主干网络感知三维场景并提取有用的信息,如目标的深度和方位。克服了BEV监督的缺点,因此,在训练BEV模型时使用现代图像的主干网路是非常必要的。


透视监督和BEV监督的对比:透视探测器的监督信号密集且直接指向图像特征,而BEV探测器的监督信号稀疏且间接。

下图是BEVformer中采用的是BEV监督:

3.3. 透视损失(Perspective Loss)

正如前一节所分析的,透视监督是优化BEV模型的关键。在Bevformer V2中,我们通过一个辅助透视损失引入透视监督。具体地说,在主干上构建透视3D检测头,以检测透视图中的目标对象。我们采用FCOS3D类似的检测头,它预测3D包围盒的中心位置、大小、方向和投影中心度。该检测头的检测损失被记为透视损失L_{pers}​, 它作为BEV损失L_{bev}的一个组成,用来促进骨干网络的优化。整个模型是以一个总的目标来训练的

3.4. 改进时间编码器(Ravamped Temporal Encoder)

Bevformer使用循环时间自注意力机制来融合历史的BEV特征。但是时间编码器不能充分利用长期的时间信息,简单地将循环步长从4步增加到16步并不能获得额外的性能提高。
我们采用简单的扭曲和联结策略重新设计了Bevformer V2的时间编码器。给定在不同帧k处的BEV特征B_k,我们首先通过第t帧和第k帧之间的转换矩阵T_k^t=[\mathbf{R} \mid \mathbf{t}] \in \mathrm{SE}B_k 双线性变换成B_k^t
然后沿通道方向将先前的BEV特征与当前的BEV特征串联起来,并利用残差块进行维数约简。为了保持与原始设计相似的计算复杂度,我们使用了相同数量的历史BEV特征,但增加了采样间隔。除了从长期时间信息中获益之外,新的时间编码器还打开了在离线三维检测设置中利用未来BEV特征的可能性。

3.5. 两阶段的BEV检测器(Two-stage BEV Detector)

虽然联合训练两个检测头进行训练提供了足够的监督,但我们从不同的角度分别得到了两组检测结果。我们设计了一种新的结构,将两个头集成为两级预测流水线,即两级BEV检测器(two-stage detector),而不是采用BEV头的预测而抛弃透视头的预测或者通过NMS启发式地将两组预测组合。BEV头中的对象解码器,一个detr[3]解码器,使用一组学习到的embeddings作为对象查询,它通过训练来学习目标对象的位置。然而,随机初始化的embeddings需要很长时间来学习合适的位置。此外,学习对象查询对于所有的图像都是固定的,由于对象的分布可能不同,因此可能不够准确。为了解决这些问题,对透视头的预测进行后处理过滤,然后融合到解码器的对象查询中,形成一个两阶段的过程。这些混合对象查询提供了高得分(概率)的候选位置,使BEV头在第二阶段更容易捕获目标对象。
混合对象查询的详细信息将在后面描述。应该注意的是,第一阶段的建议不一定是来自一个透视检测器,例如来自另一个BEV检测器,但实验表明,只有从透视图的预测才对第二级BEV头有帮助。

3.6. 混合对象查询的解码器(Decoder with Hybrid Object Queries)

为了将第一阶段的建议融合到第二阶段的对象查询中,基于在BEVFormer 中使用的Deformable DETR编码器,对BEVFormer v2中使用的BEV 检测头的编码器进行修改。
解码器由层叠交替的自注意层和交叉注意层组成。交叉注意力层是一种deformable的注意力模式,它以以下三个元素作为输入。(1)内容查询(content queries):产生抽样偏移量和关注权重的查询特征。(2)参考点(Reference points):作为每个查询的采样参考,在值特征上的2D点。(3)值特征(Value features):即要注意的BEV特征。在原来的Bevformer中,内容查询是一组学习的嵌入,参考点是从一组学习的位置嵌入中用线性层预测的。在Bevformer V2中,我们从每个特定的头部获得建议,并通过后处理选择其中的一部分。如图3所示,将所选提议的BEV平面上的投影框中心作为每幅图像的参考点,并与位置嵌入生成的每数据集参考点相结合。每幅图像的参考点直接指示出目标物体在BEV平面上的可能位置,使解码器更容易地检测到目标物体。 然而,一小部分物体可能由于遮挡而无法被透视头检测到或出现在两个相邻视图的边界处。为了避免丢失这些对象,我们还保留了原始的每个数据集的参考点,以便通过学习空间先验来捕获它们。

图三:BEVformer v2中的BEV头的解码器。第一阶段的提议(perspective proposals)的投影中心(Projected Centers)被用作每个图像的参考点(Reference Points),它们与每个数据集学习的内容查询(Content Queries)和位置嵌入(Positional Embeddings)结合作为混合对象查询。

4. 实验结果

4.1. nuScenes 3D物体检测benchmark

表1:nuScenes test set的3D物体检测结果

BEVFormer v2在自动驾驶权威数据集nuScenes的3D物体检测任务上超越了已有SOTA方法,NDS为63.4,mAP为55.6,比之前最好的方法分别提升了 2.4和3.1。此外,使用InternImage-B作为backbone的模型也超过了之前的方法,InternImage-B和V2-99参数量相近但没有使用3D预训练,这证明了3D预训练不是必须的。

4.2. 不同视角监督信号的比较

表2:不同视角监督信号的组合的对比

• Perspective Only:只使用perspective head

• BEV Only:只使用BEV head

• Perspective & BEV(BEVFormer v2):使用perspective head和BEV head组成二阶段检测器

• BEV & BEV:使用两个BEV head组成二阶段检测器

Perspective Only和BEV Only对比: BEV head使用多个相机视角的信息确定物体位置,因此具有更高的mAP。但是perspective head有更低的mATE和mAOE,表明它对深度和方向这些3D属性的预测更为准确。

BEV Only和Perspective & BEV对比: BEVFormer v2引入perspective supervision取得了NDS 2.5,mAP 1.9的较大提升,且mATE,mAOE和mAVE显著降低,模型能更好地感知3D场景,获取深度、方向和速度这些属性。

BEV & BEV和Perspective & BEV对比: 对two-stage pipeline进行消融实验,表明two-stage本身并不能提升性能,性能提升完全来自于perspective supervision的引入。

4.3. Perspective Supervision的泛化性

表3:使用不同图像backbone对perspective supervision进行消融实验

Perspective supervision可以泛化到多种不同结构和尺寸的2D图像backbone,均能带来NDS约3.0,mAP约2.5的显著提升。

4.4. 其他实验表现

表4:不同训练时长的对比。Perspective supervision能促进模型的优化,加速收敛
表5:Perspective head和BEV head的不同选择对比。在perspective head的选择中,相比DETR3D head的稀疏预测,DD3D head的密集预测能提供更丰富的监督信号,因此效果更好
表6:BEVFormer v2使用的其他技巧的消融实验,包括图像级别的数据增强、输入序列的时间间隔增加、以及使用双向的时序信息。

5. 结论

现有的工作在设计和改进鸟瞰(BEV)识别模型的检测器方面付出了很大的努力,但它们通常停留在特定的预先训练的主干网络上,而没有进一步探索。在本文中,我们的目标是在 BEV 模型上释放现代图像骨干的全部力量。我们将通用 2D 图像主干网适应 BEV 检测器的优化问题。为了解决这个问题,我们通过添加来自额外视角 3D 检测头的辅助损失,将视角监督引入到 BEV 模型中。此外,我们将两个检测头集成到一个两级检测器中,即BEVFormer v2。成熟的透视头提供第一阶段的对象建议,这些建议被编码到 BEV 头的对象查询中以进行第二阶段的预测。大量的实验验证了我们提出的方法的有效性和通用性。透视监督引导2D图像主干感知自动驾驶的3D场景,帮助BEV模型实现更快的收敛和更好的性能,并且适用于广泛的主干。此外,我们成功地将大规模骨干网适应了 BEV-Former v2,在 nuScenes 数据集上取得了新的 SoTA 结果。我们认为我们的工作为未来的研究人员探索更好的 BEV 模型图像主干设计铺平了道路。

参考文献

BEVFormer v2: Adapting Modern Image Backbones to Bird’s-Eye-View Recognition via Perspective Supervision

论文精读:《BEVFormer v2: Adapting Modern Image Backbones to Bird’s-Eye-View Recognition via Perspective 》-CSDN博客

BEVFormer v2:让新型图像主干网络在BEV感知中发挥强大能力|论文解读 - 脉脉 

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

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

相关文章

C++命名空间和内联函数

目录 命名空间 内联函数 概述 特性: 命名空间 在C/C中,变量,函数和和类这些名称都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,避免命名冲突或名字污染&…

鸿蒙OpenHarmony开发实战:【MiniCanvas】

介绍 基于OpenHarmony的Cavas组件封装了一版极简操作的MiniCanvas,屏蔽了原有Canvas内部复杂的调用流程,支持一个API就可以实现相应的绘制能力,该库还在继续完善中,也欢迎PR。 使用说明 添加MiniCanvas依赖 在项目entry目录执行…

由浅到深认识Java语言(21):Math类

该文章Github地址:https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.c…

UE像素流公网(Windows、Liunx)部署无需GPU服务器

@TOC 前言 之前有个前端地图服务项目要改成UE来渲染3D,有需要在云服务器上多实例运行,所以就先研究了Windows版本的像素流云渲染,后来客户的云服务器是Linux版CectOS系统,加上又有了一些后端服务在上面运行了不能重装成Windows,所以就又着手去研究了Linux系统的云渲染。…

【动手学深度学习】深入浅出深度学习之PyTorch基础

目录 一、实验目的 二、实验准备 三、实验内容 1. 数据操作 2. 数据预处理 3. 线性代数 4. 微积分 5. 自动微分 四、实验心得 一、实验目的 (1)正确理解深度学习所需的数学知识; (2)学习一些关于数据的实用…

SLAM算法与工程实践——CMake使用(4)

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址: SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

第28章 ansible的使用

第28章 ansible的使用 本章主要介绍在 RHEL8 中如何安装 ansible 及 ansible的基本使用。 ◆ ansible 是如何工作的 ◆ 在RHEL8 中安装ansible ◆ 编写 ansible.cfg 和清单文件 ◆ ansible 的基本用法 文章目录 第28章 ansible的使用28.1 安装ansible28.2 编写ansible.cfg和清…

springboot+vue考试管理系统

基于springboot和vue的考试管理系统 001 springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的在线考试管理系统,采用M(model)V(view)C(controller)三层体系结构&…

113 链接集10--ctrl+左键单击多选

1.ctrl左键单击多选&#xff0c;单击单选 精简代码 <div class"model-list"><divmousedown.prevent"handleClick(item, $event)"class"model-list-item"v-for"item in modelList":key"item.id":class"{ model…

UE5中各类型的英文名称缩写(直接用于文件前缀)

真正开发项目时用到的素材文件是相当巨量的&#xff0c;在资产中查找时由于不区分文件夹&#xff0c;因此查找是比较头疼的&#xff0c;所以很多同类型的文件名命名时要加入缩写&#xff0c;并且同一对象的不同功能文件也需要用不同命名来区分。 本文提供初学者内容包中的缩写…

奇舞周刊第523期:来自 rust 生态的强烈冲击?谈谈 Leptos 在语法设计上的精妙之处...

奇舞推荐 ■ ■ ■ 来自 rust 生态的强烈冲击&#xff1f;谈谈 Leptos 在语法设计上的精妙之处 过去很长一段时间&#xff0c;前端框架们都在往响应式的方向发展。同时又由于 React hooks 的深远影响&#xff0c;函数式 响应式成为了不少前端心中最理想的前端框架模样。Solid …

vue3对openlayers使用(加高德,天地图图层)

OpenLayers认识 WebGIS四大框架&#xff1a; Leaflet、OpenLayers、Mapbox、Cesium OpenLayers 是一个强大的开源 JavaScript 地图库&#xff0c;专注于提供可嵌入网页的交互式地图体验。作为一款地理信息系统&#xff08;GIS&#xff09;的前端开发工具&#xff0c;OpenLaye…

java设计模式(1)---总则

设计模式总则 一、概述 1、什么是设计模式 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 解释下&#xff1a; 分类编目&#xff1a;就是说可以找到一些特征去划分这些设计模式&#xff0c;从而进行分类。 代码设计经验&#xff1a;这句很重…

CRC计算流程详解和FPGA实现

一、概念 CRC校验&#xff0c;中文翻译过来是&#xff1a;循环冗余校验&#xff0c;英文全称是&#xff1a;Cyclic Redundancy Check。是一种通过对数据产生固定位数的校验码&#xff0c;以检验数据是否存在错误的技术。 其主要特点是检错能力强、开销小&#xff0c;易于电路实…

YOLOv8-ROS-noetic+USB-CAM目标检测

环境介绍 Ubuntu20.04 Ros1-noetic Anaconda-yolov8虚拟环境 本文假设ROS和anaconda虚拟环境都已经配备&#xff0c;如果不知道怎么配备可以参考&#xff1a; https://blog.csdn.net/weixin_45231460/article/details/132906916 创建工作空间 mkdir -p ~/catkin_ws/srccd ~/ca…

【javascript】原型继承

在编程中&#xff0c;我们经常会想获取并扩展一些东西。 例如&#xff0c;我们有一个 user 对象及其属性和方法&#xff0c;并希望将 admin 和 guest 作为基于 user 稍加修改的变体。我们想重用 user 中的内容&#xff0c;而不是复制/重新实现它的方法&#xff0c;而只是在其之…

黑马程序员:C++核心编程——2.引用

引用的作用是给变量起别名&#xff0c;本名和别名都可以操作同一块地址的数据。 注意事项 1&#xff09;引用必须初始化且在初始化后不可改变。大白话是创建时不能不说是谁的别名&#xff0c;更不能在创建之后修改为其他人的别名。 2&#xff09;*重点&#xff1a;函数传参的…

蓝桥杯b组C语言组一个月怎么准备?

蓝桥杯b组C语言组一个月怎么准备&#xff1f; C/C程序设计组其中主要的是C算法竞赛选手 1.面对算法竞赛C语言缺少很多便捷性的数据结构&#xff0c;应该快速了解并掌握C的stl。 2.蓝桥杯俗称篮球杯&#xff0c;含金量大海捞针&#xff0c;其中练好dfs的暴力搜索能够骗取相当的…

从信号完整性角度看电容应用与计算

从信号完整性的角度来看&#xff0c;电容在电子电路中具有关键的应用。电容是一种被用来存储电荷并在电路中传递电流的被动元件&#xff0c;它对信号完整性有着重要的影响。 1. 去耦电容的选择 电容类型总结表格 实际的电容并不是理想&#xff0c;表现为&#xff1a; a.电…

网页无插件视频播放器,支持录像、截图、音视频播放,多路播放等,提供源码下载

前言 本播放器内部采用jessibuca插件接口&#xff0c;支持录像、截图、音视频播放等功能。播放器播放基于ws流&#xff0c;分屏操作支持1分屏、4分屏、6分屏、9分屏方式。 jessibuca工作原理是通过Emscripten将音视频解码库编译成Js&#xff08;WebAssembly&#xff0c;简称was…