Представьте: вы строите идеальный фото-ментор на базе 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 градусов. Для фотографии это катастрофа. Это как если бы строительный уровень показывал "идеально", когда дом падает.
Промпты не спасут. Нужен костыль из 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 теряется.
Пользователи не заметили подмены. Они получили более точные советы. А мы получили спокойный сон.
Вопросы, которые вы зададите (и ответы)
А если я хочу оценить не горизонт, а композицию по правилу третей?
Тот же принцип. CV-модуль находит семантически важные объекты (через open-vocabulary детектор, например, Grounding DINO v4) и вычисляет расстояние их центров до линий третей. Цифры передаются в LLM. Кстати, про open-vocabulary детекцию с Gemini у меня есть отдельный туториал.
Не проще ли обучить свою vision-модель с нуля на точной геометрии?
Нет. В марте 2026 года это все еще требует миллионов размеченных изображений и тысяч GPU-часов. Наш гибридный метод дал результат за две недели разработки на одной машине.
Какие еще CV-методы вы используете в PhotoMentor?
Анализ перспективы (схождение линий), определение симметрии, вычисление "веса" объектов через распределение яркости и контраста. Все это – классические алгоритмы. Мы даже подключили камеру для реального времени анализа, используя схему из статьи про LFM2.5-VL и камеры.
Что в итоге
Vision-модели 2026 года – это гениальные слепцы. Они видят лес, но не видят деревья. Точнее, видят, но не могут измерить расстояние между ними.
Гибридная система LLM + CV не костыль, а протез. Он дополняет слабое место ИИ силой детерминированных алгоритмов. И это, вероятно, останется лучшей практикой еще лет пять. Пока кто-нибудь не запустит датасет из триллионов изображений, размеченных роботами с лазерными дальномерами.
А пока – берите OpenCV, пишите несколько строк кода и перестаньте верить на слово даже самому продвинутому Gemini. Проверяйте. Всегда проверяйте.