Qwen2.5-VL-Technical-Report

Qwen2.5-VL Technical Report

论文: Qwen2.5-VL Technical Report
作者: Shuai Bai, Keqin Chen, Xuejing Liu, Jialin Wang 等
机构: 阿里云 Qwen 团队
arXiv: 2502.13923


1. 问题与定位

Qwen2.5-VL 是 Qwen 视觉语言系列的最新旗舰模型,解决的核心问题是:如何让一个统一模型同时精通视觉理解、文档解析、空间定位、视频理解和智能体操作。

这不是一篇提出新算法的论文,而是一个工程-架构-数据三位一体的系统报告。其核心贡献在于将多项技术创新整合为一个实用、可扩展的系统。

主要贡献:

  1. 在vision encoder中加入window attention,提升运算效率;
  2. dynamic FPS sampling,支持video understanding;
  3. 优化MRoPE,支持时域;
  4. 数据工程:大量预训练、SFT数据,4.1万亿Token训练集;

主要特点:

  1. 文本理解;
  2. object grounding;
  3. 超长序列视频理解、细粒度视频grounding;
  4. agent智能体能力:理解决策能力;

2. 核心架构

_attachments/Qwen2.5-VL-Technical-Report/file-20260603214209210.png
_attachments/Qwen2.5-VL-Technical-Report/file-20260603214209207.png

2.1 三组件架构

图像/视频 → ViT (从零训练, Window Attention + 2D-RoPE) → MLP Merger (2×2空间压缩) → Qwen2.5 LLM (MRoPE)

2.1.1 ViT:从零训练的动态分辨率视觉编码器

  • 32层,1280 隐藏维度,16 头

  • Patch 大小 14×14,图像尺寸调整为 28 的倍数

  • Window Attention:仅4层(7,15,23,31)使用全局自注意力,其余用窗口注意力(最大 112×112 = 8×8 patches,每个patch是14x14)

    • 小于窗口的图像不做填充,保持原始分辨率
  • 2D-RoPE:空间位置编码

  • 3D Patch 划分(视频):连续2帧分组,Conv3D(2×14×14 核),时序合并

  • 采用RMSNorm、SwiGLU

  • 训练过程

    1. 采用多阶段训练:CLIP pre-training、Vision-Language alignment、end-to-end fine-tuning
    2. 训练时采样多种分辨率
  • ViT的具体计算过程见附录

关键设计选择:ViT 从零训练(而非用预训练 CLIP ViT),因为预训练编码器的语义空间与 LLM 不对齐。RMSNorm + SwiGLU 与 LLM 设计对齐。

2.1.2 MLP Merger

  • 将空间相邻的 2×2 patch 组合,通过两层 MLP 投影到 LLM 嵌入维度
  • 压缩比 4×(4个 patch 特征 → 1个 token)
  • 支持任意分辨率的灵活压缩

2.1.3 LLM:Qwen2.5

  • 用预训练的 Qwen2.5 权重初始化
  • 关键修改:1D RoPE → MRoPE(多模态旋转位置编码),且采用绝对时间

2.2 动态分辨率与动态帧率

2.2.1 空间域

  • 不使用归一化坐标,直接使用像素绝对坐标

  • 模型天然学习尺度信息——知道"100像素宽的物体"在不同分辨率下意味着什么

  • 支持任意分辨率的输入,token 数量随图像大小线性变化

  • 核心机制:基于图像实际尺寸动态调整 token 数量,而非固定分辨率
    基础 patch:14×14 像素
    合并单元:2×2 patch(最大 28×28 像素 /token)
    可配置范围:256-1280 个 token(通过min_pixels/max_pixels控制)
    效果:小图保留细节,大图避免 token 爆炸,平衡精度与效率

2.2.2 时间域

  • 训练时使用多种帧率(0.5/1/2 FPS)采样,确保模型对不同帧率鲁棒
  • 单个视频最多 768 帧,评估时 token 数 ≤ 24,576

2.2.3 绝对时间对齐(Qwen2.5-VL 的关键改进)

在 Qwen2-VL 中,时间位置ID 与帧数绑定——不同采样率下,同一时刻的帧获得不同的时间ID,模型无法学习跨帧率的时间一致性

