太实用了!20分钟快速理解【PointNet网络】,妥妥的!

这篇具有很好参考价值的文章主要介绍了太实用了!20分钟快速理解【PointNet网络】,妥妥的!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

点云是一种重要的几何数据结构。由于其不规则的格式,大多数研究人员将此类数据转换为规则的 3D 体素网格或图像集合。但是,这会使数据变得不必要地庞大并导致问题。在本文中,我们设计了一种直接处理点云的新型神经网络,它很好地保留了输入中点云的排列不变性。我们的网络名为 PointNet,为从分类、分割、场景语义解析的应用提供了统一的架构。虽然简单,但 PointNet 非常有效。从经验上看,它表现出与现有网络相当-甚至更强大性能。从理论上讲,我们分析并了解网络学到了什么、以及为什么网络在输入点云扰动及损坏方面是依旧是稳健的。

1.简介

在本文中,我们探索了能够处理 点云的深度学习架构。典型的卷积架构需要高度规则的数据,如图像或体素,以便执行权重共享和优化。由于点云不是常规格式,因此大多数研究人员通常将此类数据转换为常规体素或图像(例如俯视图),然后再将它们提供给网络。然而,这种转换使生成的数据变得不必要地庞大——同时还掩盖了数据自然不变性。
出于这些原因,我们使用简单的点云来表示输入, 并将我们的网络命名为 PointNets。点云是简单而统一的结构,避免了组合的不规则和复杂性,因此更容易学习。但是仍然必须尊重一个事实,即点云只是一组点,具有排列不变性。在网络计算中需要考虑某些对称性,还有刚体运动的不变性。
pointnet,打工人,深度学习,3d,人工智能
图 1. PointNet 的应用。我们提出了一种新的深度网络架构,它使用原始点云,是一个统一的架构,可以同时学习全局和局部点特征,为许多 3D 识别任务提供简单、高效的方法。

PointNet 是一个统一的架构,它直接将点云作为输入,并可以输出类整体的标签,或为每个点逐点输出标签。网络的基本架构很简单,在初始阶段,每个点都被完全独立地处理,由坐标(x、y、z)表示。可以通过计算法线和其他局部或全局特征来添加额外维度信息。

关键方法是使用单个对称函数,即最大池化 Max pooling。网络有效地学习最大池化函数的处理结果,这些最大池化函数可以选取点云中信息最丰富的点集,并对选择它们的推理过程进行编码。而网络最后的全连接层,将聚合学习到的特征,并转换为整体形状的全局描述(分类),或者每个点的标签(分割)。

因为每个点都是独立变换的,点云很容易进行仿射变换或刚体变换。因此可以添加一个依赖于数据的空间变换网络,在 PointNet 之前对数据进行规范化,从而进一步改进结果。

我们对本文方法提供理论分析和实验评估,证明网络可以拟合任何连续的集合函数(PointNet ==Fun_any())。更有趣的是,网络通过一组稀疏关键点学习点云,根据可视化大致对应于对象的骨架。理论分析提供了一种解释,为什么我们的 PointNet 对输入点的小扰动以及通过点插入或删除数据造成的破坏具有高度鲁棒性。在从形状分类、部分分割到场景分割的许多基准数据集上,我们通过实验将我们的 PointNet 与基于多视图和体积表示的最先进方法进行比较。我们的 PointNet 不仅速度快得多,而且表现出与现有技术相当甚至更好的强大性能。

2.相关工作

点云特征:
大多数现有点云特征提取都是针对特定任务定制的。点特征通常对点的某些统计属性进行编码,并被设计为对某些转换保持不变,这些转换通常被分类为内在的或外在的。它们也可以分为局部特征和全局特征。对于特定任务,找到最佳特征组合并非易事。

