Разработка систем анализа изображений на основе VLM
Vision-Language Models — это архитектура, где визуальный энкодер (ViT, CLIP) соединяется с языковой моделью (LLaMA, Mistral, Qwen). Результат: модель понимает изображение и отвечает на вопросы о нём на естественном языке. GPT-4o, Claude Sonnet, LLaVA, Qwen-VL — это VLM.
Разрыв между «задать вопрос GPT-4o о картинке» и «production VLM-пайплайн» огромный. API стоит дорого при масштабе, latency 2–5 секунд неприемлема для real-time, данные уходят к провайдеру.
Локальные VLM: развёртывание на своём железе
from transformers import AutoProcessor, AutoModelForVision2Seq
import torch
from PIL import Image
import numpy as np
class LocalVLMAnalyzer:
def __init__(self, model_name: str = 'Qwen/Qwen2-VL-7B-Instruct'):
"""
Qwen2-VL-7B: отличный баланс качества и скорости.
На A100 40GB: ~0.8 сек на изображение.
LLaVA-Next-34B: лучше, но нужна H100 или несколько GPU.
"""
self.processor = AutoProcessor.from_pretrained(model_name)
self.model = AutoModelForVision2Seq.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
attn_implementation='flash_attention_2',
device_map='auto'
)
@torch.no_grad()
def analyze(self, image: np.ndarray, question: str,
max_tokens: int = 256) -> str:
pil_image = Image.fromarray(image)
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": pil_image},
{"type": "text", "text": question}
]
}
]
text = self.processor.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
inputs = self.processor(
text=[text], images=[pil_image], return_tensors='pt'
).to('cuda')
generated = self.model.generate(
**inputs,
max_new_tokens=max_tokens,
do_sample=False
)
return self.processor.decode(
generated[0][inputs['input_ids'].shape[1]:],
skip_special_tokens=True
)
Выбор модели: сравнение VLM 2024–2025
| Модель | VRAM | Latency (A100) | MMBench | Применение |
|---|---|---|---|---|
| Qwen2-VL-2B | 6GB | 0.3 сек | 74.9 | Edge, мобильные устройства |
| Qwen2-VL-7B | 16GB | 0.8 сек | 83.0 | Сервер, производство |
| LLaVA-Next-13B | 28GB | 1.4 сек | 79.7 | Сервер |
| InternVL2-26B | 52GB | 2.8 сек | 88.0 | Высокая точность |
| GPT-4o API | — | 2–5 сек | 87.0+ | Облако, без данных |
Структурированный вывод: JSON из изображения
Для production важнее не свободный текст, а структурированный JSON. Используем constrained generation через Outlines или grammar-based decoding:
from pydantic import BaseModel
from typing import Optional
import outlines
class ProductInspectionResult(BaseModel):
defect_detected: bool
defect_type: Optional[str]
defect_location: Optional[str]
severity: str # 'none', 'minor', 'major', 'critical'
confidence: float
notes: str
class StructuredVLMInspector:
def __init__(self, model_name: str):
self.model = outlines.models.transformers(model_name)
self.generator = outlines.generate.json(
self.model, ProductInspectionResult
)
def inspect(self, image: Image.Image, context: str = '') -> ProductInspectionResult:
prompt = f"""Inspect this product image for defects.
Context: {context}
Provide structured assessment."""
return self.generator(prompt, image)
Кейс: автоматизация разметки данных
VLM использовали для автоматической разметки 50k изображений производственных дефектов (вместо ручной аннотации):
- Задача: определить тип дефекта и его координаты
- Модель: Qwen2-VL-7B + structured output (JSON с bbox и классом)
- Точность автоматической разметки vs. ручная: 87% совпадений
- Оставшиеся 13% прошли быструю ручную коррекцию (30 сек/изображение vs. 5 мин с нуля)
- Итог: разметка 50k изображений за 3 дня вместо 6 недель
Ограничения VLM
Галлюцинации: модель может уверенно описать несуществующий дефект. Критично там, где false positive дорого стоит. Решение: ансамблирование с классическим детектором, порог уверенности по logprobs.
Повторяемость: при одинаковом изображении и вопросе ответ может незначительно отличаться. Для детерминированных задач — temperature=0.0, или structured generation.
Токенизация изображений: Qwen2-VL кодирует 1024×1024 в 256 токенов. Мелкие детефкты < 20px — на пределе разрешения VLM. Для таких случаев лучше классический детектор.
| Тип проекта | Срок |
|---|---|
| VLM API интеграция (GPT-4o/Claude) | 1–3 недели |
| Self-hosted VLM пайплайн | 4–7 недель |
| Fine-tuning VLM на доменных данных | 6–12 недель |







