Qwen2.5-VL-7B模型低秩适配LoRA微调方法应用---连载8
1、概述
大模型Qwen2.5-VL-7B可看作是 “通用学霸”,但不是你的 “专属员工”。通过微调技术把通用能力,变成对你任务精准好用的能力。
Qwen-2.5 VL 是 多模态大模型(Vision-Language Model),它的本质是 文本生成模型,但可以处理图像输入。它既不是传统意义上只做分类或检测的模型,也不是只用图像训练的模型。这里的输入指的是:
输入:
- 文本输入(像普通语言模型)
- 图像输入(图像嵌入和文本结合)
输出:主要是文本,不是边界框或标签列表(除非通过文本描述形式训练或提示)。
2、为什么要微调
1)开源大模型(Qwen、Llama、GPT 等)是海量数据训出来的:具有懂天文地理、会聊天、能看图说话和也懂一点缺陷、工业、检测。但不懂特定领域的具体场景:具有不懂你工厂里的产品长什么样、不懂你要的缺陷术语、不懂你要的报告格式和不懂你产品的合格标准。
2)大模型回答太随意,微调让它 “听话、守规矩”。原生大模型经常具有:回答啰嗦、喜欢瞎编(幻觉)、格式不统一和说话风格不专业。通过微调后可以做到:只输出你要的关键词如划痕、面积2mm、轻微;严格按格式如缺陷类型:xx 位置:xx 等级:xx;不废话、不编造、不乱答。这就是对齐你的业务规则,必须微调。
3)大模型没见过你的数据,微调让它 “认识你的东西”,比如:你的产品是特殊铝导杆、特殊零件;缺陷是细微裂纹、氧化斑点;背景是你工厂的特定环境、光照、角度。开源模型根本没见过这些,直接用准确率会非常低。微调让模型专门学习你这批图像 + 标注,识别精度会大幅提升。
4)不微调也能用,但效果差、不稳定、不可控。你可以不微调,直接用 Qwen2.5-VL 看图说话,但会出现:同样缺陷,有时说有、有时说无;描述忽长忽短,无法接入自动化系统;对小缺陷、模糊缺陷识别很差;回答不可控,没法落地成产品。想真正落地、稳定使用,微调几乎是必须的。
5)为什么不重新训一个新模型?从头训一个视觉大模型:要几千万数据 + N 张 A100 + 几个月 ,普通人不可能做到。微调(LoRA):几百张图 + 一张 3080 + 几小时 → 效果够用、成本极低。所以微调是性价比最高、唯一可行的方案。
6)放到你的场景(工业视觉缺陷检测)为什么要微调 Qwen2.5-VL?让模型精准识别你产品的缺陷;让模型按检测标准输出结构化结果;减少幻觉,不瞎报、不漏报;让输出能直接进你的系统、生成报表;在你的场景下,精度从 60% → 90%+。
大模型的微调流程如下图所示:

3、主流微调方法
选 Qwen2.5-VL-7B-Instruct 做工业缺陷检测微调,不是随便选,而是性能、硬件、场景、成本、稳定性 5 个维度最匹配你(RTX4090+ 工业视觉)的最优解。主流的微调方法包括:
1)Full Fine-tuning(全参数微调):把整个大模型所有参数都重新训练;缺点是极吃显存,RTX4090 都不一定够;基本不推荐普通人用。
2)LoRA(最常用、最实用):只训练模型里的 “小旁路”,主模型不动;训练文件很小,速度快;普通人、个人玩家首选。
3)QLoRA(低比特 LoRA,显存杀手救星):把模型量化到 4bit / 8bit;显存占用直接砍半甚至更多;效果几乎不下降。
这里重点介绍LoRA微调方法:LoRA = Low-Rank Adaptation,低秩适配,核心思想:不改动大模型本身,只给模型加两条 tiny 小支路训练,训练完把小支路权重合并进原模型即可。工作原理如下:
1)LoRA 微调是在模型的注意力层插两个小矩阵。原模型的层是这样做矩阵乘法:h = W * x
LoRA 给它加一条旁路:h = W * x + BA * x。
其中:A:小矩阵,维度 (d, r);B:小矩阵,维度 (r, d);r 非常小,一般 4、8、16、64
所以 BA 是一个 “低秩矩阵”,用来表示微调带来的微小变化。
2)训练时只训练 A、B,原权重 W 冻住不动。原模型 W 完全不参与训练,不占梯度显存;只训练 A、B 两个小矩阵;参数数量可能只有原模型的 0.01%~0.1%。这就是 LoRA 省显存、速度快的根本原因。
3)推理时可以把 BA 合并进 W。训练完后:W_new = W + BA。就变回正常模型结构,推理速度完全不变慢。
3、微调环境配置
1)创建虚拟环境:conda create -n qwenvl python=3.12
激活虚拟环境:conda activate qwenvl
2)安装 PyTorch(显卡专用)
pip install torch==2.4.0 torchvision==0.19.0 --index-url https://download.pytorch.org/whl/cu121
3)安装核心依赖
pip install transformers datasets peft bitsandbytes accelerate pillow qwen-vl-utils sentencepiece protobuf
4、制作自己的数据集
Qwen-2.5 VL 的训练数据包括:
文本-文本对(纯语言任务):类似 GPT 风格的对话或问答
图文对(Vision-Language):每张图像配一个描述文本(caption),数据量巨大,涵盖各种场景
模型学会“看图说话”,把图像信息转化为自然语言
多模态指令数据(部分增强):给出图像+指令,让模型生成符合指令的文本
所以:Qwen-2.5 VL 并不是“只用标注图像训练”的模型,而是 文本生成为核心 + 图文对辅助 的多模态模型。
如何对 LabelImage 数据的微调进行处理?
LabelImage 标注生成的是边界框+类别,属于检测任务。Qwen-2.5 VL 本身不直接输出 bounding box 回归结果。可以通过把边界框信息转换成文本描述,训练模型生成类似描述:
"There is a cat at coordinates xmin=50, ymin=60, xmax=200, ymax=300"
把 LabelImage 标注的边界框数据(YOLO 或 Pascal VOC 格式)转换成 Qwen-2.5 VL 可以训练的图文对(JSON 格式,每条包含 image_path + caption),这样就可以直接用于微调。针对xml标注的文件转换代码如下:
import os
import json
import xml.etree.ElementTree as ET
image_dir = "dataset/images"
label_dir = "dataset/labels"
output_file = "qwen_dataset_voc.json"
images = [f for f in os.listdir(image_dir) if f.lower().endswith(('.jpg', '.png'))]
data = []
for img_name in images:
img_path = os.path.join(image_dir, img_name)
xml_path = os.path.join(label_dir, os.path.splitext(img_name)[0] + ".xml")
captions = []
if os.path.exists(xml_path):
tree = ET.parse(xml_path)
root = tree.getroot()
for obj in root.findall("object"):
class_name = obj.find("name").text
bndbox = obj.find("bndbox")
xmin = bndbox.find("xmin").text
ymin = bndbox.find("ymin").text
xmax = bndbox.find("xmax").text
ymax = bndbox.find("ymax").text
caption = f"There is a {class_name} at coordinates xmin={xmin}, ymin={ymin}, xmax={xmax}, ymax={ymax}"
captions.append(caption)
if captions:
data.append({
"image_path": img_path.replace("\\", "/"),
"caption": "; ".join(captions)
})
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"已生成 {len(data)} 条训练样本到 {output_file}")
目录结构如下:

(未完待续)
更多推荐
所有评论(0)