🧠 Diagram2graph: تنظیم دقیق یک مدل زبان بینایی برای استخراج نمودارهای دانش از نمودارها

با استفاده از QWEN2.5-VL + PEFT + NEO4J
تنظیم شده توسط محمد صفوان | راه حل های Zackriya
🚀 tl ؛ دکتر
تبدیل تصاویر نمودارهای جریان یا نمودارهای فرآیند به طور مستقیم JSON سازگار با NEO4J با استفاده از یک تنظیم دقیق مدل زبان بینایی (VLM). ما با کلود 3.5 شروع کردیم ، اما تنظیم دقیق QWEN2.5-VL-3B مدل با استفاده از Peft (Lora) و Got +23 ٪ بهبود در تشخیص لبهبشر
🧩 مشکل
ما غالباً نمودارهای فنی ، نمودارهای نمودار و نمودارهای مسدود کننده در PDF ، تخته های سفید یا اسناد اسکن شده پیدا می کنیم. آنها حاوی منطق و روابط ارزشمند هستند ، اما آنها قابل پرسش یا استفاده نیستند مگر اینکه به صورت دستی استخراج شوند.
آیا می توانیم این استخراج نمودار به نمودار را خودکار کنیم؟
این چیزی است که نمودار انجام می دهد.
در این پست ، ما نشان می دهیم که چگونه می توان از یک مدل زبان بینایی تنظیم شده (VLM) برای تبدیل نمودارهای فنی و نمودارها به JSON ساختاری استفاده کرد. این خروجی می تواند به طور مستقیم با NEO4J یا سایر سیستم عامل های نمودار دانش مورد استفاده قرار گیرد و سیستم های AI را قادر می سازد تا اطلاعات بصری را استدلال کنند.
🔍 آنچه ما ساختیم
یک تنظیم دقیق مدل زبان بینایی که:
- تصویری از نمودار را می پذیرد
- عصاره گرهبا لبهوت ابرداده
- خروجی های ساختاری json
- سازگار با نئو 4J برای پرس و جو نمودار
🔗 منابع
⚙ معماری در یک نگاه
+-------------------+ +---------------------------+
| Diagram Image +-------> | Fine-Tuned VLM (Qwen2.5) |
+-------------------+ +-------------+-------------+
|
v
+------------------------------+
| JSON (Nodes + Edges + Meta) |
+------------------------------+
|
v
+------------------------+
| Neo4J Integration |
+------------------------+
🤖 چرا از GPT-4 یا کلود استفاده نمی کنیم؟
آنها کار می کنند – اما آنها:
- وابسته به API (نگرانی های مربوط به حریم خصوصی)
- عمومی (مستعد توهم)
- گران (توکن + محاسبه)
ما یک مدل زبان بینایی خاص کار (QWEN2.5-VL 3B) را برای درک نمودار و استخراج نمودار دانش تنظیم کردیم.
پشته فنی
- مدل:
Qwen2.5-VL-3B
- تنظیم دقیق: Peft (لورا) ،
f32
، صاعقه پیتورچ - مجموعه داده ها: 218 تصاویر نمودار برچسب
- Backend: Fastapi + Neo4J (از طریق Cypher)
- استنباط: بغل کردن ترانسفورماتورهای صورت
- Frontend: NextJS (WIP)
- استقرار: Kaggle + Lightning.ai
📊 نتایج
وظیفه | مدل پایه (کلود 3.5) | QWEN2.5-VL-3B (تنظیم دقیق) |
---|---|---|
تشخیص گره | 74.9 ٪ F1 | 89.1 ٪ F1 (+14.2 ٪) |
تشخیص لبه | 46.05 ٪ F1 | 69.45 ٪ F1 (+23.4 ٪) |
🧠 جزئیات آموزش
پیکربندی | ارزش |
---|---|
دوره | 10 |
تصاویر | 200 (برچسب دستی) |
اندازه دسته | 2 |
روش | لورا (پفت) |
دقت | BF16 |
GPU | L40S (48 گیگابایت VRAM) |
متریک ارزیابی | ویرایش فاصله + F1 |
🧪 خودتان آن را امتحان کنید
نوت بوک COLAB (فقط استنتاج):
👉 نوت بوک باز کنید
pip install -q transformers accelerate qwen-vl-utils[decord]==0.0.8
قطعه استنباط:
import torch
from transformers import Qwen2_5_VLForConditionalGeneration, Qwen2_5_VLProcessor
MODEL_ID="zackriya/diagram2graph-adapters"
MAX_PIXELS = 1280 * 28 * 28
MIN_PIXELS = 256 * 28 * 28
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
MODEL_ID,
device_map="auto",
torch_dtype=torch.bfloat16
)
processor = Qwen2_5_VLProcessor.from_pretrained(
MODEL_ID,
min_pixels=MIN_PIXELS,
max_pixels=MAX_PIXELS
)
from qwen_vl_utils import process_vision_info
SYSTEM_MESSAGE = """You are a Vision Language Model specialized in extracting structured data from visual representations of process and flow diagrams.
Your task is to analyze the provided image of a diagram and extract the relevant information into a well-structured JSON format.
The diagram includes details such as nodes and edges. each of them have their own attributes.
Focus on identifying key data fields and ensuring the output adheres to the requested JSON structure.
Provide only the JSON output based on the extracted information. Avoid additional explanations or comments."""
def run_inference(image):
"""
Inference with the Model
"""
messages= [
{
"role": "system",
"content": [{"type": "text", "text": SYSTEM_MESSAGE}],
},
{
"role": "user",
"content": [
{
"type": "image",
# this image is handled by qwen_vl_utils's process_visio_Info so no need to worry about pil image or path
"image": image,
},
{
"type": "text",
"text": "Extract data in JSON format, Only give the JSON",
},
],
},
]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, _ = process_vision_info(messages)
inputs = processor(
text=[text],
images=image_inputs,
return_tensors="pt",
)
inputs = inputs.to('cuda')
generated_ids = model.generate(**inputs, max_new_tokens=1024)
generated_ids_trimmed = [
out_ids[len(in_ids):]
for in_ids, out_ids
in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed,
skip_special_tokens=True,
clean_up_tokenization_spaces=False
)
return output_text
🧱 بعدی چیست؟
- [ ] ادغام Neo4J از طریق Cypher Parser
- [ ] مدل کمکی برای دستگاه های لبه
- [ ] Ollama / Python SDK برای افزونه و بازی
- [ ] Frontend برای بارگذاری + نمایش داده شدگان طبیعی
🙌 ممنون
فریاد به:
- وابسته به انسان شناسی برای Claude API
- بغل کردن صورت برای مادون قرمز منبع باز
- Lightning.ai برای GPU
- رحم برای الهام بخش داده
thoughts افکار نهایی
VLM های خاص وظیفه مانند نمودار یک زمین متوسط عالی هستند:
کوچکتر ، سریعتر ، ارزان تر و به طرز شگفت آور دقیق.
به جای اینکه منتظر مدل های بنیادی باشید تا “بهتر شوند” ، بیایید آنها را آموزش دهیم وظایف مابشر
مدل را تنظیم کنید. صاحب گردش کار باشید.
اگر این مفید بود ، به repo github ⭐ ⭐ ⭐ ⭐ و به روزرسانی ها را دنبال کنید!
اگر می خواهید در زمینه ساخت محصولات AI همکاری کنید – با ما تماس بگیرید – با ما تماس بگیرید