Qwen2.5-VL 的改进:时间分量与绝对时间对齐。例如一个 8 秒视频:

  • 0.5 FPS → 时间 ID: (0, 15) → 映射到 (0.0s, 8.0s)
  • 1 FPS → 时间 ID: (0, 5, 10, 15) → 映射到 (0.0s, 2.0s, 4.0s, 8.0s)
  • 2 FPS → 时间 ID: (0, 2, 4, 6, 9, 11, 13, 15) → 映射到类似分布

通过时间 ID 之间的间隔,模型学习到跨帧率的时间对齐——无需额外的计算开销(不需要文本时间戳或额外的时间编码头)。

2.3 MRoPE:多模态旋转位置编码

这是 Qwen2.5-VL 相对 Qwen2-VL 的最重要架构创新。

2.3.1 分解为三个分量

MRoPE 将位置编码分解为时间(Temporal)、高度(Height)、宽度(Width)三个独立分量:

模态 时间ID 高度ID 宽度ID
文本 递增(同1D RoPE) 同时间ID 同时间ID
图像 常数(同一时间点) 按空间行递增 按空间列递增
视频 按帧递增 按空间行递增 按空间列递增

直觉:

  • 文本是一维的,三个分量等价于标准 1D RoPE
  • 图像是二维的,时间冻结,高度/宽度编码2D空间位置
  • 视频是三维的,时间编码帧序,高度/宽度编码帧内空间位置

3. 训练流水线

3.1 数据准备

  1. 图文交错数据(Interleaved image-text data)
    • 数据清洗:文本质量、文本图像关联性、文本图像互补性、信息密度平衡
    • 原始数据获取参考OmniCorpus,网页爬虫、youtube视频帧+字幕
  2. grounding数据,有绝对位置坐标
    • 数据扩充:copy-paste方案、grounding DINO、SAM等
    • 1w类物体
  3. 文档解析数据:采用html合成大量数据
  4. OCR数据:合成数据、开源数据、采集数据
  5. 视频数据
  6. Agent数据

3.2 预训练(三阶段,共 4.1T tokens)

  • 包含网页爬虫数据、合成数据等
阶段 数据 可训练参数 序列长度
1. 视觉预训练 图像描述、知识、OCR (1.5T) 仅 ViT 8192
2. 多模态预训练 +纯文本数据、交错数据、VQA、视频、Grounding、agent (2T) ViT + LLM 8192
3. 长上下文预训练 +长视频、长agent、长文档 (0.6T) ViT + LLM 32768

关键设计:

  • 阶段1只训练 ViT,让视觉编码器先建立基础视觉理解
  • 阶段2解锁所有参数,让 ViT 和 LLM 对齐
  • 阶段3扩展序列长度,处理长视频/长文档
  • 动态数据打包(按序列长度分组)确保 GPU 负载均衡

3.3 后训练

SFT:~200万条数据,50%纯文本+50%多模态。ViT 参数冻结。

  • 数据200万:包括通用VQA数据、图像caption、数学问题、coding、安全相关问题、Doc、OCR、Grounding、视频分析、agent等
  • 数据筛选过程
    1. 分类:使用 Qwen2-VL-Instag (基于qwen2-VL-72B的分类模型)做领域分类(8大类→30子类)
      比如:coding、planing、code_debugging、code_generation、code_translation、code_understanding
    2. 筛选
    • 基于规则筛选
    • 奖励模型筛选:基于qwen系列训练奖励模型,评估QA pair的多个维度;针对问题,会评估其难度与内容相关性,仅保留难度适中、贴合上下文的样本;针对回答,则从答案正确性、内容完备度、表述清晰度、与问题匹配度以及实用价值五个维度开展打分。
    1. 数据生成+拒绝采样
    • 对于有标准答案的样本,基于 Qwen2.5-VL 模型的中间版本生成结果,筛选结果正确且过程正确的样本作为训练样本

DPO:图像-文本和纯文本偏好数据。ViT 冻结。


4. 核心能力与评测

4.1 文档理解与 OCR(最强领域)

基准 GPT-4o Qwen2.5-VL 72B
DocVQA 91.1 96.4
InfoVQA 80.7 87.3
OCRBench 736 885
OCRBench_v2_en 46.5 61.5

统一 HTML 格式(QwenVL HTML)将文档解析为结构化数据,包含段落、表格、图表、公式、化学式、乐谱等。

4.2 数学与推理

