Реалізація Vision Language Model VLM для аналізу зображень з текстом

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Реалізація Vision Language Model VLM для аналізу зображень з текстом
Середній
~3-5 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

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