3D数据的深度学习
3D 数据具有多种流行的表示形式,导致了各种学习方法。Volumetric CNN 是将 3D 卷积神经网络应用于体素化形状的先驱。然而,由于数据稀疏性和 3D 卷积的计算成本,Volumetric CNN 受到其分辨率的限制。FPNN 和 Vote3D 提出了处理稀疏问题的特殊方法;然而,他们的操作仍然是在稀疏的体积上,处理非常大的点云对他们来说是一个挑战。 Multiview CNNs:尝试将 3D 点云或形状渲染为 2D 图像,然后应用 2D 卷积网络对它们进行分类。通过精心设计的图像 CNN,这一系列方法在形状分类和检索任务中取得了主导性能 。然而,将它们扩展到场景理解或其他 3D 任务(例如点分类和形状补全)并非易事。光谱 CNN:一些最新作品在网格上使用光谱 CNN。然而,这些方法目前受限于诸如有机物体之类的多种网格,并且如何将它们扩展到诸如家具之类的非等距形状并不明显。基于特征的 DNN:首先将 3D 数据转换为向量,通过提取传统的形状特征,然后使用全连接网络对形状进行分类。我们认为它们受到提取特征的表示能力的限制。

无序集的深度学习

从数据结构的角度来看,点云是一组无序的向量。虽然深度学习中的大多数工作都集中在常规输入表示上,如图像和视频或,但在点集的深度学习方面并没有做太多的工作。 Oriol Vinyals 等人最近的一项工作研究了这个问题。他们使用带有注意力机制的 读-处理-写 网络来处理无序数据集,并表示他们的网络具有对数字进行排序的能力。然而,由于他们的工作侧重于泛型集合和 NLP 应用,因此缺乏几何在集合中的作用。

3.问题陈述

我们设计了一个直接使用无序点集作为输入的深度学习框架。点云表示为一组 3D 点 {P i | i = 1, …, n},其中每个点 P i 是其 (x, y, z) 坐标加上额外的特征通道(例如颜色、法线等)的向量。为简单明了,除非另有说明,否则我们仅使用 (x, y, z) 坐标作为我们点的通道。

对于物体分类任务,输入点云要么直接从形状中采样,要么从场景点云中预分割。我们提出的深度网络为 k 个候选类别输出 k 个分数。对于语义分割,输入点云可以是单个对象,也可以是 3D 场景的子集。本文模型将输出 n × m 个分数,对应 n 个点和 m 个语义子类别。

pointnet,打工人,深度学习,3d,人工智能图 2.PointNet 架构 。有n个点的点云输入网络,通过input transformfeature transform 结构提取特征,然后通过Max Pooling 聚合特征。output score 是 k 个候选物体类别的得分。淡黄色区域的Segmentation NetWork 是分类网络的扩展。它拼接了全局特征和局部特征,并输出每个点的语义子类别的分数。 “mlp”代表多层感知器,括号中的数字是层大小。 Batchnorm 用于所有带有 ReLU 的层。 Dropout 层用于分类网络中的最后一个 mlp。

4.点集的深度学习

我们的网络架构的灵感来自: R n \mathbb Rn Rn 中点集的性质。

4.1 R n \mathbb Rn Rn 中点集的性质。

我们的输入是来自欧几里得空间的点的子集。

它具有三个主要属性:

  • 无序
    与图像中的像素阵列或体积网格中的体素阵列不同,点云是一组没有特定顺序的点。换句话说,一个消耗 N 个 3D 点集的网络需要对 N 个保持不变!数据馈送顺序中输入集的排列。
  • 点之间的相互作用
    这些点来自具有距离度量的空间。这意味着点不是孤立的,相邻点形成一个有意义的子集。因此,模型需要能够从附近的点捕捉局部结构,以及局部结构之间的组合相互作用。
  • 变换下的不变性
    作为一个几何对象,点集的学习表示应该对某些变换是不变的。例如,一起旋转和平移点不应该修改全局点云类别,也不应该修改点的分割。

4.2 PointNet 结构

完整网络架构如图 2 所示,其中分类网络和分割网络共享大部分结构。 网络具有三个关键模块:最大池化层作为一个对称函数来聚合来自所有点的信息,一个局部和全局信息组合结构,以及两个对齐输入点和点特征的联合对齐网络。我们将在下面的单独段落中讨论这些设计选择背后的原因。

无序输入的对称函数 (MLP)

