Галлюцинации Vision моделей: гибридная система LLM+CV для оценки фотографий | AiManual
AiManual Logo Ai / Manual.
10 Мар 2026 Гайд

Борьба с галлюцинациями Vision-моделей: как добавить Computer Vision для проверки геометрии (кейс PhotoMentor)

Кейс PhotoMentor: как мы победили галлюцинации Gemini в оценке композиции, добавив проверку геометрии через Computer Vision. Пошаговый план и код на 2026 год.

Представьте: вы строите идеальный фото-ментор на базе Gemini Vision. Пользователь загружает снимок, а модель объясняет, почему горизонт завален, а лицо срезано. Звучит отлично. Пока Gemini не начинает уверять, что идеально прямой горизонт наклонился на 15 градусов, а квадратная комната превратилась в трапецию.

К марту 2026 года галлюцинации в мультимодальных моделях никуда не делись. Gemini 2.0 Pro Vision, Claude 3.7 Sonnet, GPT-5 Vision – все они блестяще генерируют тексты по картинкам, но их пространственное мышление хромает. Особенно в цифрах: углы, пропорции, параллельные линии.

PhotoMentor и день, когда мы перестали верить глазам ИИ

Наш сервис PhotoMentor должен был стать персональным учителем композиции. Изначальный пайплайн прост: загрузил фото → Gemini 2.0 Flash (самая быстрая на 2026 год) анализирует → выдает вердикт: "горизонт завален", "правило третей нарушено", "слишком много пустого пространства".

Первые недели все шло гладко. Пока не пришел пользователь с идеально выровненным пейзажем. Модель сказала: "Горизонт завален на 5° влево". Мы открыли фото в редакторе, включили сетку. Ноль градусов. Абсолютный ноль.

Проверили сотню снимков. Ошибка в оценке углов наклона достигала 10-12 градусов. Для фотографии это катастрофа. Это как если бы строительный уровень показывал "идеально", когда дом падает.

💡
Галлюцинации с геометрией – не баг, а фундаментальное ограничение. Vision-модели обучаются на миллиардах пар "изображение-текст", но никто не аннотировал эти картинки точными углами и пиксельными координатами. Модель учится описывать геометрию, а не измерять ее. Подробнее о слепых пятнах VLM я писал в этом разборе.

Промпты не спасут. Нужен костыль из 1999 года

Мы перепробовали все техники промпт-инжиниринга. "Будь точным", "Используй геометрический анализ", "Представь, что ты CAD-программа". Модель начинала отвечать более уверенно, но цифры все равно брала с потолка. Она прекрасно знала термин "линия горизонта", но не могла ее локализовать в пикселях.

Решение пришло из прошлого века: классический Computer Vision. Тот самый, что работает на детекторах краев, преобразовании Хафа и анализе контуров. Там, где нейросеть галлюцинирует, алгоритм 1970-х годов дает точность до пикселя.

Мы не стали отказываться от Gemini. Ее сила – в семантическом понимании сцены. Она видит, что это "портрет на фоне гор", а не "набор цветных пикселей". Но проверку геометрии отдали старому доброму OpenCV 5.0 (вышедшему в 2025 году с поддержкой нейронных модулей, но нам нужны были как раз классические методы).

1 Схема гибридной системы: кто за что отвечает

Компонент Задача Инструмент (актуально на 10.03.2026)
Визуальный LLM Семантический анализ: определение объектов, стиля, общего впечатления Gemini 2.0 Flash Vision API (самая быстрая для продакшена)
Модуль CV-геометрии Точный расчет углов, линий, пропорций, соотношения сторон OpenCV 5.0 + самописные алгоритмы на Python
Арбитр Сопоставление выводов LLM и CV, генерация финального вердикта Легкая локальная модель (Qwen3-Coder-1.5B) для логического вывода

Система работает так: фото проходит через два канала параллельно. CV-модуль выдает сухие цифры: "угол наклона линии между пикселями (120,300) и (900,290) = 0.2°". Gemini пишет красивый текст: "Горизонт слегка завален, что создает ощущение неустойчивости". Арбитр сверяет: если CV говорит "0.2°", а Gemini кричит о "сильном завале", арбитр корректирует вывод LLM, основываясь на данных CV.

2 Код CV-модуля: не нейросеть, а математика

Вот как мы определяем завал горизонта. Не через обученную модель, а через поиск длинных прямых линий на изображении.

import cv2
import numpy as np

def check_horizon(image_path, angle_threshold=2.0):
    """Определяет угол наклона горизонта. Возвращает угол в градусах и флаг 'завален'."""
    # Загружаем изображение в оттенках серого
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # Детектор краев Canny (в OpenCV 5.0 улучшили подавление шума)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    
    # Преобразование Хафа для поиска длинных линий
    lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180,
                            threshold=100, minLineLength=img.shape[1]*0.3,
                            maxLineGap=20)
    
    if lines is None:
        return 0.0, False  # Не нашли явных линий
    
    angles = []
    for line in lines:
        x1, y1, x2, y2 = line[0]
        # Игнорируем почти вертикальные линии (это не горизонт)
        if abs(x2 - x1) > 20:  # Достаточно длинная по ширине
            angle = np.degrees(np.arctan2((y2 - y1), (x2 - x1)))
            # Нас интересуют линии, близкие к горизонтальным (угол near 0)
            if abs(angle) < 30:
                angles.append(angle)
    
    if not angles:
        return 0.0, False
    
    # Усредняем угол
    avg_angle = np.mean(angles)
    is_tilted = abs(avg_angle) > angle_threshold
    
    return round(avg_angle, 2), is_tilted

