Розробка систем аналізу зображень на основі 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 із зображення
Для виробництва важливіше не вільний текст, а структурований 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 тижнів |