为了使模型对输入排列保持不变,存在三种策略:1)将输入排序为规范顺序; 2)将输入视为一个序列来训练RNN,但通过各种排列来扩充训练数据; 3)使用一个简单的对称函数来聚合来自每个点的信息。这里,一个对称函数将 n 个向量作为输入,并输出一个对输入顺序不变的新向量。

虽然排序听起来像是一个简单的解决方案,但在高维空间中实际上不存在稳定的排序。因此,排序并不能完全解决排序问题,并且随着排序问题的持续存在,网络很难学习从输入到输出的一致映射。如实验所示(图 5),我们发现直接在已排序的点集上应用 MLP 表现不佳,尽管比直接处理未排序的输入要好一些。

使用 RNN 的想法将点集视为顺序信号,并希望通过使用随机排列的序列训练 RNN,RNN 将变得对输入顺序保持不变。然而,在“OrderMatters”中,作者已经表明顺序确实很重要,不能完全省略。虽然 RNN 对小长度(几十个)序列的输入排序具有相对较好的鲁棒性,但很难扩展到数千个输入元素,这是点集的常见大小。根据经验,我们还表明基于 RNN 的模型的性能不如我们提出的方法。

我们的想法是在点集的元素上,用对称函数近似一般函数:f ({x 1 , . . . , x n }) ≈ g(h(x 1 ), . . . , h(x n )) g是对称函数。根据经验,我们的基本模块非常简单:通过多层感知器网络MPL近似 h(x),通过组合一个单变量函数h(x)的和一个最大池化函数近似 g(x) 。通过实验发现这很有效。通过一个 组h(x) ,我们可以学习到多个f(x)来捕捉集合的不同特征。虽然我们的关键模块看起来很简单,但它具有有趣的属性,并且可以在一些不同的应用程序中实现强大的性能。

局部和全局信息聚合(分割)

上述部分的输出,形成一个向量 [ f 1 , . . . , f K f _1 , . . . , f_ K f1,...,fK ]。这是一个全局特征。点分割需要结合局部和全局信息。我们可以通过一种简单而高效的方式来实现这一点。本文的解决方案可以在图 2(分割网络)中看到。在计算全局点云特征向量后,我们通过将全局特征与每个点特征拼接起来,将其反馈给每个点特征。然后我们基于组合的点特征,提取新的点特征——这一次每点特征知道局部和全局信息。

通过这种修改,我们的网络能够预测依赖于局部几何和全局语义的每点数量。例如,我们可以准确地预测每个点的法线,验证网络能够从点的本地邻域中总结信息。在实验过程中,我们还表明我们的模型可以在形状部分分割和场景分割方面实现最先进的性能。

联合校准网络(T-net)

如果点云经过某些几何变换,例如刚性变换,则点云的语义标记必须是不变的。因此,我们期望我们的点集学习到的表示对这些转换是不变的。一个思路是在特征提取之前,将所有输入的点对齐到同一个规范空间。在2D图像领域,贾德伯格等人引入了空间变换器的思想,通过采样、插值来对齐 2D 图像,也就是通过分辨率的调整统一到同一个分辨率。与之相比,我们以更简单的方式实现这一目标。不需要发明任何新层,也没有像图像案例中那样引入别名。
pointnet,打工人,深度学习,3d,人工智能

本文通过迷你网络(T-net)预测仿射变换矩阵,并将该变换直接应用于输入点的坐标。T-net 网络由点独立特征提取、最大池和全连接层等基本模块组成。注意:T-net的作用是把不同的点云( C 1 , C 2 , . . . . . C_1,C_2,..... C1,C2,.....)统一到同一个坐标空间,而不是对 C 1 C_1 C1自己做变换。是通过不断的训练,找到一个可以把数据集中所有的点云都变换到同一个基坐标系的变换矩阵。
pointnet,打工人,深度学习,3d,人工智能

