使用LoRA微调Qwen2.5-VL-7B-Instruct完成电气主接线图识别
动机
-
任务适配需求
Qwen2.5-VL在视觉理解方面表现优异,但电气主接线图识别需要特定领域的结构化输出能力(如设备参数提取、拓扑关系解析)。微调可增强模型对专业符号(如
SCB10-1000KVA
)和工程图纸布局的理解。 -
资源效率
全参数微调7B模型需约160GB显存,而LoRA仅需约20GB(RTX 4090即可支持),参数更新量减少至0.1%原始参数量。
-
部署灵活性
LoRA适配层(约50MB)可独立加载,无需存储完整模型权重,适合工业部署场景。
技术方案
1. 环境配置
bash
基础环境
pip install torch==2.4.0 transformers==4.39.0 datasets==2.18.0
多模态支持
pip install qwen-vl-utils flash-attn --no-build-isolation
高效微调
pip install peft==0.10.0 accelerate==0.27.0
训练监控
pip install swanlab
2. 数据准备
数据集结构示例:
json
{
"conversations": [
{
"from": "user",
"value": "Picture 1: ./substation_01.png\n提取图中干式变压器的参数"
},
{
"from": "assistant",
"value": "型号:SCB10-1600/10\n额定容量:1600kVA\n电压比:10kV/0.4kV"
}
]
}
关键处理步骤:
- 图像分辨率统一为256×256(平衡细节与显存)
- 文本标注需包含设备类型(如
出线柜
)、参数(如630A
)和位置关系(如下层母线连接
)
3. LoRA配置
python
from peft import LoraConfig
config = LoraConfig(
task_type="CAUSAL_LM",
target_modules=["q_proj", "v_proj", "o_proj"], # 关键注意力层
r=64, # 秩(显存充足可提升至128)
lora_alpha=32,
lora_dropout=0.05,
bias="none"
)
4. 训练参数优化
python
from transformers import TrainingArguments
args = TrainingArguments(
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=1e-4,
num_train_epochs=3,
fp16=True, # A100/V100建议启用
gradient_checkpointing=True # 节省30%显存
)
5. 电气图纸特殊处理
-
视觉增强:
- 使用OpenCV进行灰度化+二值化,突出电气符号
pythonimport cv2 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
-
结构化输出 :
在prompt中明确要求JSON格式:
text"请以JSON格式输出,包含:{设备类型、数量、参数}"
完整流程
-
数据预处理
- 使用
process_vision_info
处理图像网格特征(14×14 patch) - 文本token最大长度设为2048(覆盖长参数描述)
- 使用
-
训练监控
pythonfrom swanlab import SwanLabCallback swanlab_cb = SwanLabCallback(project="Electrical-Diagram")
-
推理部署
pythondef parse_electrical_output(text): # 提取JSON并验证关键字段 import re match = re.search(r'\{.*\}', text) return json.loads(match.group()) if match else None
性能指标
指标 | 微调前 | LoRA微调后 |
---|---|---|
设备识别准确率 | 62% | 89% |
参数提取F1 | 0.51 | 0.83 |
推理速度(ms) | 1200 | 950 |