#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Тест Alibaba Cloud DashScope qwen-vl-ocr на чертеже. Использование: python test_qwen_ocr.py """ import os import sys import base64 import json from pathlib import Path from openai import OpenAI # Загрузить ключ из .env (рядом со скриптом) env_path = Path(__file__).parent / ".env" API_KEY = None if env_path.exists(): for line in env_path.read_text().splitlines(): if line.startswith("DASHSCOPE_API_KEY="): API_KEY = line.split("=", 1)[1].strip() os.environ["DASHSCOPE_API_KEY"] = API_KEY break if not API_KEY: API_KEY = os.environ.get("DASHSCOPE_API_KEY") BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1" MODEL = "qwen-vl-ocr" def encode_image(image_path: Path) -> str: with open(image_path, "rb") as f: return base64.b64encode(f.read()).decode("utf-8") def test_ocr(image_path: Path): client = OpenAI(api_key=API_KEY, base_url=BASE_URL) b64 = encode_image(image_path) data_url = f"data:image/png;base64,{b64}" print(f"Отправляем {image_path.name} в qwen-vl-ocr...") print(f"Размер файла: {image_path.stat().st_size / 1024 / 1024:.1f} MB") response = client.chat.completions.create( model=MODEL, messages=[ { "role": "user", "content": [ { "type": "text", "text": ( "Распознай все текстовые элементы на этом чертеже. " "Для каждого текста укажи:\n" "- сам текст\n" "- координаты bbox (x1,y1,x2,y2)\n" "- confidence (если доступен)\n" "Ответь в формате JSON-массива." ), }, {"type": "image_url", "image_url": {"url": data_url}}, ], } ], temperature=0.1, max_tokens=2048, ) raw = response.choices[0].message.content print("\n=== ОТВЕТ МОДЕЛИ ===") print(raw[:2000]) print("=" * 50) # Сохранить результат out_path = image_path.parent / f"qwen_ocr_result_{image_path.stem}.json" with open(out_path, "w", encoding="utf-8") as f: f.write(raw) print(f"\n[OK] Сохранено: {out_path}") def describe_image(image_path: Path): """Просто описание того, что модель видит на чертеже.""" client = OpenAI(api_key=API_KEY, base_url=BASE_URL) b64 = encode_image(image_path) data_url = f"data:image/png;base64,{b64}" print(f"\nОтправляем {image_path.name} на описание...") response = client.chat.completions.create( model=MODEL, messages=[ { "role": "user", "content": [ { "type": "text", "text": ( "Опиши подробно, что ты видишь на этом изображении. " "Чертеж здания или что-то другое? Какие элементы видны? " "Размеры, текст, линии, оси — всё, что различимо." ), }, {"type": "image_url", "image_url": {"url": data_url}}, ], } ], temperature=0.3, max_tokens=1024, ) desc = response.choices[0].message.content print("\n=== ОПИСАНИЕ ===") print(desc) print("=" * 50) return desc def main(): if len(sys.argv) < 2: print("Usage: python test_qwen_ocr.py [--describe]") sys.exit(1) image_path = Path(sys.argv[1]) if not image_path.exists(): print(f"[ERR] Файл не найден: {image_path}") sys.exit(1) if "--describe" in sys.argv: describe_image(image_path) else: test_ocr(image_path) if __name__ == "__main__": main()