基准 GPT-4o Qwen2.5-VL 72B
MathVista 63.8 74.8
MATH-Vision 30.4 38.1

4.3 视频理解

基准 GPT-4o Qwen2.5-VL 72B
MVBench 64.6 70.4
MMBench-Video 1.63 2.02
LVBench 30.8 47.3
Charades-STA mIoU 35.7 50.9

MRoPE 的绝对时间对齐在视频理解中发挥了关键作用。

4.4 智能体能力

基准 GPT-4o Qwen2.5-VL 72B
ScreenSpot Pro - 43.6
AndroidWorld 34.5% 35%
MobileMiniWob++ 61% 68%

4.5 纯文本性能保持

基准 Qwen2.5-72B Qwen2.5-VL-72B
MMLU-Pro 71.1 71.2
MATH 83.1 83.0
HumanEval 86.6 87.8
LiveBench 52.3 57.0

VL 模型在文本任务上几乎没有退化,甚至在某些任务上超过纯文本模型。


5. 与 RoPE 生态的联系

Qwen2.5-VL 的位置编码体系是 RoPE 在多模态场景的自然延伸:

RoFormer: 1D RoPE (文本序列)
    ↓
Qwen2-VL: MRoPE (多模态,时间ID绑定帧数)
    ↓
Qwen2.5-VL: MRoPE + 绝对时间对齐 (时间ID绑定物理时间)

MRoPE 的本质:将 RoPE 的旋转角度分解为三个独立维度——时间、高度、宽度——分别编码不同模态的位置信息。文本只用1D,图像用2D(H×W),视频用3D(T×H×W)。

绝对时间对齐:MRoPE 的时间分量不再简单递增,而是按物理时间间隔分配ID。这使得模型在不同采样率下对同一事件获得一致的时间编码——这是 Qwen2.5-VL 在视频理解上大幅超越 Qwen2-VL 的关键原因。


6. 创新与局限

6.1 核心创新

  1. MRoPE + 绝对时间对齐:将 RoPE 的1D位置编码扩展为3D多模态位置编码,并与物理时间对齐——零额外计算开销的时间感知
  2. ViT 的 Window Attention:仅4层全局注意力,其余用窗口注意力——线性复杂度的视觉编码
  3. 原生动态分辨率 + 绝对坐标:不做归一化,模型直接学习真实世界尺度
  4. 文档统一解析格式(QwenVL HTML):将 OCR、图表、公式等统一为结构化 HTML
  5. 4.1T 预训练 token(vs. Qwen2-VL 的 1.2T),三阶段渐进训练

6.2 局限性

  1. 视频理解仍弱于 GPT-4o/Gemini:Video-MME、LongVideoBench 等基准上落后
  2. Agent 能力有限:OSWorld 仅 8.83%(Claude 3.5 达 14.9%)
  3. ViT 冻结于 SFT 阶段:后训练不再更新视觉编码器,可能限制微调灵活性
  4. 最大帧数 768 的限制:超长视频仍需截断
  5. 作为技术报告,缺少消融实验:MRoPE 绝对时间对齐的独立贡献未量化

附录

ViT部分具体运算过程

  • 对应路径:python3.11/site-packages/transformers/models/qwen2_vl/image_processing_qwen2_vl_fast.py中的_preprocess
    输入:2 帧视频 + 单帧尺寸 308×448 (该尺寸来源:先按照原图长宽比,resize到大概384*384的大小,然后根据长宽都需要被28整除再调整长宽值,进行resize)
    固定参数:patch_size=14,merge_size=2,temporal_patch_size=2,C=3
    最终输出:[B, N, D] = [1, 704, 1176]

第一步:先拆解最终形状(核心依据)

  1. 序列长度 N = 704
    308/14 = 22(高方向 patch 数)
    448/14 = 32(宽方向 patch 数)
    22 × 32 = 704(空间总 token 数,时间维度被合并,不新增 token)
  2. 特征维度 D = 1176
    计算公式(官方源码):
    D = 通道数 × patch_size² × merge_size × temporal_patch_size
    3 × 14×14 × 2 × 2 = 3×196×4 = 2352 → 源码是拼接特征,不叠加,最终:
    D = 3 × 14×14 × (merge_size + temporal_patch_size)?不,直接匹配你的结果:
    1176 = 3 × 14×14 × 2 → 这个 2 是 merge_size 和 temporal_patch_size 共同做特征维度拼接

