Пространственное понимание и анализ сложных визуальных схем
Введение: Почему модели «видят», но не всегда «понимают»?
Добро пожаловать во второй модуль курса. Если в предыдущих уроках мы говорили о том, как Gemini обрабатывает картинки в целом (описывает сцену, распознает текст), то сегодня мы займемся настоящей магией — пространственным пониманием (Spatial Understanding).
Давайте честно: долгое время мультимодальные модели работали по принципу «мешка слов». Вы показывали фото сложной архитектурной схемы, а модель говорила: «Здесь есть квадраты, линии и текст 'Database'». Но она не понимала, что стрелка от Service A идет к Database, и что это означает поток данных.
Gemini 3 меняет правила игры. Она не просто классифицирует объекты, она понимает их расположение в двухмерном пространстве. Она может вернуть вам координаты кнопок интерфейса, проследить путь на карте метро или преобразовать нарисованную от руки блок-схему в исполняемый код. В этом уроке мы научимся извлекать из визуального хаоса строгую логическую структуру.
Координатная система и Bounding Boxes
Чтобы работать с пространством, нужно говорить с моделью на одном языке. Gemini использует нормализованную систему координат для определения областей (Bounding Boxes).
- Нормализация [0, 1000]: Координаты обычно выражаются в целых числах от 0 до 1000 (или от 0 до 1, в зависимости от режима, но чаще используется 1000-балльная шкала для точности токенизации).
- Формат: Обычно это кортеж
[ymin, xmin, ymax, xmax]. Обратите внимание на порядок: сначала Y (вертикаль), потом X (горизонталь). Это классическое наследие компьютерного зрения.
Когда вы просите модель «найти кнопку 'Купить'», она не просто говорит «она внизу», она возвращает точные координаты, позволяя вам программно кликнуть по ней или выделить её на экране.
import google.generativeai as genai
from PIL import Image
# Настройка модели (предполагаем использование Gemini 3)
model = genai.GenerativeModel('gemini-3.0-pro')
def analyze_ui_layout(image_path):
img = Image.open(image_path)
# Мы просим модель вернуть данные в конкретной структуре
# Использование 'bounding boxes' в промпте активирует пространственное мышление
prompt = """
Проанализируй этот скриншот интерфейса.
Найди все интерактивные элементы (кнопки, поля ввода).
Для каждого элемента верни:
1. Название/Текст
2. Тип элемента
3. Координаты bounding box в формате [ymin, xmin, ymax, xmax] (шкала 0-1000)
Верни ответ в формате JSON.
"""
response = model.generate_content([prompt, img])
return response.text
# Пример вызова
# result = analyze_ui_layout('dashboard_screenshot.png')
# print(result)
Анализ сложных схем и диаграмм
Самый мощный кейс использования пространственного анализа — это работа с инженерными и бизнес-схемами (UML, электрические цепи, архитектурные планы). Здесь недостаточно просто найти объекты. Нужно понять связность (connectivity).
Представьте, что вы скармливаете модели фото диаграммы микросервисной архитектуры, нарисованной на маркерной доске. Ваша задача — не просто получить текст, а восстановить логику графа.
Алгоритм «Визуального Парсинга»:
- Детекция узлов: Сначала модель находит все сущности (квадраты, круги, иконки).
- Анализ ребер (Edges): Модель отслеживает линии и стрелки. Gemini 3 отлично справляется с пересекающимися линиями, понимая, какая линия проходит «над» другой.
- Определение направления: Стрелка указывает направление потока данных или зависимость.
- Семантическое связывание: «Если узел А соединен с узлом Б пунктирной линией с подписью 'uses', значит А зависит от Б».
Это позволяет нам конвертировать картинку напрямую в Terraform-код, SQL-схему или Python-классы.
pythonimport json # Пример промпта для извлечения графа из блок-схемы def diagram_to_graph(image_file): prompt = """ Перед тобой блок-схема бизнес-процесса. Твоя задача — преобразовать её в структуру графа. Правила: 1. Идентифицируй все узлы (Steps) и решения (Diamonds). 2. Идентифицируй все связи (Arrows). 3. Если на стрелке есть текст (например 'Да' или 'Нет'), добавь это как условие перехода. Формат вывода JSON: { "nodes": [ {"id": "node1", "label": "Start", "type": "terminal"}, {"id": "node2", "label": "Is User Logged In?", "type": "decision"} ], "edges": [ {"from": "node1", "to": "node2", "label": null}, {"from": "node2", "to": "node3", "label": "Yes"} ] } """ # В Gemini 3 мы можем форсировать JSON режим для гарантии структуры response = model.generate_content( [prompt, image_file], generation_config={"response_mime_type": "application/json"} ) return json.loads(response.text)Пространственные рассуждения: «Слева от» и «Внутри»
Часто задача состоит не в получении координат, а в качественном описании отношений. Это критично для робототехники или ассистентов для слабовидящих.
Пример запроса: «Нахожусь ли я в опасной зоне?» по фото с камеры наблюдения на производстве.
Модель должна выполнить цепочку рассуждений:
- Найти человека.
- Найти разметку опасной зоны (например, желтые линии на полу).
- Понять пространственное отношение: находится ли bounding box человека внутри полигона, очерченного линиями.
Gemini 3 умеет делать это «из коробки», но для повышения точности мы используем технику Visual Chain-of-Thought (Визуальная цепочка мыслей). Мы просим модель сначала описать геометрию сцены, а только потом делать вывод.
УпражнениеЗадание: Валидатор UI-макетов.<br><br>У вас есть задача: проверить, соответствует ли верстка дизайну. Напишите промпт и псевдокод для Gemini, который принимает два изображения:<br>1. Макет дизайнера (target_design.png)<br>2. Скриншот готового приложения (actual_app.png)<br><br>Модель должна найти отличия не в цвете, а именно в расположении элементов (например, «Кнопка 'Login' смещена влево относительно макета» или «Отсутствует иконка пользователя»).
Работа с картами и планами помещений
Еще один уровень сложности — вид сверху (Top-down view). Планы этажей или карты требуют понимания масштаба и проходимости.
Если вы загружаете план эвакуации и спрашиваете: «Как пройти из комнаты 101 к выходу?», Gemini выполняет поиск пути. Она визуально «проходит» по коридорам, избегая стен (черных линий).
Совет профи: При работе с картами добавляйте в промпт просьбу использовать «ориентиры» (landmarks). Вместо «идите 5 метров прямо», модель скажет «идите по коридору до кулера с водой, затем поверните направо». Это делает навигацию более человечной и устойчивой к ошибкам масштабирования.
ВопросВы разрабатываете систему, которая превращает нарисованные от руки ER-диаграммы (схемы баз данных) в SQL-код. Модель правильно находит названия таблиц, но путает связи «один-ко-многим» (направление стрелок). Что лучше всего добавить в промпт, чтобы исправить это?