VLM在智驾caption任务上的lora微调

摘要

        caption任务是根据当前车辆的拍摄的道路场景前视图,说明路况,给出驾驶建议。此次实验,采用了多教师知识蒸馏+LoRA微调+GRPO训练。微调的basemodel是Qwen2.5-VL-3B-Instruct。选用的三个教师模型分别是MiniCPM-V-2_6、gemma-3-27b-it和InternVL2-8B。在测试集上的评测结果显示在bleu、rouge和语义相似度上明显超越了未训练的Qwen2.5-VL-3B和Qwen2.5-VL-7B。

环境依赖

        选择阿里提供的swift微调框架,其对于LoRA微调和GRPO训练封装的很好。使用文档地址:SWIFT安装 — swift 3.10.0.dev0 文档

大模型部署框架选择vLLM。

数据集构建

        数据集的构建策略:三个教师模型根据提供的车辆前视图和我们自定义的prompt生成caption。所以每张图片都将会有三个候选caption,利用我们定义的筛选策略从三个caption中筛选出最合理的caption作为数据集的label。

部署教师模型

        MiniCPM-V-2_6和gemma-3-27b-it部署使用的vllm版本为0.10.1,InternVL2-8B选择版本为0.7.3。部署指令如下:

python -m vllm.entrypoints.openai.api_server \
  --host 0.0.0.0 \
  --port 8045 \
  --model /gemini/platform/public/HuggingFace/MiniCPM-V-2_6 \
  --tensor-parallel-size 2 \
  --trust-remote-code

自定义prompt

"""你是一款先进的视觉处理 AI,负责分析车辆前方图像以评估驾驶场景。请仔细检查输入图像,并执行以下任务:
#### 环境背景:
- 时间(黎明/白天/黄昏/夜晚)
- 天气状况(晴朗/雨天/有雾/下雪)
- 场景类型(城市/乡村/高速公路/停车场)
#### 道路与交通分析:
- 路面状况和布局
- 交通密度和车辆分布
- 特殊基础设施(路口/环形交叉/人行横道)
#### 关键元素识别:
- 可见物体的独特特征(车辆、行人、标志)
- 空间关系(例如:“左前方有3辆车接近”,“右侧有行人穿越”)
- 交通信号灯/标志的状态及其位置参考
#### 驾驶建议:
- 当前驾驶建议
- 注意事项
- 后续驾驶建议
"""

筛选机制

筛选的依据有自洽性评估教师间共识评估置信度。将每个部分进行加权求和,得到每个候选caption的评分,选择评分最高的caption作为数据集的label。

自洽性评估

自洽性评估用来评估caption中是否存在语义矛盾。我们选择用大语言模型Qwen2.5-7B作为“评估官”。每次只输入一个候选caption。定义的prompt如下:

prompt = """
你是一个自动驾驶系统中的语义一致性评估专家。

请严格从以下维度判断以下驾驶场景描述是否存在**“语义矛盾”**(即逻辑冲突、事实冲突、物理不可能),而不是评价其表达是否清晰或合理。

### 评价维度(仅判断是否存在矛盾)

1. **时间与天气条件是否矛盾**
   - 如:夜间有灯光但需天能见度极低 → 是否可共存?
   - 示例:白天偏光线较弱 + 可能接近黄昏或阴天 → 合理;若为 “晴天” 却说 “能见度极低” → 矛盾。

2. **交通信号灯状态与驾驶建议是否一致**
   - 如:红灯亮起却建议通行 → 明显矛盾
   - 若图像中无法确定信号灯状态,应视为 “未知”,不构成矛盾。

3. **限速标志与道路类型是否冲突**
   - 如:城市道路限速≥60km/h → 不符合常规(一般≤60km/h)→ 可能为矛盾
   - 若标注 “50 km/h” 且在城市道路 → 合理

4. **车辆位置与道路标识是否相符**
   - 如:压线行驶却声称在车道内 → 矛盾
   - 若 “前方有白色轿车,右侧有白色车辆” → 无矛盾(位置描述独立)

5. **行人/障碍物描述是否与环境一致**
   - 如:有斑马线却无需注意行人 → 矛盾
   - 若 “有行人” 但未提及斑马线 → 不构成矛盾(可能人行横道未显示)

6. **驾驶建议是否与观察到的信息冲突**
   - 如:提示 “减速慢行” 但未提及任何风险 → 可接受(预防性建议)
   - 若 “保持当前车速” 但前方有路口 → 可能为矛盾(应提醒注意)

### △ 核心原则

- 仅判断“是否存在语义矛盾”,不要评价语言风格、表达清晰度或信息完整性。
- 不要因为“表述模糊”或“信息不足”而扣分。
- 若多个信息点相互支持,则视为一致。
- “不确定” ≠ “矛盾” —— 例如“无法确定信号灯状态”是正常情况。

### 📊 评分标准(基于矛盾严重性)

- **10分**:完全无矛盾,所有信息可共存且符合物理规律。
- **8-9分**:基本无矛盾,仅有轻微表达不严谨,不影响整体逻辑。
- **6-7分**:存在局部矛盾或模棱两可点。
- **4-5分**:明显违反常识或物理规律。
- **1-3分**:多处严重矛盾,违背物理规律或交通法规,可信度极低。
- **0分**:完全虚构、自相矛盾或荒谬。

### 📥 输出格式(仅 JSON,无其他文字)

{
  "score": 0-10,
  "reason": "简要说明评分依据,不超过80字"
}

# 【描述】:
"""

