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

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Реализация Vision Language Model VLM для анализа изображений с текстом
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

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