这个想法也可以进一步扩展到特征空间的对齐。我们在点特征上插入另一个对齐网络,(因为提取到的特征不一定处于同一个基坐标下)并预测一个特征变换矩阵来对齐来自不同输入点云的特征。但是,特征空间中的变换矩阵比空间变换矩阵的维数要高得多,增加了优化的难度。因此,我们为了提高梯度下降时的计算速度,需要在 softmax 训练损失中添加一个正则化项,是梯度的下降方向按照正则项的方向前进
约束为特征对齐矩阵组成的正交矩阵: L r e g = ∣ ∣ I − A A T ∣ ∣ 2 L_{reg} = || I − AA^T|| ^2 Lreg=∣∣IAAT2 ,其中 A 是T-net预测的特征对齐矩阵。正交变换不会丢失输入中的信息。通过添加正则化项,优化变得更加稳定,我们的模型实现了更好的性能。

4.3.理论分析

逼近 -我们首先展示了我们的神经网络对连续集函数的逼近能力。通过集合函数的连续性,直观地说,对输入点集的小扰动不应该大大改变函数值,例如分类或分割分数。在最大池化层有足够的神经元的情况下,我们的网络任意逼近
pointnet,打工人,深度学习,3d,人工智能
图 3. 零件分割的定性结果。我们可视化 16 个对象类别的零件分割结果。我们展示了部分模拟 Kinect 扫描(左块)和完整 ShapeNet CAD 模型(右块)的结果。

关键思想是,在最坏的情况下,网络可以通过将空间划分为相等大小的体素来学习将点云转换为体积表示。然而,在实践中,网络学习了一种更智能的策略来探测空间,正如我们将在点函数可视化中看到的那样。

瓶颈维度和稳定性-从理论上和实验上,我们发现网络的表现力受到最大池化层维度的强烈影响。在这里,我们提供了一个分析,该分析还揭示了与我们模型的稳定性相关的属性。定理告诉我们,输入集中的小损坏或额外噪声点不太可能改变我们网络的输出。直观地说,我们的网络通过一组稀疏的关键点来学习总结一个形状。在实验部分,我们看到关键点形成了对象的骨架。

pointnet,打工人,深度学习,3d,人工智能
表 1. ModelNet40 上的分类结果。我们的网络在 3D 输入的深度网络中达到了最先进的水平。

5.实验

实验分为四个部分。首先,我们展示了 PointNets 可以应用于多个 3D 识别任务。其次,我们提供了详细的实验来验证我们的网络设计。最后,我们可视化网络学习的内容并分析时间和空间复杂度。

5.1 应用

在本节中,我们将展示如何训练我们的网络来执行 3D 对象分类、对象部分分割和语义场景分割 。即使我们正在研究一种全新的数据表示(点集),我们也能够在多个任务的基准测试中实现可比甚至更好的性能。

3D 物体分类-我们的网络学习可用于对象分类的全局点云特征。在 ModelNet40 形状分类基准上评估我们的模型。有来自 40 个人造物体类别的 12,311 个 CAD 模型,分为 9,843 个用于训练和 2,468 个用于测试。虽然以前的方法专注于体积和多视图图像表示,但我们是第一个直接处理原始点云的方法。我们根据面面积对网格面上的 1024 个点进行均匀采样,并将它们归一化为一个单位球体。在训练期间,我们通过沿上轴随机旋转对象并通过具有零均值和 0.02 标准差的高斯噪声来抖动每个点的位置来动态地增强点云。
pointnet,打工人,深度学习,3d,人工智能表 2. ShapeNet 零件数据集的分割结果。度量标准是点上的 mIoU(%)。我们与两种传统方法以及我们提出的 3D 全卷积网络基线进行比较。我们的 PointNet 方法在 mIoU 中达到了最先进的水平。

在表 1 中,我们将我们的模型与以前的工作以及使用 MLP 对从点云中提取的传统特征(点密度、D2、形状轮廓等)进行基线比较。我们的模型在基于 3D 输入(体积和点云)的方法中实现了最先进的性能。只有完全连接的层和最大池化,我们的网络在推理速度上获得了强大的领先优势,并且也可以在 CPU 中轻松并行化。我们的方法和基于多视图的方法(MVCNN)之间仍然存在小的差距,我们认为这是由于丢失了渲染图像可以捕获的精细几何细节。