最后从模型输出中提取出评估得分。

教师间共识评估

        评估依据是衡量不同教师生成的标签是否“观点一致”,多个教师达成一致的标签,更可能是正确的。

        实现很简单,使用sentence_transformer提供的paraphrase-multilingual-MiniLM-L12-v2对caption编码,计算两两caption间的余弦相似度,对于每一条候选caption,计算它与其他所有样本的平均相似度。从而得到每个候选caption的相似度评分。

置信度

置信度也可以作为一个评估依据,研究表明Confidence Is All You Need: Few-Shot RL Fine-Tuning of Language Models,在相同条件下,高置信度生成结果更可能语法正确、语义连贯。

       置信度是在教师模型生成caption就计算得到的,方法是计算每个token的平均对数概率,再将其指数运算,就得到了置信度。

合并评估得分

        将所有评分加权求和:

alpha = 0.5  # 自治性权重
beta = 0.3  # 教师共识权重
gamma = 0.2  # 教师置信度权重(可选)

final_score_ge = alpha * ge_SCE["score"]/10.0 + beta * consensus_list[0] + gamma * ge_label["confidence"]
final_score_mi = alpha * mi_SCE["score"]/10.0 + beta * consensus_list[1] + gamma * mi_label["confidence"]
final_score_int = alpha * int_SCE["score"]/10.0 + beta * consensus_list[2] + gamma * int_label["confidence"]

从而根据最终的得分选择最好的候选caption作为数据集label。

LoRA微调

使用阿里的swift框架进行LoRA微调,冻结vit部分,target_module选择'all-linear'。训练集数据量8986。具体微调指令如下:

nnodes=1
nproc_per_node=2

CUDA_VISIBLE_DEVICES=0,1 \
NNODES=$nnodes \
NODE_RANK=0 \
OMP_NUM_THREADS=12 \
NPROC_PER_NODE=$nproc_per_node \
swift sft \
  --model /gemini/platform/public/HuggingFace/Qwen2.5-VL-3B-Instruct \
  --dataset /gemini/user/private/ms_swift/ms-swift-main/data_train/train.jsonl \
  --split_dataset_ratio 0.005 \
  --train_type lora \
  --freeze_vit true \
  --torch_dtype bfloat16 \
  --num_train_epochs 1 \
  --per_device_train_batch_size 1 \
  --per_device_eval_batch_size 1 \
  --learning_rate 1e-4 \
  --lora_rank 16 \
  --lora_alpha 32 \
  --gradient_accumulation_steps 4 \
  --eval_steps 200 \
  --save_steps 100 \
  --save_total_limit 2 \
  --logging_steps 5 \
  --max_length 12084 \
  --output_dir output \
  --warmup_ratio 0.05 \
  --dataloader_num_workers 4 \
  --dataset_num_proc 4 \
  --deepspeed zero2

GRPO训练

        GRPO训练在于奖励函数的设计,这里我实验了三种奖励函数,分别是以语义相似度为奖励值的奖励函数,以bleu指标为奖励值的奖励函数,以语义相似度、bleu和rouge的和为奖励值的奖励函数。以学习率为1e-4LoRA微调的模型进行进一步的GRPO训练,结果三种方式的评测结果均不如训练前。看了一些经验帖,可能是因为GRPO对数据集的分布和质量要求高,而我的数据集是教师模型生成的,质量并不高。

下面是训练的loss变化和reward的变化:如果有大佬知道是什么原因请评论解答一下,非常感谢!

评测结果

LORA微调过程中,我尝试了不同学习率,包括1e-3、1e-4、1e-5、5e-5。

格式化输出能力

按照prompt的要求,应当能够从推理结果中提取出所需的信息。以统一的正则表达式提取每个部分的信息情况下,可以看到微调后的模型更能按照prompt的要求输出信息。下面是不同学习率、未经微调的qwen2.5-vl-3b和qwen2.5-vl-7b模型的对比表:

