Track to Detect and Segment: An Online Multi-Object Tracker

paper: https://arxiv.org/abs/2103.08808
code:https://github.com/JialianW/TraDeS
demo:https://jialianwu.com/projects/TraDeS.html

摘要

  大多数在线多目标跟踪器在神经网络中独立执行目标检测,无需任何跟踪输入。在本文中,我们提出了一种新的在线联合检测和跟踪模型,TraDeS(TRAck-to-DEtect和Segment),利用跟踪线索来辅助端到端的检测。TraDeS通过成本量推断目标跟踪偏移量,用于传播之前的目标特征,以改进当前目标检测和分割。在MOT (2D跟踪)、nuScenes (3D跟踪)、MOTS和Youtube-VIS(实例分割跟踪)4个数据集上显示了TraDeS的有效性和优越性。

1.引言

在这里插入图片描述

  先进的在线多目标跟踪方法主要遵循两种范式:检测跟踪[5,38,27,52,30,49]和联合检测与跟踪[26,63,1,29,45,25,43,44]。基于检测的跟踪(TBD)范式将检测和跟踪视为两个独立的任务(图1(a))。它通常使用现成的目标检测器进行检测,并使用另一个单独的网络进行数据关联。由于两阶段处理,TBD系统效率低下,没有进行端到端优化。为了解决这个问题,最近的解决方案倾向于联合检测和跟踪(JDT)范式,该范式同时在单个前向传递中执行检测和跟踪(图1(b))。

  然而,JDT方法面临两个问题:(i)尽管在大多数JDT工作[29,45,25,50]骨干网络是共享的,但检测通常是独立进行的,没有探索跟踪线索( tracking cues)。我们认为,检测是稳定一致的轨迹的基石,而跟踪线索则有助于检测,特别是在部分遮挡和运动模糊等困难场景下。(注:作者认为现有算法在检测的过程中未使用跟踪的结果,导致检测效果不足,而合适的跟踪推理有助于提升检测的鲁棒性)(ii)[9]和我们的实验研究(表1b)普通reID跟踪损失[45,25,32,51]与联合训练单一骨干网络时的检测损失不太兼容,甚至会在一定程度上影响检测性能。原因是re-ID关注的是类内方差,而检测的目的是扩大类间差异,最小化类内方差。

  在本文中,我们提出了一种新的在线联合检测和跟踪模型,称为TraDeS(TRAck to DEtect and Segment)。在TraDeS中,特征图上的每个点要么代表一个目标中心,要么代表一个背景区域,类似于CenterNet[64]。TraDeS通过将跟踪与检测紧密结合,以及专门设计的重新识别学习方案,解决了上述两个问题。具体来说,我们提出了一个基于成本量的关联(CVA)模块和一个运动导向的特征校正(MFW)模块。CVA通过backbone提取点方向的re-ID嵌入特征,构建成本量(cost volume),存储两帧内嵌入对之间的匹配相似性。然后,从代价量推导出跟踪偏移量,即所有点的时空位移,即两帧中潜在对象的中心。跟踪偏移量与嵌入量一起被用来进行简单的两轮长期数据关联。然后,MFW将跟踪偏移量作为运动线索,将目标特征从前一帧传播到当前帧。最后,将传播的特征和当前特征进行聚合,得到检测和分割。(注:可以认为本文使用跟踪的线索对检测特征图进行了修正,提升了检测的性能,自然而然地可以带来跟踪性能的提升)

  在CVA模块中,利用成本量(cost volume)来监督re-ID的嵌入,其中隐式地考虑了不同的对象类别和背景区域。也就是说,我们的再识别目标涉及到类内方差。该方法不仅学习了一种有效的嵌入方法,如常见的re-ID loss[45,25,32,51],而且与检测loss兼容良好,不影响检测性能,如表1b所示。此外,由于跟踪偏移量是基于外观嵌入相似性进行预测的,因此可以匹配图3所示运动非常大或帧率较低的目标,甚至可以准确跟踪图4所示运动不可见的不同数据集中的目标。因此,预测的目标跟踪偏移量可以作为一个鲁棒的运动线索,指导特征在MFW模块中的传播。当前帧中被遮挡和模糊的物体可能在早期帧中是可读的,因此从之前帧中传播的特征可能支持当前的特征,从而由我们的MFW模块恢复可能遗漏的物体。

  综上所述,我们提出了一种新型的在线多目标跟踪器TraDeS,该跟踪器深度集成了跟踪线索,在端到端框架下辅助检测,从而实现跟踪收益,如图 1 ( c ) 1(c) 1(c)所示。TraDeS是一个通用跟踪器,通过添加一个简单的实例分段分支,它可以很容易地扩展到实例分段跟踪。在4个数据集上进行了广泛的实验,即: MOT, nuScenes, MOTS和Youtube-VIS数据集,跨越3个任务,包括2D目标跟踪,3D目标跟踪和实例分割跟踪。交易通过节5.3所示的有效推断时间实现了最先进的性能。此外,进行了彻底的消融研究,以证明我们的方法的有效性,如节5.2所示。

