Продвинутый анализ изображений: Spatial understanding и OCR
Введение: За пределами простого «Что на картинке?»
Добро пожаловать на урок, который разделит ваш опыт работы с компьютерным зрением на «до» и «после». В базовых туториалах мы обычно просим модель описать изображение, и она отвечает: «Это кошка на диване». Это мило, но для архитектора ИИ-решений этого недостаточно.
В реальных бизнес-задачах нам не нужно знать, что на картинке есть чек. Нам нужно извлечь ИНН, дату и итоговую сумму в формате JSON. Нам не интересно знать, что на фото склад. Нам нужно получить координаты конкретной коробки, чтобы манипулятор мог ее захватить.
Сегодня мы погрузимся в Spatial Understanding (пространственное понимание) и OCR нового поколения. Мы научим Gemini 3 не просто смотреть, а анализировать структуру визуальных данных.
Часть 1: Философия Spatial Understanding
Традиционные модели компьютерного зрения (CV) работали как классификаторы. Gemini 3 работает иначе. Она обладает мультимодальным вниманием, которое позволяет связывать семантику (смысл) с пикселями (расположением).
Как Gemini «видит» координаты?
Модель не видит пиксели так, как это делает OpenCV (0,0 — верхний левый угол, 1920,1080 — нижний правый). Gemini использует нормализованные координаты в диапазоне от 0 до 1000.
[0, 0, 1000, 1000]— это всё изображение.- Формат обычно такой:
[ymin, xmin, ymax, xmax]. Обратите внимание: Y идет первым!
Это критически важно для задач:
- Робототехники: «Где находится ручка кружки?»
- Автоматизации UI: «Дай координаты кнопки 'Купить'».
- Модерации контента: «Размой лицо человека в правом углу».
import google.generativeai as genai
import PIL.Image
# Настройка модели
model = genai.GenerativeModel('gemini-1.5-pro-latest') # Или актуальная версия Gemini 3
def detect_objects_with_coordinates(image_path, object_name):
img = PIL.Image.open(image_path)
# Мы явно просим модель вернуть bounding boxes (ограничивающие рамки)
prompt = f"""
Найди на изображении {object_name}.
Верни ответ в формате списка: [Название объекта, ymin, xmin, ymax, xmax].
Координаты должны быть нормализованы (0-1000).
Если объектов несколько, перечисли каждый с новой строки.
"""
response = model.generate_content([prompt, img])
return response.text
# Пример вызова
# print(detect_objects_with_coordinates('warehouse.jpg', 'красные коробки'))
Часть 2: Продвинутый OCR и извлечение данных
Забудьте старый термин «распознавание текста». В эпоху LLM мы говорим о Document Intelligence. Обычный OCR просто возвращает «кашу» из символов. Gemini возвращает смысл.
Представьте, что вы фотографируете мятый чек из ресторана. Классический OCR вернет:
БУРГЕР 500
КОЛА 100
ИТОГ 600Gemini, благодаря своему «архитекторскому» пониманию, может сразу вернуть структурированный JSON, проигнорировав мусор, исправив опечатки (по контексту) и даже классифицировав тип расхода.
Ключевые возможности:- Работа с рукописным текстом: Врачи, учителя, инженеры — их почерк больше не проблема.
- Табличные данные: Gemini понимает сетку таблицы, даже если линии не прорисованы, опираясь на визуальное выравнивание.
- Многоязычность в одном документе: Смесь китайского, русского и английского на одной этикетке обрабатывается нативно.
import typing_extensions as typing
# Определяем строгую схему данных для ответа
# Это превращает Gemini из чат-бота в API для парсинга
class ReceiptItem(typing.TypedDict):
item_name: str
quantity: int
price: float
class ReceiptData(typing.TypedDict):
shop_name: str
date: str
items: list[ReceiptItem]
total_sum: float
currency: str
fraud_probability: str # Модель может оценить, выглядит ли чек поддельным
model = genai.GenerativeModel('gemini-1.5-pro-latest')
def parse_receipt_to_json(image_path):
img = PIL.Image.open(image_path)
prompt = """
Проанализируй это изображение чека.
Извлеки все данные согласно схеме.
Если дата не указана, верни null.
Оцени вероятность того, что чек поддельный или отредактированный.
"""
# Используем режим generation_config для принудительного JSON
response = model.generate_content(
[prompt, img],
generation_config=genai.GenerationConfig(
response_mime_type="application/json",
response_schema=ReceiptData
)
)
return response.text
Глубокое погружение: Анализ визуальных связей
Теперь самое сложное. Spatial Understanding — это не только «где объект», но и «как объекты взаимодействуют». Это уровень сеньор-разработчика.
Рассмотрим кейс: Контроль техники безопасности (HSE).
Нам недостаточно найти каску и человека. Нам нужно понять: надета ли каска на голову человека? Простое пересечение bounding boxes (рамок) может дать ложноположительный результат (человек держит каску в руках на уровне головы). Gemini решает это через семантический анализ сцены.
При проектировании промпта для таких задач используйте технику Chain-of-Visual-Thought (Цепочка визуальных рассуждений):
- Сначала попросите описать позу человека.
- Затем попросите найти защитное снаряжение.
- И только потом — сделать вывод о соблюдении правил.
Задача: UI/UX Тестировщик.<br><br>Напишите функцию на Python, используя Gemini API, которая принимает скриншот веб-сайта и название элемента (например, «Кнопка 'Войти'»). <br>Функция должна:<br>1. Вернуть координаты центра этого элемента (x, y) в пикселях (предполагая разрешение 1920x1080).<br>2. Вернуть CSS-цвет элемента (приблизительно, текстом, например, «Dark Blue»).<br>3. Оценить, не перекрывается ли этот элемент другими элементами.
Лучшие практики и «подводные камни»
Как архитектор, вы должны знать ограничения инструмента, чтобы не продать заказчику невыполнимое решение.
- Галлюцинации координат: Gemini очень хороша, но иногда она может «промахнуться» на 10-20 пунктов по шкале 1000. Для хирургической точности (до пикселя) лучше использовать гибридный подход: Gemini находит область (Region of Interest), а затем классический OpenCV делает точный кроп или детектирование краев.
- Мелкий текст: Если вы анализируете скан чертежа формата А0 в низком разрешении, модель не прочитает мелкие сноски. Решение: Нарезайте большие изображения на тайлы (плитки) с перекрытием перед отправкой в API.
- Ориентация: Gemini обычно справляется с перевернутыми документами, но явное указание «Если документ перевернут, читай его правильно» в промпте повышает надежность на 15-20%.
Совет: Всегда запрашивайте reasoning (объяснение) в JSON-ответе при отладке. Понимание того, почему модель решила, что это кнопка, а не баннер, сэкономит вам часы дебага.
Вы разрабатываете систему для автоматического заполнения бухгалтерских книг. Вы подаете на вход Gemini фото накладной и просите вернуть координаты таблицы с товарами. Модель вернула: [200, 100, 800, 900]. Какая часть изображения, скорее всего, содержится в этих координатах, если использовать стандартную нормализацию Gemini?