Бенчмарк Vision-Language моделей на изображениях низкого разрешения
Vision-Language Models (VLM) за последние пару лет стали де-факто универсальным инструментом для работы с изображениями: от описания сцен и VQA до извлечения текстовой информации. В бенчмарках и демо они часто показывают впечатляющие результаты — при условии, что входные данные достаточно «чистые».
Однако в реальных системах изображения редко соответствуют этим условиям. На практике приходится работать с низким разрешением, сильным сжатием, шумами, бликами и частично потерянным текстом. Особенно это заметно в задачах, где на вход подаются фрагменты строк, сканы, кропы или изображения минимального допустимого размера для модели.
В этой статье мы рассмотрим прикладной сценарий: сравнение нескольких Vision-Language моделей на задаче распознавания классов по изображениям низкого качества. Ключевой особенностью подхода стало то, что модели не выбирают класс напрямую, а генерируют свободное текстовое описание, которое затем сопоставляется с эталонами семантически, а не построчно.
Цель бенчмарка — не получить максимальные абсолютные метрики, а понять, как разные VLM ведут себя в условиях, близких к продакшену: при плохом визуальном сигнале, ограниченном GPU и необходимости принимать решения на основе «неполных» данных.
В реальных данных изображения редко бывают идеальными.В этой статье я расскажу, как сравнивал несколько VLM-моделей на задаче распознавания классов по изображениям низкого разрешения, и почему семантическое сравнение текстов оказалось практичнее классической классификации.
С какими изображениями приходится работать
Сразу обозначу важный контекст: изображения в датасете были далеко не «лабораторными».
Типичные проблемы:
- низкое разрешение;
- сильное сжатие;
- шум и блики;
- мелкий или частично нечитаемый текст.
Во многих случаях изображения находились на минимально допустимом размере для VLM-моделей. Если изображение оказывалось слишком маленьким, оно масштабировалось до нижнего порога, чтобы модель вообще смогла его принять. Это решает техническую проблему, но не восстанавливает потерянную визуальную информацию.
Ниже - синтетические иллюстративные примеры, которые хорошо отражают характер входных изображений.
Примеры входных изображений (синтетика)
Ниже приведены синтетические примеры, визуально повторяющие характеристики реальных входных данных:низкое разрешение, размытие, слабый контраст и частичную потерю деталей.Текстовое содержимое абстрактно и не связано с реальными продуктами.
Пример 1 — низкое разрешение и сильное размытие
Ожидаемый класс: Example Line Alpha Variant 250
Текст занимает почти всю высоту строки, но из-за низкого разрешения и размытия отдельные символы сливаются.Модель не может полагаться на точное распознавание букв и должна восстанавливать смысл по общему текстовому шаблону.
Пример 2 — кириллический текст и низкий контраст
Ожидаемый класс: ДЕМО СЕРИЯ СИНЯЯ ЛИНИЯ 42
Кириллический текст размыт и имеет слабый контраст с фоном.Часть символов плохо различима, однако структура строки сохраняется, что позволяет модели извлекать семантику даже при неполной читаемости.
Пример 3 — размытая латиница и потеря мелких деталей
Ожидаемый класс: Sample Product X Series B
Текст визуально читается фрагментарно: мелкие элементы и разделители теряются, края символов размыты.В таких условиях модель чаще опирается на ключевые токены и общий контекст строки, а не на точное OCR.
Как я оценивал ответы моделей
Каждая Vision-Language модель получала одинаковый запрос:
“Опиши, что изображено на картинке”
Важно: модель не выбирает класс напрямую. Она генерирует свободный текст.Поэтому я отказался от строгого сравнения строк и использовал семантическое сопоставление.
Общий пайплайн выглядел так:
- Модель генерирует текстовое описание изображения.
- Текст очищается и нормализуется.
- Для текста строится эмбеддинг.
- Он сравнивается с эмбеддингами допустимых вариантов названий класса.
- Если similarity выше порога - ответ считается корректным.
Такой подход:
- устойчив к разным формулировкам;
- работает с несколькими языками;
- лучше отражает реальное качество VLM.
Какие модели я выбрал и почему
В бенчмарк я включил несколько Vision-Language моделей разных размеров и архитектур, чтобы посмотреть, как они ведут себя именно на фрагментах строк, а не на «красивых» изображениях.
Важно: абсолютные значения точности здесь не самоцель. Задача - понять относительное поведение моделей в условиях низкого разрешения, обрезов и бликов.
qwen2.5-vl:7b - лучший результат по точности
Эта модель показала наивысшую точность — около 50%.
Причины, по которым она оказалась лидером:
- хорошо извлекает смысл даже из неполных строк;
- устойчиво работает с крупным, но обрезанным текстом;
- редко уходит в описания «в общем виде», стараясь восстановить конкретное название.
Фактически, это лучшая модель в тесте именно для задачи семантического распознавания текстовых фрагментов.
qwen3-vl:8b - почти на уровне лидера
Несмотря на больший размер, модель показала точность чуть ниже - ~46.6%.
При этом:
- ответы более стабильны;
- меньше случайных интерпретаций;
- лучше держит формат ответа.
По ощущениям, эта модель чуть консервативнее, но предсказуемее, что важно для продакшена.
deepseek-ocr:3b - быстрый, но ограниченный
С точностью ~36.8% модель ожидаемо проигрывает более крупным VLM.
Это хорошо объясняется её природой:
- она действительно «читает текст»;
- но плохо восстанавливает смысл при сильной обрезке;
- чувствительна к бликам и шуму.
Тем не менее, для своего размера это очень достойный результат, особенно если важны скорость и стоимость инференса.
gemma3:4b - середина без явных преимуществ
Результат на уровне ~17.8%.
Модель:
- часто улавливает общий контекст;
- но теряет конкретные названия;
- ответы получаются слишком вариативными для надёжной классификации.
В этой задаче она оказалась менее практичной, чем Qwen и DeepSeek.
granite3.2-vision:2b - не про текст
С точностью менее 5% модель ожидаемо замыкает список.
Это не недостаток модели как таковой, а следствие того, что:
- она ориентирована на визуальное описание сцены;
- а не на извлечение и интерпретацию текста.
Для задач VQA или описания изображений она может быть полезна,но для классификации текстовых фрагментов — нет.
Немного про железо
Все эксперименты выполнялись локально на:
- RTX 3060 (12 GB VRAM)
Это сразу накладывает ограничения:
- 7–8B - практический потолок без ухищрений;
- larger models требуют offloading и резко увеличивают latency;
- скорость инференса становится не менее важной, чем точность.
Поэтому в тесте нет “гигантов” - они просто не соответствуют реальным условиям использования.
Абстрактный пример кода
Ниже - упрощённый код, который отражает общую идею бенчмарка, без привязки к реальным данным и моделям.
class VLMBenchmark:
def __init__(self, vlm_models, embedding_model, similarity_threshold=0.7):
self.vlm_models = vlm_models
self.embedding_model = embedding_model
self.similarity_threshold = similarity_threshold
def preprocess_text(self, text: str) -> str:
text = text.lower()
text = re.sub(r'[^a-zа-я\s]', ' ', text)
return re.sub(r'\s+', ' ', text).strip()
def recognize_image(self, model_name: str, image_path: str) -> str:
response = vlm_client.chat(
model=model_name,
prompt="Describe what is shown in the image",
image=image_path
)
return response["text"]
def match_class(self, predicted_text: str, class_variants: list[str]) -> dict:
predicted_text = self.preprocess_text(predicted_text)
pred_embedding = self.embedding_model.encode([predicted_text])[0]
best_score = 0.0
best_variant = None
for variant in class_variants:
variant_embedding = self.embedding_model.encode([variant])[0]
score = cosine_similarity(
[pred_embedding],
[variant_embedding])[0][0]
if score > best_score:
best_score = score
best_variant = variant
return {
"matched": best_score >= self.similarity_threshold,
"similarity": best_score,
}
Ключевая идея здесь простая:мы сравниваем не строки, а смысл.
Результаты по точности
Точность распознавания классов для разных VLM-моделей
Качество заметно различается. Некоторые модели стабильно распознают класс даже на плохих изображениях, другие выдают слишком общие или ошибочные описания.
Скорость против качества
Почему низкое разрешение - ключевая проблема
Эксперимент показал, что даже современные VLM:
- часто угадывают общий класс,
- но теряют детали;
- путаются в вариациях продукта.
При этом семантическое сравнение позволяет засчитывать ответы, которые формально отличаются от эталона, но корректны по смыслу.
Если хочется разобраться глубже
Если тема откликается и хочется системно разобраться, как работают LLM и VLM в реальных условиях, можно посмотреть программу курса: https://llmcourse.tech
Приятный бонус: для читателей статьи действует промокод WINTER35 — скидка 35 000 ₽.
Этот эксперимент показал несколько важных вещей, которые не всегда очевидны из классических бенчмарков VLM.
Во-первых, низкое разрешение и деградация изображения радикально меняют характер задачи. Модели перестают «читать текст» в привычном OCR-смысле и начинают работать на уровне шаблонов, ключевых токенов и общего контекста. В таких условиях выигрывают не самые «визуальные», а те модели, которые лучше восстанавливают смысл из фрагментарной информации.
Во-вторых, семантическое сравнение текстов оказалось значительно практичнее строгой классификации. Оно:
- устойчиво к вариативности формулировок;
- позволяет работать с несколькими языками;
- лучше отражает реальное качество ответа модели, а не формальное совпадение строк.
В-третьих, разница между моделями становится особенно заметной именно на «плохих» данных. Qwen-серия показала себя наиболее устойчивой к потере деталей, тогда как модели, ориентированные на чистый OCR или общее визуальное описание сцены, быстро деградируют по качеству.
Наконец, ограничения по железу — не вторичный фактор. При работе на одной потребительской GPU баланс между размером модели, latency и точностью оказывается критичным, и «гиганты» не всегда оправданы даже теоретически.