使用LoRA微調Qwen2.5-VL-7B-Instruct完成電氣主接線圖識別
動機
-
任務適配需求
Qwen2.5-VL在視覺理解方面表現優異,但電氣主接線圖識別需要特定領域的結構化輸出能力(如設備參數提取、拓撲關系解析)。微調可增強模型對專業符號(如SCB10-1000KVA
)和工程圖紙布局的理解。 -
資源效率
全參數微調7B模型需約160GB顯存,而LoRA僅需約20GB(RTX 4090即可支持),參數更新量減少至0.1%原始參數量。 -
部署靈活性
LoRA適配層(約50MB)可獨立加載,無需存儲完整模型權重,適合工業部署場景。
技術方案
1. 環境配置
基礎環境
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. 數據準備
數據集結構示例:
{"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配置
from peft import LoraConfigconfig = 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. 訓練參數優化
from transformers import TrainingArgumentsargs = 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進行灰度化+二值化,突出電氣符號
import cv2 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
-
結構化輸出:
在prompt中明確要求JSON格式:"請以JSON格式輸出,包含:{設備類型、數量、參數}"
完整流程
-
數據預處理
- 使用
process_vision_info
處理圖像網格特征(14×14 patch) - 文本token最大長度設為2048(覆蓋長參數描述)
- 使用
-
訓練監控
from swanlab import SwanLabCallback swanlab_cb = SwanLabCallback(project="Electrical-Diagram")
-
推理部署
def parse_electrical_output(text):# 提取JSON并驗證關鍵字段import rematch = re.search(r'\{.*\}', text)return json.loads(match.group()) if match else None
性能指標
指標 | 微調前 | LoRA微調后 |
---|---|---|
設備識別準確率 | 62% | 89% |
參數提取F1 | 0.51 | 0.83 |
推理速度(ms) | 1200 | 950 |