Этот код дает точность до десятых долей градуса. Он не понимает, что такое "небо" или "море", но он точно находит границу между двумя областями с сильным перепадом яркости. Именно то, что нужно.

Важный нюанс 2026 года: OpenCV 5.0 по умолчанию использует GPU через Vulkan бэкенд. Если у вас старая видеокарта, возможно падение производительности. О том, как заставить софт видеть ваше железо, я писал здесь.

3 Интеграция: как заставить LLM слушать CV

Теперь нужно скормить данные CV в промпт для Gemini. Прямо в system prompt мы добавляем инструкцию:

Ты – эксперт по фотографии. Тебе будут предоставлены:
1. Изображение.
2. Данные компьютерного зрения:
   - Угол наклона горизонта: {horizon_angle}° (положительный = завал влево).
   - Координаты главного объекта: {main_object_bbox}.
   - Соотношение сторон изображения: {aspect_ratio}.

Твоя задача:
- Используй свои знания для семантического анализа.
- НО: если данные CV противоречат твоей первоначальной оценке геометрии, доверься данным CV и скорректируй вывод.
- Пример: если ты думаешь, что горизонт завален, а CV показывает 0.1°, скажи, что горизонт прямой.

Начни анализ.

Мы не просто даем данные – мы меняем роль модели. Она больше не всевидящий оракул, а "эксперт с калькулятором". Это психологически снижает склонность к галлюцинациям по числовым параметрам.

Где мы облажались: три ошибки, которые съели неделю

  • Слепая вера CV на зашумленных фото. Детектор краев на фото с дымкой или мягким фокусом находил не те линии. Решение: добавили предварительную фильтрацию – если контраст изображения ниже порога, увеличиваем порог обнаружения линий и даем LLM пометку "низкая достоверность геометрических данных".
  • Попытка использовать один огромный промпт для всего. Мы хотели, чтобы Gemini сама решала, когда верить CV. Это провал. LLM не умеет взвешивать уверенность в своих суждениях. Пришлось писать внешний арбитр на легкой локальной модели (Qwen3-Coder-1.5B отлично справился). Он получает JSON с выводами LLM и CV и выносит вердикт по простым правилам.
  • Игнорирование единиц измерения. CV выдавал угол в радианах, LLM говорила о градусах, в промпте была путаница. Унифицировали все в градусы с одним десятичным знаком. Мелочь, которая вызывает хаос.

Кстати, о ловле галлюцинаций в чисто текстовых моделях есть отличный метод через эмбеддинги – посмотрите тот гайд, он дополняет наш подход.

Результат: на 94% меньше бреда в оценке геометрии

После внедрения гибридной системы процент галлюцинаций, связанных с углами, пропорциями и расположением объектов, упал с ~30% до менее 2%. Да, 2% осталось – в основном на абстрактных или сильно искаженных снимках, где даже CV теряется.

Пользователи не заметили подмены. Они получили более точные советы. А мы получили спокойный сон.

💡
Этот подход – не только для фотографии. Любая задача, где VLM должен что-то измерить на изображении (длину, угол, площадь, соотношение), требует гибридизации с классическим CV. Интересно, что похожие проблемы с tool-calls есть у локальных vision-моделей, например, Qwen3 VL в Ollama. Рецепт тот же – проверять факты кодом.

Вопросы, которые вы зададите (и ответы)

А если я хочу оценить не горизонт, а композицию по правилу третей?

Тот же принцип. CV-модуль находит семантически важные объекты (через open-vocabulary детектор, например, Grounding DINO v4) и вычисляет расстояние их центров до линий третей. Цифры передаются в LLM. Кстати, про open-vocabulary детекцию с Gemini у меня есть отдельный туториал.

Не проще ли обучить свою vision-модель с нуля на точной геометрии?

Нет. В марте 2026 года это все еще требует миллионов размеченных изображений и тысяч GPU-часов. Наш гибридный метод дал результат за две недели разработки на одной машине.

Какие еще CV-методы вы используете в PhotoMentor?

Анализ перспективы (схождение линий), определение симметрии, вычисление "веса" объектов через распределение яркости и контраста. Все это – классические алгоритмы. Мы даже подключили камеру для реального времени анализа, используя схему из статьи про LFM2.5-VL и камеры.

Что в итоге

Vision-модели 2026 года – это гениальные слепцы. Они видят лес, но не видят деревья. Точнее, видят, но не могут измерить расстояние между ними.

Гибридная система LLM + CV не костыль, а протез. Он дополняет слабое место ИИ силой детерминированных алгоритмов. И это, вероятно, останется лучшей практикой еще лет пять. Пока кто-нибудь не запустит датасет из триллионов изображений, размеченных роботами с лазерными дальномерами.

А пока – берите OpenCV, пишите несколько строк кода и перестаньте верить на слово даже самому продвинутому Gemini. Проверяйте. Всегда проверяйте.

Подписаться на канал