2.相关工作

3.Preliminaries

  本文提出的TraDeS是建立在基于点的对象检测器CenterNet之上的[64]。CenterNet的输入为一张图片 I ∈ R H × W × 3 I\in{\mathbb{R}^{H\times{W}\times3}} IRH×W×3,由backbone网络 ϕ ( ⋅ ) \phi(\cdot) ϕ()生成了基础特征 f = ϕ ( I ) f=\phi{(I)} f=ϕ(I),其中 f ∈ R H F × W F × 64 f\in {\mathbb{R}^{H_{F}\times W_{F} \times64}} fRHF×WF×64, H F = H 4 , W F = W 4 H_{F}=\frac{H}{4},W_F=\frac{W}{4} HF=4H,WF=4W。然后在 f f f上构造一组头部卷积分支,生成一个类中心热图 P ∈ R H F × W F × N c l s P\in {\mathbb{R}^{H_{F}\times W_{F} \times N_{cls}}} PRHF×WF×Ncls,以及根据不同认为产生特征图,如2d检测或者3d检测。 N c l s N_{cls} Ncls是类别的数量。CenterNet通过物体的中心点(即P中的局部峰值)和对应的特定任务的峰值位置预测来检测物体。

  与[63]类似,我们通过在CenterNet上添加一个额外的head分支来构建基线跟踪器,该分支可以预测跟踪偏移特征 O B ∈ R H F × W F × w O^{B}\in {\mathbb{R}^{H_{F}\times W_{F} \times w}} OBRHF×WF×w以用于数据关联。 O B O^B OB计算了所有时间t到时间 t τ t_\tau tτ的所有对应点的时空位移。

4.TraDeS Tracker。

我们的想法: 大多数以前的联合检测和跟踪方法执行一个独立的检测,而不需要跟踪的显式输入。相反,我们的目标是将跟踪线索集成到端到端检测中,从而提高对复杂场景的检测,从而有利于跟踪。为此,我们提出了一个基于成本量(Cost Volume)的关联(CVA:§4.1)模块,用于学习re-id嵌入和推导物体运动,以及一个运动引导特征变形( Motion-guided Feature Warper,MFW:§4.2)模块,用于利用CVA的跟踪线索来传播和增强物体特征。
在这里插入图片描述

图2

4.1. Cost Volume based Association