3D 物体零件分割-零件分割是一项具有挑战性的细粒度 3D 识别任务。给定 3D 扫描或网格模型,任务是为每个点或面分配零件类别标签(例如椅子腿、杯柄)。我们评估了 ShapeNet 零件数据集,其中包含来自 16 个类别的 16,881 个形状,总共注释了 50 个零件。大多数对象类别都标有两到五个部分。地面实况注释标记在形状上的采样点上。我们将零件分割制定为每点分类问题。评估指标是 mIoU on points。对于 C 类的每个形状 S,计算形状的 mIoU:对于 C 类中的每个零件类型,计算 groundtruth 和预测之间的 IoU。如果 groundtruth 和预测点的并集为空,则将部分 IoU 计为 1。然后我们对类别 C 中的所有部分类型的 IoU 进行平均,以获得该形状的 mIoU。为了计算该类别的 mIoU,我们取该类别中所有形状的 mIoU 平均值。

在本节中,我们将我们的分割版本 PointNet与两种传统方法进行比较,这两种方法都利用了逐点几何特征和形状之间的对应关系,以及我们自己的 3D CNN 基线。在表 2 中,我们报告了每个类别和平均 IoU (%) 分数。我们观察到 2.3% 的平均 IoU 改进,并且我们的网络在大多数类别中都超过了基线方法。我们还对模拟的 Kinect 扫描进行了实验,以测试这些方法的稳健性。对于 ShapeNet 零件数据集中的每个 CAD 模型,我们使用 Blensor Kinect Simulator 从六个随机视点生成不完整的点云。我们使用相同的网络架构和训练设置在完整的形状和部分扫描上训练我们的 PointNet。结果表明,我们只损失了 5.3% 的平均 IoU。在图 3 中,我们给出了完整数据和部分数据的定性结果。可以看出,虽然部分数据相当具有挑战性,但我们的预测是合理的。
pointnet,打工人,深度学习,3d,人工智能
表 3 场景中语义分割的结果。指标是 13 个类别(结构和家具元素加上杂乱)的平均 IoU 和基于点计算的分类精度。

场景中的语义分割-我们的部分分割网络可以很容易地扩展到语义场景分割,其中点标签成为语义对象类而不是对象部分标签。我们在斯坦福 3D 语义解析数据集 [1] 上进行实验。该数据集包含来自 6 个区域(包括 271 个房间)的 Matterport 扫描仪的 3D 扫描。扫描中的每个点都用来自 13 个类别(椅子、桌子、地板、墙壁等加上杂乱)的语义标签之一进行注释。为了准备训练数据,我们首先按房间分割点,然后将房间采样成面积为 1m x 1m 的块。我们训练我们的 PointNet 分割版本来预测每个块中的每个点类。每个点由 XYZ、RGB 和房间的归一化位置(从 0 到 1)的 9 维向量表示。在训练时,我们在每个块中随机抽取 4096 个点。在测试时,我们对所有点进行测试。我们遵循与 [1] 相同的协议,使用 k 折策略进行训练和测试。

pointnet,打工人,深度学习,3d,人工智能
图 4. 语义分割的定性结果。第一行是带颜色的输入点云。底行是在与输入相同的相机视点中显示的输出语义分割结果(在点上)。

我们将我们的方法与使用手工点特征的基线进行比较。基线提取相同的 9-dim 局部特征和三个附加特征:局部点密度、局部曲率和法线。我们使用标准 MLP 作为分类器。结果如表 3 所示,我们的 PointNet 方法明显优于基线方法。在图 4 中,我们展示了定性的分割结果。我们的网络能够输出平滑的预测,并且对缺失点和遮挡具有鲁棒性。基于我们网络的语义分割输出,我们进一步构建了一个 3D 对象检测系统,使用连接组件进行对象提议(详见补充)。我们在表 4 中与之前最先进的方法进行了比较。之前的方法基于滑动形状方法(使用 CRF 后处理),支持向量机在体素网格中的局部几何特征和全局房间上下文特征上进行训练。我们的方法在报告的家具类别上大大优于它。文章来源地址https://www.toymoban.com/news/detail-773519.html

