有用的话文末帮忙点个赞哦\~
【写在前面】
大规模的单流预训练在图文检索中表现出显着的性能。遗憾的是,由于注意力层重,它面临着推理效率低的问题。最近,具有高推理效率的 CLIP 和 ALIGN 等双流方法也显示出了可观的性能,但是它们只考虑了两个流之间的实例级对齐(因此仍有改进的空间)。为了克服这些限制,作者提出了一种新的协作双流视觉语言预训练模型,称为 COTS,用于通过增强跨模态交互来进行图像文本检索。除了通过动量对比学习进行实例级对齐之外,作者还在 COTS 中利用了两个额外级别的跨模态交互:(1) token级交互——在不使用跨流网络的情况下设计了掩蔽视觉语言建模 (MVLM) 学习目标模块,其中变分自动编码器被施加在视觉编码器上,为每个图像生成视觉token。(2) 任务级交互——在文本到图像和图像到文本检索任务之间设计了一个 KL 对齐学习目标,其中每个任务的概率分布是用动量对比学习中的负队列计算的。在公平的比较设置下, COTS 在所有双流方法中实现了最高性能和可比性能(但推理速度快 10,800 倍)。重要的是,本文的 COTS 也适用于文本到视频的检索,在广泛使用的 MSR-VTT 数据集上产生了新的最新技术。
1. 论文和代码地址
COTS: Collaborative Two-Stream Vision-Language Pre-Training Model for Cross-Modal Retrieval
论文地址:https://arxiv.org/abs/2204.07441
代码地址:未开源
2. 动机
pretrain-then-finetune 范式在自然语言处理 (NLP) 领域取得了巨大成功,其中模型首先使用大规模数据(例如 BERT 、RoBERTa 和 GPT3 ),然后针对每个下游任务进行微调。最近,在视觉语言 (VL) 领域也显示了它的有效性,其中在各种 VL 任务(例如,图像文本检索、视频文本检索和视觉问题回答)通过视觉语言预训练(VLP)得到了显着改善。VLP 模型通常以巨大的图像-文本对作为输入,旨在学习具有单模态和跨模态预训练目标的联合图像-文本表示,例如掩码token预测和图像-文本匹配。
现有的 VLP 模型可以分为两类:单流模型和双流模型。单流 VLP 模型(见上图(a))通常利用跨模态融合模块(例如,Transformer层)来模拟图像区域和文本词之间的细粒度交互。尽管这些模型取得了可喜的性能,但它们有两个局限性:(1)在推理过程中,所有可能的查询-候选对都需要输入融合模块来计算相似度分数,从而导致巨大的计算成本。 (2)为了获得有意义的图像区域,单流模型通常采用目标检测器,其计算和数据标注都非常昂贵。例如,对于 Faster RCNN,从 800×1,333 图像中提取对象区域大约需要 900 毫秒,而基于 ViT 的 只需要 15 毫秒(即快 60 倍)。相比之下,双流 VLP 模型应用单独的图像和文本编码器,并在最终嵌入级别上匹配图像-文本对。尽管双流模型(见图(b)–(c))比单流模型更有效,但由于缺乏更紧密的图像-文本交互,它们只能达到次优结果。因此,一些工作 (参见上图(b))重新考虑了目标检测器,而最近的一些工作(例如,CLIP、ALIGN 和 WenLan )采用超大预- 从互联网上抓取的训练数据。然而,他们仍然无法对两种模态之间的细粒度交互进行建模。
为了解决单流 VLP 模型的低效率和两流模型缺乏更紧密的视觉语言交互的问题,作者提出了一种新的协作双流视觉语言预训练模型,称为 COTS,用于跨模态检索,既保留了实时推理速度的优势,又增强了两种模态之间的交互(见上图(d))。具体来说,作者在 COTS 中考虑了三个级别的跨模态交互:(1)实例级交互——通过动量对比设计了最终嵌入级别的图像-文本匹配学习目标(通常由双流 VLP 模型采用),注意这个维护两个样本队列(每种模态一个)以拥有大量的负样本。(2) token级交互——在不使用任何跨流网络模块的情况下,考虑了一种新颖的mask视觉语言建模 (MVLM) 学习目标。为此,作者首先对每个输入图像-文本对的图像和文本进行标记,其中变分自动编码器 被施加在视觉编码器(例如,ViT)上以生成视觉token,文本编码器采用BERT 。然后,作者根据未屏蔽的视觉标记和每个图像配对文本的特征执行屏蔽视觉标记预测,并类似地执行屏蔽语言标记预测。(3) 任务级交互——通过最小化两个检索任务的概率分布之间的 Kullback-Leibler (KL) 分歧,在文本到图像和图像到文本检索任务之间设计了一种新的 KL 对齐学习目标。对于每个图像-文本对,使用动量对比学习中保持的负图像队列中所选文本与其未配对图像的相似性,获得文本到图像检索任务的概率分布,可以得到另一个分布相似地。
随着预训练数据的规模越来越大(例如,从互联网上爬取的数千万甚至数十亿的图文对),无法进行人工标注,因此在大规模数据中不可避免地存在噪声。噪声数据,例如不匹配的图像-文本对和完全无意义的数据,可能会给预训练带来负面影响。因此,在本文中, COTS 提出了一个自适应动量滤波器 (AMF) 模块,该模块可以充分利用基于对比学习的训练算法中的动量机制。具体来说,首先从动态维护的图像和文本队列中计算所有图像-文本对的相似度得分,以获得一个额外的队列。此外,将此相似度分数队列建模为正态分布,并动态过滤掉具有分布均值和方差的噪声数据。
本文的贡献总结如下:(1)提出了一种新颖的协同双流(COTS)VLP模型,以提高双流模型的性能并同时保持其效率优势。除了典型的实例级对齐之外,作者还通过利用两个额外级别的跨模态交互来实现这一点:一个用于token级交互的掩蔽视觉语言建模 (MVLM) 学习目标,以及一个用于任务级交互的 KL对齐学习目标。(2)为了减轻大规模预训练数据中噪声造成的负面影响,作者提出了自适应动量滤波器(AMF)模块。 AMF 在实例级对齐中充分利用动量机制,并在预训练期间自适应地过滤噪声图像-文本对。(3) 在公平的比较设置下, COTS 在所有双流方法中实现了最高性能,并且与最新的单流方法性能相当(但推理速度快了 10,800 倍)。重要的是, COTS 也适用于文本到视频的检索,在广泛使用的 MSR-VTT 数据集上产生了新的SOTA。
3. 方法
3.1. Framework Overview
用于 VLP 的 COTS 模型的目标是学习两个独立的编码器,它们可以将图像和文本样本嵌入到相同的语义空间中,以实现有效的跨模态检索。如上图所示,图像和文本分别由视觉 Transformer 和语言 Transformer 编码。然后,作者设计了三个级别的跨模态交互作为 COTS 的预训练目标。具体来说,实例级交互通过动量跨模态对比学习来对齐配对图像和文本的全局特征,其灵感来自单模态 MoCo。为了模拟比实例级对齐更紧密的交互,作者提出设计一个蒙面视觉语言建模(MVLM)损失来增强token级交互。 MVLM 有两部分:跨模态掩蔽视觉建模(CMVM)和跨模态掩蔽语言建模(CMLM)。对于每张图像,CMVM 旨在根据未屏蔽的图像块标记及其配对文本的全局特征来预测屏蔽图像块标记的标签。 CMLM 在语言方面也做类似的事情。此外,作者在 COTS 中考虑任务级交互,旨在对齐文本到图像和图像到文本检索任务的概率分布。此外,为了应对大规模预训练数据中的噪声,作者提出了一种自适应动量滤波器(AMF)模块,该模块无缝集成到预训练过程中。
作者在 COTS 中采用双流架构的选择有两个主要优点:(1)实时推理速度——分离的图像和文本编码器允许预先计算候选者的特征以进行跨模态检索任务,并且只需一个简单的点积为每个查询-候选对相似度。 (2) 适用于文本到视频检索——无需任何修改, COTS 可以直接应用于文本到视频检索任务,其中视频表示可以通过平均图像编码器获得的帧嵌入来获得。
3.2. Training Objectives
3.2.1 Token-Level Interaction
作者设计了一个掩蔽视觉语言建模 (MVLM) 损失来增强 COTS 中的token级交互,它可以进一步分为两部分:跨模态掩蔽视觉建模 (CMVM) 和跨模态掩蔽语言建模 (CMLM) 。为了改进使用重检测器预测蒙版图像区域标签的实践,作者引入了基于受 BEIT启发的图像标记器的 CMVM。对于每个图像,CMVM 的目标是使用未掩码的图像块和配对文本来预测掩码图像标记的标签。
形式上,令$\mathcal{D}=\left\{\left(v_{i}, l_{i}\right)\right\}_{i=1}^{N}$表示训练数据集,其中$\left(v_{i}, l_{i}\right)$是第 i 个图像-文本对。对于每个原始图像 $v_{i}$,首先使用预先训练的离散变分自动编码器 (dVAE) 为图像标记器,以获得 24 × 24 离散图像标记的序列$\mathcal{T}_{i}^{v}=\left\{t_{i, j}^{v} \in \mathcal{V}^{v}\right\}_{j=1}^{576}$,其中 $t_{i, j}^{v}$是图像 $v_{i}$的第 j 个标记,$\mathcal{V}^{v}$是离散图像标记的词汇表。同时,原始图像被分割成 24×24 的块,这些块被输入到视觉Transformer中以获得它们的嵌入。然后,我们根据掩码标记嵌入和配对文本的全局嵌入的总和来预测每个掩码标记的标签。因此,CMVM 损失可以表示为:
$$ \mathcal{L}_{\mathrm{CMVM}}=-\mathbb{E}_{\left(v_{i}, l_{i}\right) \sim \mathcal{D}} \log P\left(t_{i, j}^{v} \mid t_{i, \backslash j}^{v}, l_{i}\right) $$
其中$t_{i, j}^{v}$表示目标/掩码图像标记,$t_{i, \backslash j}^{v}=\mathcal{T}_{i}^{v} \backslash\left\{t_{i, j}^{v}\right\}$表示未掩码图像标记。
与 CMVM 类似,对于每一段文本$l_{i}$,CMLM 的目标是根据未掩码的词和配对图像预测每个掩码词标记的标签:
$$ \mathcal{L}_{\mathrm{CMLM}}=-\mathbb{E}_{\left(v_{i}, l_{i}\right) \sim \mathcal{D}} \log P\left(t_{i, j}^{l} \mid t_{i, \backslash j}^{l}, v_{i}\right), $$
其中$t_{i, j}^{l}$表示目标/掩码文本词标记,$t_{i, \backslash j}^{l}$表示未掩码词。token级跨模式交互的总损失然后定义为:
$$ \mathcal{L}_{\text {token }}=\mathcal{L}_{\mathrm{CMVM}}+\mathcal{L}_{\mathrm{CMLM}} . $$
3.2.2 Instance-Level Interaction
为了在 COTS 中对两种模态(即全局特征对齐)的实例级交互进行建模,作者采用了一种受单模态 MoCo启发的跨模态动量对比学习(MCL)算法,它提供了一种机制动态维护负样本队列以进行对比学习。由于本文的 MCL 中使用的两个队列(每种模态一个)成功地将队列大小与 mini-batch 大小分离,负样本的大小(对于对比学习至关重要)可能比 mini-batch 大小大得多。
具体来说,让 $f^{v}$(带有参数 $θ^v$)和 $f^l$(带有参数 $θ^l$)分别表示图像和文本编码器。分别为视觉和语言模态采用两个额外的动量编码器 $\widehat{f} v$(带有参数 $\hat{\theta}^{v}$)和 $\hat{f}^{l}$(带有参数 $\hat{\theta}^{l}$)。动量编码器的参数通过以下方式更新:
$$ \hat{\theta}^{v}=m \cdot \hat{\theta}^{v}+(1-m) \cdot \theta^{v}\\\hat{\theta}^{l}=m \cdot \hat{\theta}^{l}+(1-m) \cdot \theta^{l} $$
其中 m 是动量超参数。
此外,作者维护两个队列$\mathcal{Q}^{v}=\left\{\hat{\mathbf{q}}_{j}^{v}\right\}_{j=1}^{N_{q}}$ 和 $\mathcal{Q}^{l}=\left\{\hat{\mathbf{q}}_{j}^{l}\right\}_{j=1}^{N_{q}}$其中$\hat{\mathbf{q}}_{j}^{v} / \hat{\mathbf{q}}_{j}^{l}$ 表示动量特征向量,Nq 表示队列大小。每个 mini-batch 中的样本 $\mathcal{B}=\left\{\left(v_{i}, l_{i}\right)\right\}_{i=1}^{N_{b}} \subseteq \mathcal{D}\left(N_{b}=|\mathcal{B}| \ll N_{q}\right)$ 被送入当前动量编码器以获得动量特征,然后在损失计算后将其推入相应的队列。同时,每个队列中最早的 $N_{b}$个动量特征向量被弹出。给定数据batch中的每张图像,通过将其配对文本视为正样本,将$\mathcal{Q}^{l}$中的所有样本视为负样本,将图像到文本的对比损失定义为(τ 是温度超参数):
$$ \mathcal{L}_{\mathrm{I} 2 \mathrm{~T}}=-\frac{1}{N_{b}} \sum_{\left(v_{i}, l_{i}\right) \in \mathcal{B}} \log \frac{\operatorname{pos}\left(\mathbf{f}_{i}^{v}, \hat{\mathbf{f}}_{i}^{l}, \tau\right)}{\operatorname{pos}\left(\mathbf{f}_{i}^{v}, \hat{\mathbf{f}}_{i}^{l}, \tau\right)+\operatorname{neg}\left(\mathbf{f}_{i}^{v}, \mathcal{Q}^{l}, \tau\right)} $$
其中 $\mathbf{f}_{i}^{v}=f^{v}\left(v_{i}\right), \hat{\mathbf{f}}_{i}^{l}=\hat{f}^{l}\left(l_{i}\right)$,并且
$$ \begin{aligned} \operatorname{pos}\left(\mathbf{f}_{i}^{v}, \hat{\mathbf{f}}_{i}^{l}, \tau\right) &=\exp \left(\mathbf{f}_{i}^{v} \cdot \hat{\mathbf{f}}_{i}^{l} / \tau\right) \\ \operatorname{neg}\left(\mathbf{f}_{i}^{v}, \mathcal{Q}^{l}, \tau\right) &=\sum_{\hat{\mathbf{q}}_{j}^{l} \in \mathcal{Q}^{l}} \exp \left(\mathbf{f}_{i}^{v} \cdot \hat{\mathbf{q}}_{j}^{l} / \tau\right) \end{aligned} $$
两个特征向量的相似度在这里用点积来衡量。同样,给定数据batch中的每个文本,作者将文本到图像的对比损失定义为:
$$ \mathcal{L}_{\mathrm{T} 2 \mathrm{I}}=-\frac{1}{N_{b}} \sum_{\left(v_{i}, l_{i}\right) \in \mathcal{B}} \log \frac{\operatorname{pos}\left(\mathbf{f}_{i}^{l}, \hat{\mathbf{f}}_{i}^{v}, \tau\right)}{\operatorname{pos}\left(\mathbf{f}_{i}^{l}, \hat{\mathbf{f}}_{i}^{v}, \tau\right)+\operatorname{neg}\left(\mathbf{f}_{i}^{l}, \mathcal{Q}^{v}, \tau\right)} $$
其中$\mathbf{f}_{i}^{l}=f^{l}\left(l_{i}\right)$,且$\hat{\mathbf{f}}_{i}^{v}=\hat{f}^{v}\left(v_{i}\right)$。然后将的实例级跨模态交互的总损失定义为:
$$ \mathcal{L}_{\text {inst }}=\mathcal{L}_{\mathrm{I} 2 \mathrm{~T}}+\mathcal{L}_{\mathrm{T} 2 \mathrm{I}} $$
3.2.3 Task-Level Interaction
对于mini-batch中的每个图像$v_{i}$,图像到文本的对比目标实际上是最大化其配对文本 $l_{i}$与 $\mathcal{Q}^{l}$中未匹配样本的匹配概率(文本侧也是如此)。也就是说,实例级特征对齐只关心最大化图像到文本/文本到图像检索任务的整个概率分布中的一个特定概率,而无法捕获两种模态之间更高级别的交互。为了填补文献中的空白,作者提出将两个跨模式检索任务的概率分布对齐作为任务级交互。
具体来说,对于每个图像-文本对$\left(v_{i}, l_{i}\right) \in \mathcal{B}$,作者将图像-文本任务的概率分布定义为:
$$ \mathcal{D}_{\mathrm{I} 2 \mathrm{~T}}=\left[p\left(\mathbf{f}_{i}^{v}, \hat{\mathbf{f}}_{i}^{l}\right), p\left(\mathbf{f}_{i}^{v}, \hat{\mathbf{q}}_{1}^{l}\right), \cdots, p\left(\mathbf{f}_{i}^{v}, \hat{\mathbf{q}}_{N_{q}}^{l}\right)\right] $$
其中:
$$ p\left(\mathbf{f}_{i}^{v}, \hat{\mathbf{f}}_{i}^{l}\right)=\frac{\exp \left(\mathbf{f}_{i}^{v} \cdot \hat{\mathbf{f}}_{i}^{l} / \tau\right)}{\sum_{\hat{\mathbf{f}}_{1} \in\left\{\hat{\mathbf{f}}_{i}^{l}\right\} \cup \mathcal{Q}^{l}} \exp \left(\mathbf{f}_{i}^{v} \cdot \hat{\mathbf{f}} / \tau\right)} $$
和$p\left(\mathbf{f}_{i}^{v}, \hat{\mathbf{q}}_{j}^{l}\right)\left(\hat{\mathbf{q}}_{j}^{l} \in \mathcal{Q}^{l}, j=1,2, \cdots, N_{q}\right)$可以用同样的方法计算获得文本到图像任务的概率分布为:
$$ \mathcal{D}_{\mathrm{T} 2 \mathrm{I}}=\left[p\left(\mathbf{f}_{i}^{l}, \hat{\mathbf{f}}_{i}^{v}\right), p\left(\mathbf{f}_{i}^{l}, \hat{\mathbf{q}}_{1}^{v}\right), \cdots, p\left(\mathbf{f}_{i}^{l}, \hat{\mathbf{q}}_{N_{q}}^{v}\right)\right] $$
然后,本文的任务级跨模态交互的学习目标被表述为最小化$\mathcal{D}_{\mathrm{I2T}}$和$\mathcal{D}_{\mathrm{T} 2 I}$之间的对称 Kullback-Leibler (KL) 散度:
$$ \mathcal{L}_{\text {task }}=\frac{1}{N_{b}} \sum_{\left(v_{i}, l_{i}\right) \in \mathcal{B}}\left(\mathrm{KL}\left(\mathcal{D}_{\mathrm{I} 2 \mathrm{~T}} \| \mathcal{D}_{\mathrm{T} 2 \mathrm{I}}\right)+\mathrm{KL}\left(\mathcal{D}_{\mathrm{T} 2 \mathrm{I}} \| \mathcal{D}_{\mathrm{I} 2 \mathrm{~T}}\right)\right) $$
3.3. Adaptive Momentum Filter
大规模的网络爬取数据不可避免地包含噪声,这可能会给预训练带来负面影响。因此,基于 COTS 中采用的动量机制,作者提出了一种自适应动量滤波器 (AMF) 模块来自适应地过滤噪声图像-文本对。
正如在实例级交互中介绍的那样,本文的 COTS 动态维护两个样本队列$\mathcal{Q}^{v}$和$\mathcal{Q}^{l}$用于动量对比学习。由于成对的图像和文本同时被推入或弹出相应的队列,所以 $\hat{\mathbf{q}}_{j}^{v} \in \mathcal{Q}^{v}$和 $\hat{\mathbf{q}}_{j}^{l} \in \mathcal{Q}^{l}$$\left(j=1,2, \cdots, N_{q}\right)$也是成对的。然后,可以通过点积计算每对$\left(\hat{\mathbf{q}}_{j}^{v}, \hat{\mathbf{q}}_{j}^{l}\right)$的相似度得分。这样,我们得到一个额外的相似度队列 $Q^s =\left{\hat{\mathbf{q}}_{j}^{v} \cdot \hat{\mathbf{q}}_{j}^{l} \mid \hat{\mathbf{q}}_{j}^{v} \in \mathcal{Q}^{v}, \hat{\mathbf{q}}_{j}^{l} \in \mathcal{Q}^{l}\right}_{j=1}^{N_{q}}$,它也与两个样本队列一起动态维护。
请注意,相似度队列 $\mathcal{Q}^{5}$ 可以看作是当预训练迭代中相似度得分分布的采样。首先计算其均值 μ 和标准差 σ 作为相似度分数分布的估计值。然后,基于 μ 和 σ(例如,$s_{\mathrm{AMF}}=\mu-2 \sigma$)获得 AMF 的阈值 sAMF。最后,在计算损失之前使用这个阈值来过滤当前数据batch B:
$$ \mathcal{B}^{*}=\left\{\left(v_{i}, l_{i}\right) \mid \hat{\mathbf{f}}_{i}^{v} \cdot \hat{\mathbf{f}}_{i}^{l}>s_{\mathrm{AMF}},\left(v_{i}, l_{i}\right) \in \mathcal{B}\right\} $$
在这项工作中,sAMF 在不同的训练迭代中随着相似度队列的变化而变化。具体来说,当在完整 COTS 中采用 AMF 时,在每次迭代中使用 $\mathcal{B}^{-}$ 而不是 B 进行损失计算,但是在计算损失后我们仍然将 B 中的所有样本推入 $\mathcal{Q}^{v}$和$\mathcal{Q}^{l}$。
4.实验
作者将 COTS 与两个广泛使用的图像文本数据集上的最先进方法进行比较:Flickr30K 和 MSCOCO。结果如上表所示,本文方法实现了非常好的检索性能。
在上图中,作者将 COTS 与最近关于 MSCOCO (5K) 测试集推理时间的最新技术进行了比较。所有方法均在单个 Tesla V100 GPU 上进行评估。与单流 VinVL相比, COTS 在整个 MSCOCOC (5K) 测试集上快 10,800 倍。
在上表中报告了未对 MSCOCO 进行微调的比较检索结果。可以观察到:(1) COTS 优于最新的单流方法 ViLT。 (2) COTS 也击败了最新的双流方法 CLIP和 ALIGN,尽管它是用更少的数据进行预训练的。
在上表中,作者分析了 COTS 中不同预训练目标和自适应动量滤波器 (AMF) 模块的贡献。从 CC12M 中随机抽取 200K 图像-文本对作为预训练数据集(称为 CC200K)。可以观察到各个损失函数都是有用的。
在表 4 中报告了 MSR-VTT 数据集上的文本到视频检索结果。可以看出:(1)即使没有对视频的时间信息进行建模, COTS 也显着优于现有技术,这证明了 COTS 的普遍适用性和巨大潜力。 (2) COTS 比利用额外模态(例如,运动和音频)或在超大型视频数据上预训练的方法(例如,拥有超过 1 亿个视频-文本对的 HowTo100M 数据集)产生更好的结果,表明经过良好预训练的视觉语言模型可能是视频文本检索的关键。
图 4 显示了COTS 在响应单个单词的图像/视频帧上的可视化注意力图。
5. 总结
在本文中,作者研究了如何提高双流视觉语言预训练 (VLP) 的性能,同时仍然保持其在图像文本检索方面的高效率优势。具体来说,作者通过利用图像-文本检索中的三个级别的跨模态交互,提出了一种称为 COTS 的新型协作双流 VLP 模型。也就是说,作者考虑通过带有标记化图像和文本的掩码视觉语言建模的token级交互,通过跨模态动量对比学习的实例级交互,以及通过对齐两个任务分布的任务级交互。大量实验验证了我们的 COTS 在图像文本检索中的有效性和高效率。它还被证明具有普遍适用性,因为它无需任何修改即可实现视频文本检索的最新SOTA。
【技术交流】
已建立深度学习公众号——FightingCV,关注于最新论文解读、基础知识巩固、学术科研交流,欢迎大家关注!!!
请关注FightingCV公众号,并后台回复ECCV2022即可获得ECCV中稿论文汇总列表。
推荐加入FightingCV交流群,每日会发送论文解析、算法和代码的干货分享,进行学术交流,加群请添加小助手wx:FightngCV666,备注:地区-学校(公司)-名称
面向小白的顶会论文核心代码库:https://github.com/xmu-xiaoma666/External-Attention-pytorch
面向小白的YOLO目标检测库:https://github.com/iscyy/yoloair
【赠书活动】
为感谢各位老粉和新粉的支持,FightingCV公众号将在9月10日包邮送出4本《深度学习与目标检测:工具、原理与算法》来帮助大家学习,赠书对象为当日阅读榜和分享榜前两名。想要参与赠书活动的朋友,请添加小助手微信FightngCV666(备注“城市-方向-ID”),方便联系获得邮寄地址。
本文由mdnice多平台发布