Cost Volume: I t I^t It的基础特征图为 f t f^t ft, I t − τ I^{t-\tau} Itτ的基础特征图为 f t − τ f^{t-\tau} ftτ,我们使用由三个卷积层构成的embedding网络 σ ( ⋅ ) \sigma(\cdot) σ()提取它们的re-id嵌入特征,即: e t = σ ( f t ) ∈ R H F × W F × 128 e^t=\sigma(f^{t})\in {\mathbb{R}^{H_{F}\times W_{F} \times 128}} et=σ(ft)RHF×WF×128。我们利用提取的嵌入构造一个cost volume,存储两个帧中一个点与其对应点之间的密集匹配相似点。为了有效地计算代价体积,我们首先对嵌入物进行抽样,抽样系数为2,得到 e t ∈ R H C × W C × 128 e^t\in {\mathbb{R}^{H_{C}\times W_{C} \times 128}} etRHC×WC×128,其中 H C = H F 2 , W C = W F 2 H_{C}=\frac{H_F}{2},W_{C}=\frac{W_F}{2} HC=2HF,WC=2WF。现在,我们设 C ∈ R H C × W C × H C × W C C \in \mathbb{R}^{H_{C}\times W_{C} \times H_{C}\times W_{C}} CRHC×WC×HC×WC,此即一个从 I t I^t It I t − τ I^{t-\tau} Itτ的4维Cost Volume,将 e ′ t e'^{t} et e ′ t − τ e'^{t-\tau} etτ通过矩阵计算即可得到。特别的是,对于 C C C的每个元素,其计算公式如下:
C i , j , k , l = e i , j ′ t e k , l ′ t − τ T C_{i,j,k,l}=e'^{t}_{i,j}{e'^{t-\tau}_{k,l}}^T Ci,j,k,l=ei,jtek,ltτT
其中, C i , j , k , l C_{i,j,k,l} Ci,j,k,l表示了点(i,j)在时间 t t t和点(k,l)在时间 t − τ t-\tau tτ之间的嵌入相似度。这里,一个点指的是feature map f f f e ′ e' e上的一个对象。(注:此处计算就是将前一个e与后一个e对位相乘,每个元素均与之后矩阵元素生成一个 H C W C H^{C}W^{C} HCWC的矩阵)
Tracking Offset: 基于cost volume C C C 我们计算出跟踪偏移矩阵 O ∈ R H C × W C × 2 O \in \mathbb{R}^{H_{C}\times W_{C} \times 2} ORHC×WC×2,它将所有时间点的时空位移存储到它们在时间t的对应点 t − τ t−τ tτ.为了便于说明,我们展示了 O i , j ∈ R 2 O_{i,j} \in \mathbb{R}^2 Oi,jR2
如图2所示,对于一个物体 x x x的在时间 t t t的中心点 ( i , j ) (i,j) (i,j),我们可以从 C C C中获取相应的二维cost volume map C i , j ∈ R H C × W C C_{i,j}\in \mathbb{R}^{H_{C}\times W_{C} } Ci,jRHC×WC C i , j C_{i,j} Ci,j储存了物体 x x x与时刻 t − τ t-\tau tτ中所有点的匹配相似性。使用 C i , j , O i , j ∈ R 2 C_{i,j},O_{i,j}\in \mathbb{R}^{2} Ci,j,Oi,jR2通过两个步骤进行估算: S t e p ( i ) Step(i) Step(i) C i , j C_{i,j} Ci,j H c × 1 和 1 × W C H_c \times 1和1\times W_C Hc×11×WC进行最大池化,结果分别记为 C i , j W ∈ [ 0 , 1 ] 1 × W C , C i , j H ∈ [ 0 , 1 ] H C × 1 C^{W}_{i,j} \in [0,1]^{1 \times W_C},C^{H}_{i,j} \in [0,1]^{H_C \times 1} Ci,jW[0,1]1×WCCi,jH[0,1]HC×1. C i , j W , C i , j H C^{W}_{i,j} ,C^{H}_{i,j} Ci,jW,Ci,jH分别由物体 x x x在时间 t − τ t-\tau tτ的特定水平和垂直出现的可能性构成。例如, C i , j W C^{W}_{i,j} Ci,jW是物体 x x x在时间 t − τ t-\tau tτ出现在位置 ( ∗ , l ) (∗,l) (,l)的可能性。 S t e p ( i i ) Step(ii) Step(ii) 因为 C i , j W , C i , j H C^{W}_{i,j} ,C^{H}_{i,j} Ci,jW,Ci,jH已经提供了对象 x x x在时间 t − τ t-\tau tτ出现在特定位置的可能性。为了获得最终的偏移量,我们分别为水平方向和垂直方向预定义了两个偏移量模板,表示当 x x x出现在这些位置时的实际偏移量。 M i , j ∈ R 1 × W C , V i , j ∈ R H C × 1 M_{i,j}\in\mathbb{R}^{1\times W_C},V_{i,j}\in\mathbb{R}^{H_C\times 1} Mi,jR1×WC,Vi,jRHC×1分别表示对象 x x x在水平方向和垂直方向的位置偏移,它们的计算公式如下:
{ M i , j , l = ( l − j ) × s 1 ≤ l ≤ W C V i , j , k = ( k − i ) × s 1 ≤ k ≤ H C \left\{\begin{matrix} M_{i,j,l}=(l-j)\times s& 1\le l\le W_C\\ V_{i,j,k}=(k-i)\times s&1\le k\le H_C \end{matrix}\right. {Mi,j,l=(lj)×sVi,j,k=(ki)×s1lWC1kHC
其中,s是全局步幅,即之前所说的由输入图变为 e ′ e' e,在我们的案例中,设为8.。 M i , j , l M_{i,j,l} Mi,j,l表示了对象 x x x在时间 t − τ t-\tau tτ位于 ( ∗ , l ) (*,l) (,l)的水平偏移量。通过概率值与实际偏移值的点积可以推断出最终的跟踪偏移量为:
O i , j = [ C i , j H T V i , j , C i , j W M i , j T ] O_{i,j}=[{C^{H}_{i,j}}^{T} V_{i,j},{C^{W}_{i,j}} {M_{i,j}}^{T}] Oi,j=[Ci,jHTVi,j,Ci,jWMi,jT]
由于 O ∈ R H C × W C O\in \mathbb{R}^{H_C\times W_C} ORHC×WC,所有需要对其进行倍数为2的上采样,最终得到 O ∈ R H F × W F × 2 O\in \mathbb{R}^{H_F\times W_F\times 2} ORHF×WF×2,并以此作为MFW的运动依据以及数据关联。 (感觉有点像centernet,之后看完代码回来补。注意:此处无任何学习参数。)
Training: 由于σ(·)是CVA模块中唯一可学习的部分,所以CVA的训练目标是学习有效的re-ID嵌入 e e e。为了监督训练 e e e,我们对cost volume进行监督训练,而不是像其他常见的re-ID损失那样直接训练。我们假设当 Y i , j , k , l = 1 Y_{i,j,k,l}=1 Yi,j,k,l=1当一个对象 t t t时刻时位于 ( i , j ) (i,j) (i,j)而在时刻 t − τ t-\tau tτ 出现于 ( k , l ) (k,l) (k,l),否则 Y i , j , k , l = 0 Y_{i,j,k,l}=0 Yi,j,k,l=0.。然后,通过logistic回归计算CVA的训练损失,其形式为focal loss [22]:

L C V A = − 1 ∑ i j k l Y i j k l ∑ i j k l { α 1 l o g ( C i , j , l W ) + α 2 l o g ( C i , j , k H ) i f Y i j k l = 1 0 o t h e r w i s e L_{CVA}=\frac{-1}{\sum_{ijkl}Y_{ijkl}}\sum_{ijkl}{\left\{\begin{matrix} \alpha_1log(C_{i,j,l}^{W})+\alpha_2log(C_{i,j,k}^{H})& if Y_{ijkl}=1 \\ 0&otherwise \end{matrix}\right.} LCVA=ijklYijkl1ijkl{α1log(Ci,j,lW)+α2log(Ci,j,kH)0ifYijkl=1otherwise

其中, α 1 = ( 1 − C i , j , l W ) β , α 2 = ( 1 − C i , j , k H ) β \alpha_1=(1-C_{i,j,l}^{W})^{\beta},\alpha_2=(1-C_{i,j,k}^{H})^{\beta} α1=(1Ci,j,lW)β,α2=(1Ci,j,kH)β β \beta β是focal loss的超参。因为 C i , j , l W 、 C i , j , k H C_{i,j,l}^{W}、C_{i,j,k}^{H} Ci,j,lWCi,j,kH由softmax计算得到,它们不仅涉及点 ( i , j ) (i,j) (i,j) k , l k,l k,l之间的嵌入相似性,而且涉及点 ( i , j ) (i,j) (i,j)与前一帧所有其他点之间的嵌入相似性。也就是说, C i , j , l W C_{i,j,l}^{W} Ci,j,lW C i , j , k H C_{i,j,k}^{H} Ci,j,kH被优化到接近1时,它强制一个物体不仅在前一帧中接近自己,而且还排斥其他物体和背景区域。
The CVA Characteristics: ( i ) (i) (i) 常见的re-ID 损失只强调类内方差,这可能会降低检测性能。相比之下,公式4中的 L C V A L_{CVA} LCVA 在学习嵌入时,不仅强调了类内方差,而且增强了类间差异。我们发现这种方式更适合检测损失,并在不降低检测性能的情况下学习了更有效的嵌入模式,如表1所示。 ( i i ) (ii) (ii) 由于跟踪偏移量是基于外观嵌入相似性进行预测的,因此可以跟踪图3和图6所示的大运动范围、低帧率的目标,甚至可以准确跟踪训练集中不可见大运动的不同数据集中的目标,如图4所示。因此,预测的跟踪偏移量可以作为一个鲁棒的运动线索来指导我们的特征传播,如表1c所示。 ( i i i ) (iii) (iii) 与[45,25]和CenterTrack[63]只预测数据关联的嵌入或跟踪偏移量相比,CVA同时产生用于长期数据关联的嵌入和跟踪偏移量(节4.3),并作为MFW的运动线索(节4.2)。

4.2.基于动作指导的特征整合(Motion-guided Feature Warper)

  MFW的目标是以预测的跟踪偏移量 O C O^C OC作为运动线索,将 f t − τ f^{t-\tau} ftτ修正并传播到当前时间,从而补偿和增强 f t f^t ft。为了实现这一目标,我们通过单个可变形卷积[12]执行有效的时间传播,该卷积在以前的工作[4,3,13]中用于时间对齐特征。然后,我们通过聚合传播的特征来增强 f t f^t ft
时间传播(Temporal Propagation): 为了传播特征图,可变形卷积(DCN)将一个时空偏移图和一个之前的特征作为输入,输出一个传播的特征,其中我们基于CVA模块的 O C O^C OC估计输入偏移量。我们使用 O D ∈ R H F × W F × 2 K 2 O^D \in \mathbb{R}^{H_{F} \times W_{F} \times 2K^2} ODRHF×WF×2K2作为DCN的输入双向偏移,其中 K = 3 K=3 K=3是DCN的卷积核尺寸。为了生成 O D O^D OD,将 O C O^C OC输入一个 3 × 3 3\times3 3×3的卷积 γ ( ⋅ ) \gamma (\cdot) γ()中。我们选择性地将 f t − f t − τ f^{t}-f^{t-\tau} ftftτ的残差特征作为 γ ( ⋅ ) \gamma (\cdot) γ()的输入,以提供更多的运动线索。由于我们的检测和分割主要是基于对象中心特征,而不是直接修正 f t − τ f^{t-\tau} ftτ,所以我们传播了之前的一个中心关注特征 f ˉ t − τ ∈ R H F × W F × 64 \bar{f}^{t-\tau} \in \mathbb{R}^{H_{F}\times W_{F} \times 64} fˉtτRHF×WF×64 f ˉ t − τ 的 计 算 公 式 如 下 : \bar{f}^{t-\tau}的计算公式如下: fˉtτ
f ˉ t − τ = f q f − τ ∘ P a g n f − τ , q = 1 , 2 , … , 64 \bar{f}^{t-\tau}=f^{f-\tau}_{q}\circ P^{f-\tau}_{agn} , q=1,2,\dots ,64 fˉtτ=fqfτPagnfτ,q=1,2,,64
其中, q q q是通道索引, ∘ \circ 是 Hadamard product(就是我们常用的对位相乘) P a g n f − τ ∈ R H F × W F × 1 P^{f-\tau}_{agn} \in \mathbb{R}^{H_{F}\times W_{F} \times1} PagnfτRHF×WF×1是从 P t − τ P^{t-\tau} Ptτ中提取的类别变化中心热图。随后,由 O D , f ˉ t − τ O^{D},\bar{f}^{t-\tau} OD,fˉtτ,传播的特征通过DCN计算为 f ^ t − τ = D C N ( O D , f ˉ t − τ ) ∈ R H F × W F × 64 \hat{f}^{t-\tau}=DCN(O^{D},\bar{f}^{t-\tau})\in\mathbb R^{H_{F}\times W_{F} \times 64} f^tτ=DCN(OD,fˉtτ)RHF×WF×64(没看明白怎么操作的,感觉更可能是add)

特征增强(Feature Enhancement) 当发生遮挡或运动模糊时,探测器可能会错过对象。我们提出通过聚合传播的特征 f ^ t − τ \hat{f}^{t-\tau} f^tτ来增强 f t f^t ft,使得被遮挡和模糊的物体在视觉上更清晰。我们将增强后的特征记为 f ~ t − τ \widetilde{f}^{t-\tau} f tτ,通过加权求和计算得到:
f ~ q t = w t ∘ f q t + ∑ τ = 1 T w t − τ ∘ f ^ q t − τ , q = 1 , 2 , … , 64 \widetilde{f}^{t}_{q} = w^{t} \circ{f_{q}^{t}}+{\sum_{\tau=1}^{T} w^{t-\tau}\circ \hat{f}_{q}^{t-\tau} },q=1,2,\dots,64 f qt=wtfqt+τ=1Twtτf^qtτ,q=1,2,,64
(有点类似于动量的感觉,用过去信息增强当前特征,之后的论文可以考虑借鉴)
其中, w t ∈ R H F × W F × 1 w^{t}\in \mathbb{R}^{H_{F}\times W_{F} \times 1} wtRHF×WF×1是时间 t t t的自适应权重,以及 ∑ τ = 1 T w i , j t − τ = 1 \sum_{\tau=1}^{T} w^{t-\tau}_{i,j}=1 τ=1Twi,jtτ=1。T是用于聚合的先前特征数量。与[24]类似, w w w是由两个卷积层和softmax函数预测的。实验结果表明,加权求和略优于平均求和。增强后的特征A被输入到头网络中,在当前帧中产生检测框和掩码。这可以潜在地恢复丢失的物体和减少假阴性,提高轨迹的完整性并获取更高的MOTA和IDF1,如表1a所示。

4.3. 轨迹生成(Tracklet Generation)

  TraDeS的总体架构图如图2所示。基于已被增强的特征 f ~ t \widetilde{f}^t f t ,TraDeS可以通过3个head网产生2D和3D框,以及实例分割。之后,生成的检测和掩码通过我们的数据关联连接到以前的轨迹。
Head Networks: 每个头部网络由几个轻量级卷积组成,用于生成特定任务的预测。对于2D和3D检测,我们使用与CenterNet相同的头部网络[64]。例如分割,我们参考CondInst[39]中的头部网络,这也是一种基于中心点的实例分割方法。
数据关联: 给定一个增强的检测或掩码在位置 ( i , j ) (i, j) (i,j)中心,我们执行两轮数据关联如下:DA-Round (i) 我们首先将其与以 ( i , j ) + O i , j C (i,j)+O_{i,j}^{C} (i,j)+Oi,jC为中心的区域内 t − 1 t−1 t1时刻最接近的未匹配检测联系起来,半径为 r r r,其中 r r r是被检测框的宽度和高度的几何平均值。这里, O i , j C O_{i,j}^{C} Oi,jC仅表示目标跟踪在 I t I^{t} It I t − 1 I^{t-1} It1之间的偏移量。DA-Round (ii) 如果 d d d在第一轮中没有匹配任何目标,我们计算其嵌入 e i , j t e^{t}_{i,j} ei,jt与所有未匹配或历史轨迹嵌入的余弦相似度。 d d d将被分配给一个轨迹,若他们相似度最高且大于一个阈值,例如0.3.,DA-Round (ii) 具有长期关联能力。若d在上述两轮中未能与任何轨迹产生关联,d将生成一个新的轨迹。(注:我对该数据关联的理解如下:步骤1.对于一个对象中心,检测以修正点为中心,检测框平均几何距离为半径的范围内是否有未配对的上一帧的检测框,若有则完成关联。步骤2.对于未被匹配的对象,输入embed检测,计算该点与所有未匹配轨迹的余弦相似度,并决定是否分配。最后对于未分配的对象,赋予新身份。)
TraDeS Loss: TraDeS的总体损失函数定义为 L = L C V A + L d e t + L M A S K L=L_{CVA}+L_{det}+L_{MASK} L=LCVA+Ldet+LMASK,其中, L d e t L_{det} Ldet为2D或3D的检测loss,如[64], L M A S K L_{MASK} LMASK是分割损失,如[39]。

5.实验

6.总结

  本文提出了一种新的在线联合检测和跟踪模型TraDeS,重点是利用跟踪线索来帮助检测和反馈跟踪。TraDeS配备了两个提议的模块,CVA和MFW。CVA学习专门设计的重新id嵌入,并通过4d cost volume建模对象运动。而MFW则以CVA的运动为线索,传播之前的目标特征,增强当前的检测或分割。通过对二维跟踪、三维跟踪和实例分割跟踪的实验验证了该方法的有效性和优越性。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值