到了这里,关于太实用了!20分钟快速理解【PointNet网络】,妥妥的!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3D点云(3D point cloud)及PointNet、PointNet++

    https://www.youtube.com/watch?v=Ew24Rac8eYE 传统图像数据是2维的 3D点云是3维的,可以表达更多信息 比如对化工厂进行违章识别、安全隐患的识别 城市管理 点云分割 点云补全 点云生成 点云物体检测(3D物体检测) 点云配准(后续任务的基础) 一般点云数据都是基于激光雷达扫描生

    2024年02月02日
    浏览(43)
  • from pointnet2_ops import pointnet2_utils 安装过程

    遇到的代码需要安装pointnet2_ops模块,记录下安装过程 项目位置 查找到安装方法 或者 但是报错 错误一: 或者报错 错误二: 错误三: 错误一解决方法: 方法一: 当使用git+https时报错极有可能是服务器的SSL证书没有经过第三方机构的签署,所以才报错 解决方法 方法二: 只

    2024年02月13日
    浏览(35)
  • PointNet++详解(一):数据增强方法

    如有错误,恳请指出。 下面是pointnet++项目实现的点云数据增强方法,主要包括随机旋转、随机缩放、随机丢弃、随机平移、随机扰动等等。 github项目链接:https://github.com/yanx27/Pointnet_Pointnet2_pytorch 这里贴上的是沿3个轴随机旋转 ps:在PointNet++分组采样k个邻域点时,如果符合

    2024年02月04日
    浏览(36)
  • pointnet C++推理部署--tensorrt框架

    python推理: C++推理: 其中推理引擎的构建也可以直接使用tensorrt的bin目录下的trtexec.exe。 LZ也实现了cuda版本的前处理代码,但似乎效率比cpu前处理还低。可能是数据量不够大吧(才10^3数量级),而且目前LZ的cuda水平也只是入门阶段… python推理: C++推理: python推理: C++推理

    2024年02月11日
    浏览(35)
  • PointNet++训练自己的数据集(附源码)

    本文针对PointNet++强大的三维点云分类功能,详细讲解怎么训练自己的数据集,在此之前,需要确保已经能够跑通源码的训练和测试,如果没有,请参考PointNet++的源码运行。 1.1. 在mytensor_shape_names.txt中配置自己的分类,以及分类名称: 1.2. 在filelist.txt中填入对应的不同类别的

    2024年01月20日
    浏览(38)
  • 用pointnet++分类自己的点云数据

    目录 一、简单介绍pointnet++ 1.1 三维数据的表示方法 1.2 pointnet算法 1.3 pointnet++算法的提出  二、pointnet++如何运行自己的数据集? 2.1 确定数据集的基本情况 2.2  以点云分割为例 2.2.1 数据标注  2.2.2 选择模型 2.2.3 数据预处理 2.2.4  选择模型进行修改  2.2.5 训练模型部分的修改

    2024年02月03日
    浏览(38)
  • 使用 PointNet 进行3D点集(即点云)的分类

    无序3D点集(即点云)的分类、检测和分割是计算机视觉中的核心问题。此示例实现了开创性的点云深度学习论文PointNet(Qi 等人,2017)。 如果使用 colab 首先安装 trimesh  !pip install trimesh 。

    2024年02月07日
    浏览(40)
  • 3D检测:从pointnet,voxelnet,pointpillar到centerpoint

    记录centerpoint学习笔记。目前被引用1275次,非常高。 地址:Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint:三维点云目标检测算法梳理及最新进展(CVPR2021)_哔哩哔哩_bilibili 作者解释。 CenterPoint 是一种用于激光点云的3D目标检测与跟踪算法框架

    2024年04月22日
    浏览(40)
  • PointNeXt: 通过改进的训练以及模型缩放策略重新探究PointNet++

    原文链接:https://www.techbeat.net/article-info?id=3669 作者:Gordon ::: 论文链接: https://arxiv.org/abs/2206.04670 代码链接(已开源): https://github.com/guochengqian/pointnext PointNet++ 是点云理解领域最有影响力的神经网络模型之一。虽然PointNet++ 在性能上已被一些最新的方法如PointMLP和Point Tran

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包