格式化输出对比表
模型1e-31e-41e-5qwen2.5-vl-3bqwen2.5-vl-7b
完整性时间100%100%10.9%12.1%100%
天气状况100%100%10.9%12.1%100%
场景类型100%100%11%12.1%100%
路面状况和布局100%100%10.9%12.1%99.8%
交通密度和车辆分布100%100%10.8%12.1%99.8%
特殊基础设施100%100%10.9%12.1%100%
可见物体的独特特征93.3%98.2%10.9%12%99.8%
空间关系100%100%10.8%11.8%100%
交通信号灯灯/标志...96.4%99%1.1%0.3%0.5%
当前驾驶建议100%100%10.9%12.1%100%
注意事项100%100%10.9%12.1%100%
后续驾驶建议100%100%10.9%12.1%100%
总体99.14%99.77%10.08%11.08%91.66%

caption指标对比

        我选择BLEU、ROUGE和基于sentence_transfomers的余弦语义相似度作为与label评测的指标。测试集共1000条数据。

BLEU
模型1e-31e-41e-5qwen2.5-vl-3bqwen2.5-vl-7b
bleu时间0.230.22--0.1
天气状况0.220.20--0.02
场景类型0.170.17--0.03
路面状况和布局0.260.24--0.05
交通密度和车辆分布0.320.32--0.04
特殊基础设施0.140.13--0.04
可见物体的独特特征0.230.22--0.02
空间关系0.200.19--0.05
交通信号灯灯/标志...0.190.19--0
当前驾驶建议0.420.39--0.08
注意事项0.210.20--0.03
后续驾驶建议0.090.09--0
整句0.450.440.020.020.18
ROUGE
模型avg_rouge1avg_rouge2avg_rougeL
1e-30.12990.03320.1267
1e-40.11610.02810.1155
1e-50.04310.00370.0424
qwen2.5-vl-3b0.0450.00670.0446
qwen2.5-vl-7b0.11620.02820.1154
语义相似度
模型1e-31e-41e-5qwen2.5-vl-3bqwen2.5-vl-7b
similarity时间0.89550.8887--0.8172
天气状况0.70020.6990--0.6123
场景类型0.82730.8256--0.6871
路面状况和布局0.85900.8514--0.7690
交通密度和车辆分布0.87630.8719--0.7504
特殊基础设施0.81220.8076--0.6341
可见物体的独特特征0.72790.7412--0.6103
空间关系0.77990.7719--0.6915
交通信号灯灯/标志...0.74520.7587--0.1543
当前驾驶建议0.88140.8755--0.7482
注意事项0.81860.8119--0.6938
后续驾驶建议0.79590.7921--0.6979
整句0.94650.94470.71500.71670.9082

可视化结果

改进建议

1.教师模型可以改用更新更强的模型。

2.每个教师模型只输出了一个caption,使得评估时的候选caption数量太少,可以一个教师生成多个候选caption。

3.自洽评估是一次只输入一个候选caption,没有对比,可以改为一次输入所有候选caption得到相对评分。

### 使用VLM模型生成图像字幕 为了实现基于视觉语言模型(VLM)的图像字幕生成功能,通常会遵循特定的工作流程和技术细节。此过程涉及预处理阶段、模型架构的选择以及具体的训练策略。 #### 预处理与输入准备 对于输入图像,分辨率被设定为480x480像素大小[^1]。这样的尺寸既能够保留足够的图像特征用于分析,又不会因为过高的分辨率而增加不必要的计算负担。 #### 模型架构 X2-VLM采用了左到右掩码语言建模(MLM),这使得模型能够在给定部分上下文的情况下预测缺失的文字序列。具体而言,在解码过程中应用了文本模块和融合模块来构建左至右自注意力机制下的编码器-解码器框架。这种方法有助于提高生成质量并降低微调期间可能出现的偏差。 #### 解码策略 通过引入专门的技术手段以减少MLM生成中的微调差异,从而确保最终输出更加流畅自然。这意味着即使是在未见过的数据集上也能保持较高的泛化能力和稳定性。 #### 性能评估 在Karpathy测试分割上的表现证明了X2-VLM不仅能在跨模式理解任务中表现出色,而且在图像字幕生成方面也达到了顶尖水平。例如,在BLEU-4指标下超过了专门为这一目的设计的一些先进方案如BLIP和SimVLM;而在CIDEr得分上同样取得了优异的成绩。 下面是一个简单的Python代码片段展示如何使用此类模型: ```python from transformers import VlmProcessor, X2VLMMForConditionalGeneration processor = VlmProcessor.from_pretrained('model_name') model = X2VLMMForConditionalGeneration.from_pretrained('model_name') image_path = "example_image.jpg" with open(image_path, 'rb') as f: image_bytes = f.read() inputs = processor(images=image_bytes, return_tensors="pt") generated_ids = model.generate(**inputs) caption = processor.decode(generated_ids[0], skip_special_tokens=True) print(f"Generated caption: {caption}") ``` 这段代码展示了加载预训练好的处理器和模型实例,并读取一张图片文件作为输入。接着将图像转换成适合喂入神经网络的形式并通过`generate()`函数获得对应的描述文字。最后一步则是把得到的结果转化为人类可读形式打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值