Продвинутый анализ изображений: Spatial understanding и OCR

40 минут Урок 6

Введение: За пределами простого «Что на картинке?»

Добро пожаловать на урок, который разделит ваш опыт работы с компьютерным зрением на «до» и «после». В базовых туториалах мы обычно просим модель описать изображение, и она отвечает: «Это кошка на диване». Это мило, но для архитектора ИИ-решений этого недостаточно.

В реальных бизнес-задачах нам не нужно знать, что на картинке есть чек. Нам нужно извлечь ИНН, дату и итоговую сумму в формате 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 идет первым!

Это критически важно для задач:

  1. Робототехники: «Где находится ручка кружки?»
  2. Автоматизации UI: «Дай координаты кнопки 'Купить'».
  3. Модерации контента: «Размой лицо человека в правом углу».

python
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 ИТОГ 600

Gemini, благодаря своему «архитекторскому» пониманию, может сразу вернуть структурированный JSON, проигнорировав мусор, исправив опечатки (по контексту) и даже классифицировав тип расхода.

Ключевые возможности:
  • Работа с рукописным текстом: Врачи, учителя, инженеры — их почерк больше не проблема.
  • Табличные данные: Gemini понимает сетку таблицы, даже если линии не прорисованы, опираясь на визуальное выравнивание.
  • Многоязычность в одном документе: Смесь китайского, русского и английского на одной этикетке обрабатывается нативно.

python
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 (Цепочка визуальных рассуждений):

  1. Сначала попросите описать позу человека.
  2. Затем попросите найти защитное снаряжение.
  3. И только потом — сделать вывод о соблюдении правил.

Упражнение

Задача: 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?