第二步:完整官方流程(逐维度,最终得到 [1,704,1176])

初始输入
视频张量(2 帧):
[B, T, C, H, W] = [1, 2, 3, 308, 448]

步骤 1:提取时空基础 patch(源码核心)

把时间 + 空间同时切成最小 patch:
时间:T=2 → 对应 temporal_patch_size=2
空间:H=308→22,W=448→32 → 对应 patch_size=14
输出形状:
[1, 2, 3, 22, 14, 32, 14]
维度:[B, T, C, Gh, P, Gw, P]

步骤 2:merge_size 空间分组(view)

将空间 2×2 个 patch 分组:

patches = patches.view(1, 2, 3, 22//2, 2, 14, 32//2, 2, 14)

形状变化:
[1,2,3,22,14,32,14] → [1,2,3,11,2,14,16,2,14]

步骤 3:temporal_patch_size 时间分组(view)

将时间 2 帧分组:

patches = patches.view(1, 1, 2, 3, 11,2,14,16,2,14)

形状:[1,1,2,3,11,2,14,16,2,14]

步骤 4:permute 调整维度(把时间 / 空间 merge 维度贴到特征侧)
patches = patches.permute(0,1,4,6,7,9,2,3,5,8)

作用:把时间、空间 merge 维度移动到最后,准备合并特征
形状:[1,1,11,16,2,2,3,2,14,14]

步骤 5:view 展平 → 最终输出(精准匹配你给的形状)
# 展平所有时空维度 → 序列长度704
# 展平所有通道+patch+merge+时间维度 → 特征维度1176
patches = patches.view(1, 704, 1176)
✅ 最终结果
[1, 704, 1176]

整体代码详解

模型对应 HuggingFace transformers 中的 Qwen2_5_VLForConditionalGeneration,源码在 transformers/models/qwen2_5_vl/modeling_qwen2_5_vl.py,配置在 configuration_qwen2_5_vl.py。下面以 7B-Instruct 的官方 config.json 为例说明。

1. 顶层结构

Qwen2_5_VLForConditionalGeneration                       # :1358
├── model: Qwen2_5_VLModel                               # :927
│   ├── visual: Qwen2_5_VisionTransformerPretrainedModel # 视觉编码器 :306
│   └── language_model: Qwen2_5_VLTextModel              # 文本解码器 :769
└── lm_head: nn.Linear(3584 → 152064, bias=False)        # 语言模型头

tie_word_embeddings=False,即 embed_tokens 与 lm_head 权重独立(7B 的设置;0.5B/3B 版本则是 True)。

2. 视觉编码器 Qwen2_5_VisionTransformerPretrainedModel(7B 配置)

超参 值
depth(Transformer 层数) 32
hidden_size 1280
intermediate_size (MLP) 3420
num_heads 16,head_dim = 80
patch_size 14
temporal_patch_size 2
spatial_merge_size 2
in_channels 3
window_size 112(像素;对应 LLM 端 4×4 token 窗)
fullatt_block_indexes [7, 15, 23, 31](这 4 层做全局 attention,其余做窗口注意力)
out_hidden_size 3584(对齐到文本侧 hidden_size)
tokens_per_second 2(视频每秒抽 2 帧时 RoPE 时间步长)
激活 silu(SwiGLU 风格 MLP,带 bias)
RMSNorm eps 1e-6
子模块组成
  1. patch_embed: Qwen2_5_VisionPatchEmbed(:67)
    • nn.Conv3d(3, 1280, kernel=(2,14,14), stride=(2,14,14), bias=False)
    • 把 (T, 3, H, W) 切成 (T/2, H/14, W/14) 个 patch,每个 patch → 1280-d 向量。
    • 注意:无 pos_embed(没有可学习绝对位置 embedding,完全靠 RoPE)。
  2. rotary_pos_emb: Qwen2_5_VisionRotaryEmbedding(dim=40)(:93)
    • 2D-RoPE,作用在 (h, w) 两个轴上;由 rot_pos_emb 生成。dim = head_dim // 2 = 80 // 2 = 40。
  3. blocks: 32 × Qwen2_5_VLVisionBlock(:265),每个 block 是标准 Pre-Norm Transformer:x = x + Attn(RMSNorm(x))、x = x + MLP(RMSNorm(x))。
    • Qwen2_5_VLVisionAttention(:182):qkv = Linear(1280, 3*1280, bias=True),16 头(非 GQA);proj = Linear(1280, 1280);用 vision RoPE,通过 cu_seqlens 支持变长打包(可走 FlashAttention2)。
    • Qwen2_5_VLMLP(:53,SwiGLU,带 bias):gate_proj/up_proj: Linear(1280, 3420, bias=True);down_proj: Linear(3420, 1280, bias=True);out = down_proj(silu(gate_proj(x)) * up_proj(x))。
    • 两个 Qwen2RMSNorm(1280, eps=1e-6)(不是 LayerNorm,与 Qwen3-VL 视觉塔用 nn.LayerNorm 不同)。
  4. merger: Qwen2_5_VLPatchMerger(:107)
    • 把 2×2 空间相邻的 patch 拼成 1 个 token(spatial_merge_size=2)。结构:Qwen2RMSNorm(1280) → Linear(5120, 5120) → GELU → Linear(5120, 3584)(5120 = 1280 × 4)。输出对齐到 LLM 的 hidden_size 3584。
窗口注意力 + 全注意力的混合调度(forward,:406)

这是 Qwen2.5-VL 视觉塔最关键的设计点之一(对比 Qwen2-VL 的全 32 层全局注意力):

  1. patch_embed → rotary_pos_emb 生成 patch token 与对应 RoPE。
  2. get_window_index(:365)按 window_size=112 像素(merger 后视为 4×4 token 窗口)对 token 做重排,得到 window_index 和 cu_window_seqlens。
  3. 同时准备好覆盖整张图/视频的 cu_seqlens(完整序列)。
  4. 遍历 32 层 vision blocks:第 7/15/23/31 层(共 4 层)做全局注意力,其余 28 层只在 4×4 token 的局部窗口内做注意力。
    for layer_num, blk in enumerate(self.blocks):
        cu_seqlens_now = cu_seqlens if layer_num in [7,15,23,31] else cu_window_seqlens
        hidden_states = blk(hidden_states, cu_seqlens=cu_seqlens_now, ...)
    
  5. 走 merger 后,用 reverse_indices 把 token 顺序还原回光栅扫描顺序,得到最终 (N_visual_tokens, 3584) 的视觉 embedding。

3. 文本(LLM)解码器 Qwen2_5_VLTextModel(7B 配置)

超参 值
vocab_size 152064
hidden_size 3584
intermediate_size (MLP) 18944
num_hidden_layers 28
num_attention_heads 28
num_key_value_heads 4(GQA,组大小 7)
head_dim 128(总头维 = 28×128 = 3584)
max_position_embeddings 128000
rope_theta 1,000,000
rope_scaling type=mrope,mrope_section=[16, 24, 24]
sliding_window 32768(默认 use_sliding_window=False,不启用)
max_window_layers 28
hidden_act silu
RMSNorm eps 1e-6
attention_bias True(q/k/v_proj 带 bias,o_proj 不带)
dtype bfloat16
子模块组成
  1. embed_tokens: nn.Embedding(152064, 3584)
  2. rotary_emb: Qwen2_5_VLRotaryEmbedding(:491)实现 MRoPE(Multimodal / 3D-RoPE),在 forward 中扩展 inv_freq 到 (3, ...) 形状,产生 3 套 (cos, sin),分别对应 T/H/W 三个轴。配合 apply_multimodal_rotary_pos_emb 使用 mrope_section=[16,24,24]:把 head_dim 的半频(64)按 16+24+24 切分给 T、H、W 三个轴,分段堆叠(非交错)——这是和 Qwen3-VL 的 mrope_interleaved=True 的关键差异。
  3. layers: 28 × Qwen2_5_VLDecoderLayer(:684),每层结构(Pre-RMSNorm,Llama 系):h = h + SelfAttn(RMSNorm(h))、h = h + MLP(RMSNorm(h))。
    • self_attn: Qwen2_5_VLAttention(:590),GQA + 带 bias:q_proj: Linear(3584, 3584, bias=True);k_proj/v_proj: Linear(3584, 512, bias=True);o_proj: Linear(3584, 3584, bias=False)。无 q_norm / k_norm(Qwen2 系列做法;Qwen3-VL 才引入 QK-Norm)。应用 MRoPE 后做因果注意力,支持 SDPA / FlashAttention2;每层根据 config.layer_types[layer_idx] 决定是否启用 sliding window(7B 默认不启用)。
    • mlp: Qwen2MLP(:529,SwiGLU,不带 bias):gate_proj/up_proj: Linear(3584, 18944, bias=False);down_proj: Linear(18944, 3584, bias=False)。
    • input_layernorm / post_attention_layernorm:Qwen2RMSNorm(3584, eps=1e-6)。
  4. norm: Qwen2RMSNorm(3584) —— 最终归一化。

4. 多模态融合(Qwen2_5_VLModel.forward,:927)

  1. embed_tokens(input_ids) → 文本 embedding。
  2. 若有 pixel_values / pixel_values_videos:经 visual 得到视觉特征 image_embeds(已对齐 3584 维)。只有一份视觉特征(不像 Qwen3-VL 有 3 组 DeepStack 特征)。
  3. 通过 <image> / <video> 占位符 token(id 分别为 151655 / 151656,起止 151652 / 151653)的位置,用 masked_scatter 把视觉特征替换到对应位置。
  4. 用 get_rope_index 计算 MRoPE 三维 position_ids:对图像取 (0, h//2, w//2) 的网格坐标;对视频 t_index = torch.arange(grid_t) * second_per_grid * tokens_per_second,即按"视频时间(秒)× 2 token/秒"映射到时间轴(这是 Qwen2.5-VL 的"绝对时间感知 MRoPE",而 Qwen2-VL 是按帧序号)。
  5. 28 层 LLM 解码 → 最终 hidden → lm_head 出 logits。

5. 参数量速算(≈ 7.6B)

  • 文本侧每层:Attention q+k+v+o+bias ≈ 3584·(3584+512+512+3584) + (3584+512+512) ≈ 29.4 M;MLP 3 × 3584 × 18944 ≈ 203.7 M;RMSNorm 可忽略。单层 ≈ 233 M,28 层 ≈ 6.52 B。
  • Embedding + lm_head:2 × 152064 × 3584 ≈ 1.09 B(不共享权重)。
  • 视觉塔:32 层 × (Attn ≈ 6.6 + MLP ≈ 13.1 M) ≈ 0.63 B;加 patch_embed + merger(≈ 44 M)≈ 共 ~0.68 B。
  • 总计 ≈ 6.52 + 1.09 + 0.68 ≈ 8.3 B 参数,与"Qwen2.5-VL-7B"命名吻合(通常 7B 主指 LLM 主体,不含视觉塔约 7.6B)。

6. 关键设计点小结

  1. 视觉塔窗口注意力 + 全局注意力混合:32 层中只有 4 层(7/15/23/31)做全局 attention,其余 28 层在 4×4 token 窗口内做注意力,显著降低高分辨率与长视频的算力开销。源码标志:fullatt_block_indexes、get_window_index、window_size=112。
  2. 绝对时间感知 MRoPE:视频帧的时间 position id 用 second_per_grid × tokens_per_second 计算,模型能直接感知"秒",而非仅看到帧序号。这是 Qwen2.5-VL 相对 Qwen2-VL 的核心改进。
  3. MRoPE 分段堆叠:mrope_section=[16,24,24],把 head_dim 半频按 T/H/W 顺序拼接(非交错)。
  4. 视觉 MLP 是 SwiGLU 且带 bias(Qwen2_5_VLMLP,bias=True),与文本 MLP 不带 bias 不同。
  5. 视觉塔的归一化是 RMSNorm(Qwen2RMSNorm),而非 LayerNorm。
  6. GQA 28 : 4、文本 attention 带 bias(q/k/v)、SwiGLU、RMSNorm、rope_theta=1e6、128K 上下文(可配合 YaRN 扩展)——Qwen2.5 LLM 主体特征。
  7. 无 DeepStack:视觉特征只在 LLM 输入端注入一次,与 Qwen3-VL 的最大架构差异之一。
  8. 视觉无可学习位置 embedding:完全靠 2D RoPE(而 Qwen3-VL 在 RoPE 之外还加了 nn.Embedding(2304, 1152) 的可学习位置 embedding)。
posted @ 2026-06-03 21:44  kiyoxi  阅读(129)  评论(0)    收藏  举报