
Модели визуального языка (VLM), такие как GPT-4o и Claude-3.5, хорошо справились с текстовыми задачами и продолжают совершенствоваться, но всё ещё испытывают трудности с визуальными задачами. Например, попросим эти VLM подсчитать количество недостающих банок газировки на этом изображении:

Провал головоломки с банкой газировки
Claude-3.5 (проверено 01.01.2025):
Глядя на изображение, я вижу банки Coca-Cola, расположенные, судя по всему, в сетке 4×7 (всего 28 ячеек). Сейчас на изображении видны 26 банок, причём две пустые ячейки находятся посередине. Следовательно, в полном наборе не хватает двух банок.
GPT-4o (проверено 01.01.2025):
«Чтобы определить, сколько банок с газировкой не хватает, мы можем подсчитать количество ячеек в коробке и сравнить его с количеством имеющихся банок.
Наблюдения:
Похоже, коробка с газировкой имеет планировку 6×5 (6 рядов и 5 столбцов), что вмещает 6 * 5 = 30 банок, если она полная. Если посчитать все банки, получается 28.
Расчет:
Общее количество пропавших банок: 30 – 28 = 2.
Заключение:
В коробке не хватает двух банок газировки.
Gemini-2.0-Flash-Exp (протестировано 01.01.2025):
«На изображении коробка с банками из-под газировки. Всего 24 банки. Однако двух не хватает».
GPT-o1 (проверено 01.01.2025):
«Ответ: не хватает 12 банок.
Пояснение: Судя по представленному расположению, банки с газировкой изначально были упакованы в прямоугольную сетку. Обычная конфигурация для больших упаковок (например, по 30 банок) — это сетка 6 на 5, в которой всего 30 банок. Если предположить, что изначально была полная упаковка из 30 банок (6 банок в ширину и 5 рядов в глубину), то внешний «граничный» слой такого прямоугольника состоит из:
- Верхний ряд: 6 банок
- Нижний ряд: 6 банок
- Левая сторона (без учета уже подсчитанных углов): 3 банки
- Правая сторона (аналогично): 3 банки
Сложим это:
- Верх: 6
- Внизу: 6
- Слева (без углов): 3
- Справа (без углов): 3
- Общее внешнее кольцо = 6 + 6 + 3 + 3 = 18 банок
Если видимым остается только внешнее кольцо банок, а вся внутренняя часть пуста, то:
- Всего изначально: 30 банок
- В настоящее время видно (внешнее кольцо): 18 банок
- Недостающие банки = 30 – 18 = 12
Таким образом, не хватает 12 банок».
Банки с газировкой представляют собой сетку 5×7, в которой явно не хватает четырёх банок. Обе модели не только дают неправильный ответ, но и не могут определить узор сетки. Более того, если попросить их нарисовать рамку вокруг каждой недостающей банки, они не справятся.
Обзор
В этой статье мы представляем VisionAgent — фреймворк агентного ИИ, способный решать сложные визуальные задачи, требующие рассуждений. В первой части мы расскажем об общем фреймворке агентного ИИ для VisionAgent и о том, как он модульно выбирает инструменты для выбора оптимального визуального инструмента для конкретной задачи. Во второй части мы покажем, как можно обновить модель, используя шаблоны проектирования для решения особенно сложных визуальных задач.
Агентный подход к визуальному мышлению
Для начала давайте рассмотрим, как человек решил бы задачу с пропавшей банкой. При решении этой задачи я сначала нахожу пустую область в сетке из банок. Затем я располагаю банки рядом с пустой областью; в данном случае над и под ней. Чтобы подсчитать количество пропавших банок, я создаю своего рода сетку, чтобы видеть, что над пустым местом находятся две банки, и, следовательно, пустое место должно состоять из двух пропавших банок.

VLM не очень хороши в локализации, поэтому, вероятно, не смогут найти область, которая выглядит пустой, как это сделал я. Поскольку они не очень хороши в локализации, они также не смогут определить местоположение банок с газировкой, но существует множество инструментов, которые могут справиться с этой задачей, например, CountGD. Поэтому первой задачей агента может быть поиск инструмента, способного обнаружить банки с газировкой.

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

На основе этих шагов вы можете начать формировать агентную структуру . Мы можем разделить её на три основных компонента:
- Выбор агентного инструмента и подзадачи – Общая задача делится на решаемые подзадачи. Например, в нашем примере первая подзадача была сформулирована для обнаружения банок с газировкой, вторая – для построения сетки, а последняя – для сопоставления обнаруженных банок с ячейками сетки для поиска недостающих банок. Для каждой подзадачи оптимальный выбор инструмента должен быть выполнен агентным способом.
- Составление подзадач – Нам нужно было составить подзадачи таким образом, чтобы результаты предыдущих подзадач можно было использовать для решения новых. Например, для построения сетки нам требовались данные обнаружения банок из предыдущей подзадачи, а для поиска недостающих банок – данные сетки и данные обнаружения банок из двух предыдущих подзадач.
- Визуальные шаблоны проектирования . Наконец, поскольку VLM испытывают трудности с задачами, требующими визуального мышления, нам нужно дать агенту подсказку, рассказав ему о шаблоне проектирования, который он может использовать для решения этой проблемы. Например, предложив ему построить сетку и использовать её для обнаружения пропавших банок. Мы подробно рассмотрим это в следующей публикации блога.
Реализация агента визуального рассуждения
Для реализации этого визуально-рассуждающего агента нам необходимо включить три упомянутых выше компонента. Однако прежде чем это сделать, нам нужна структура данных, которая может обрабатывать как входные, так и выходные данные этих компонентов, что позволит агенту беспрепятственно их наблюдать и использовать. Один из способов добиться этого — заимствовать концепцию потока событий из «Open Hands».
Структура данных потока событий
Поток событий — это структура, которая:
- Сохраняет сообщения пользователей и сообщения агентов
- Отправляет действия (например, вызовы внешних инструментов)
- Фиксирует результаты или наблюдения этих действий

Обратите внимание, что на диаграмме, упомянутой выше, в поле слева указаны USER , AGENT и OBSERVATION . Каждое сообщение AGENT может содержать:
- теги
для принятия решения о том, что делать дальше, - Теги
отражают подход из статьи «Действия исполняемого кода способствуют повышению эффективности агентов LLM». Было показано, что предоставление агенту возможности выполнять код (а не просто возвращать текст/JSON) повышает производительность. Мы позволяем ему выполнять эти фрагменты Python в среде, похожей на блокнот Jupyter. Мы называем этого основного агента агентом-планировщиком.
Выбор агентских инструментов и подзадачи
Определив поток событий и базовый рабочий процесс, мы теперь можем обсудить реализацию трёх основных компонентов нашей агентской инфраструктуры. Возвращаясь к примеру с банкой газировки:
- Выбор инструмента для обнаружения банок с газировкой. Первая подзадача — обнаружение самих банок с газировкой. Мы делегируем эту задачу специализированному подагенту — агенту выбора инструмента, который имеет доступ к нескольким инструментам обнаружения объектов. Его задача — запустить эти инструменты на изображении и выбрать тот, который лучше всего подходит для нашей текущей задачи. Поскольку мы используем код как действие, это можно представить функцией get_tool_for_task(image, description) , которая возвращает документацию (или ссылки) для выбранного инструмента.

Агент использует «get_tool_for_task» для сравнения нескольких детекторов (OwlV2 и CountGD), автоматически выбирая тот, который лучше всего подходит для обнаружения банок с газировкой.
- Почему выбор инструмента важен? Выбор правильного инструмента — сложная задача, поэтому мы используем специальный агент выбора инструмента. Сначала агент интерпретирует запрос, чтобы определить, что именно мы обнаруживаем. Он находит соответствующие инструменты и их документацию, пишет код для тестирования каждого инструмента на изображении и выводит результаты. Затем агент-оценщик сравнивает эти результаты со своим приблизительным прогнозом.
Примечание к агенту-судье: Агент-судье не обязан предоставлять точное количество — ему достаточно определить, какой результат обнаружения наиболее правдоподобен, основываясь на приблизительных рассуждениях. Например, если эксперт предполагает 28 банок, но видит, что один инструмент показывает 5, а другой — 27, он может исключить 5 как слишком большую погрешность. Это позволяет системе выбрать наилучший доступный инструмент, не требуя от эксперта идеальной работы. Также возможен вариант замены агента-судьи человеком — иногда простая визуальная проверка быстрее, чем подробная маркировка всего.
Составление подзадач
Как только у нас появится нужный инструмент, создание подзадач станет простым благодаря нашему подходу «действия как код». Агент планировщика использует Python для передачи выходных данных одной подзадачи в качестве входных данных для другой. Например:
# Шаг 1: Загрузите изображение и выберите лучший инструмент для обнаружения банок с газировкой image = load_image( «image.png» ) get_tool_for_task( «Определить все банки с газировкой на изображении» , [image]) # Шаг 2: Используйте выбранный инструмент (например, CountGD) для выполнения обнаружения detectors = countgd( «soda can» , image) # Шаг 3: Создайте шаблон сетки на основе обнаружений grid = create_grid_pattern(detections)
Модульная структура упрощает отладку каждого этапа. Если обнаруженные поля выглядят некорректно, планировщик может попробовать другой порог достоверности или переключиться на другой инструмент. Поскольку каждое действие представляет собой исполняемый код Python, процесс повторного запуска или повторной параметризации происходит гладко и прозрачно.
Шаблоны визуального дизайна
Последний компонент — визуальные шаблоны дизайна . Мы реализуем это, предоставляя агенту-планировщику специальное действие под названием «предложения», которое служит для поиска известных шаблонов дизайна, релевантных нашей задаче. Агент-планировщик отправляет запрос и изображение, получая предложение «визуального шаблона дизайна», если оно доступно.
Что такое шаблоны визуального проектирования?
Прежде чем мы углубимся в детали этого компонента, важно определить контекст. Если вы когда-либо работали над проектами визуального ИИ, вы, вероятно, знаете, что существуют определённые визуальные закономерности в изображениях и задачах, которые можно выявить и использовать для выбора из набора методов, подходящих для решения этих задач. Возьмём, к примеру, шаблон визуальной сетки и соответствующий шаблон проектирования с использованием модели обнаружения объектов для построения сетки и определения отсутствующих объектов. Этот же шаблон на самом деле встречается во многих различных ситуациях:


Итак, вы видите, как шаблон проектирования для решения одного типа проблем может быть применен во многих случаях использования.
Реализация шаблона визуального проектирования
Для создания компонента шаблона визуального проектирования мы пометили различные изображения и вопросы пользователей, а также соответствующие шаблоны проектирования, используемые для их решения. Компонент работает, принимая целевое изображение и запрос, сгенерированный планировщиком, например: «Как подсчитать количество недостающих банок газировки на этом изображении?». Затем компонент определяет, соответствуют ли изображение и запрос одному из отмеченных нами визуальных шаблонов. Если да, он извлекает решение шаблона проектирования, представляющее собой псевдокод решения задачи, содержащей этот визуальный шаблон. Затем он возвращается в планировщик, описанный в предыдущей записи блога.

Например:
- Пользователь может получить подсказку: «Определите, сколько банок не хватает в этой регулярной сетке».
- Действие «Предложения» проверяет, применима ли какая-либо известная закономерность (например, расположение на основе сетки).
- Если соответствие есть, действие возвращает схему шаблона проектирования: «Используйте обнаруженные ограничивающие рамки для определения ячеек сетки, затем сравните каждую ячейку, чтобы определить, какие из них пустые».
- Такой подход помогает планировщику решать более сложные задачи, следуя структурированным стратегиям, особенно когда простого обнаружения недостаточно.
Ниже представлен пример шаблона проектирования, используемого для поиска объектов разных размеров. Видно, что это псевдокод, который можно отправить главному агенту-планировщику, чтобы помочь ему решить задачу. Инструменты не указаны явно, а заключены в скобки с описанием необходимых инструментов. Таким образом, можно свободно выбрать любой инструмент, подходящий для выполнения задачи, описанной в скобках.
<план> # Вы пытаетесь упорядочить объекты по сравнительным группам, например, по малым и большим или # по малым, средним и большим. Для этого сначала необходимо обнаружить объекты, затем вычислить # интересующую группу (например, площадь, длину окружности и т. д.) и, наконец, использовать # алгоритм кластеризации для группировки объектов по нужным группам. Вы можете использовать # следующий код для выполнения этой задачи: from sklearn.cluster import KMeans import numpy as np detects = < инструмент обнаружения, который также включает маски сегментации> ( «object» , image) def get_area(detection): return np.sum(detection[ «mask» ]) areas = [get_area(detection) for discovery in detects] X = np.array(areas)[:, None ] kmeans = KMeans(n_clusters= <количество кластеров> ).fit(X) biggest_cluster = np.argmin(kmeans.cluster_centers_) largest_cluster = np.argmax(kmeans.cluster_centers_) clusters = kmeans.predict(X) largest_detections = [ discovery for discovery, cluster in zip(detections, clusters) if cluster == largest_cluster ] largest_detections = [ обнаружение для обнаружения, кластер в zip(обнаружения, кластеры) если кластер == largest_cluster ]
Проблема с визуальными шаблонами проектирования заключается в том, чтобы предоставить планировщику правильные шаблоны для решения задачи. Слишком большое количество ненужных шаблонов проектирования может запутать его, а отсутствие правильного шаблона может привести к провалу.
Собираем все вместе
Теперь, когда мы рассмотрели все три компонента: выбор инструментов агента и подзадачи, составление подзадач и шаблоны визуального проектирования, как они работают вместе? Мы даём агенту-планировщику бюджет в 10 шагов для решения задачи, а также предоставляем планировщику возможность использовать библиотеки, такие как Matplotlib, для построения графиков и визуализации результатов. Это позволяет планировщику пройти по заданному пути, решить, что результаты ему не нравятся, а затем вернуться и найти новый путь. Например, планировщик может использовать план, описанный в этом блоге, для поиска банок с газировкой, но после визуализации результатов решить, что CountGD справился недостаточно хорошо. Затем он может вернуться и найти инструмент для фильтрации результатов CountGD, например, SigLIP, а затем начать новый план, в котором он обрезает объекты CountGD и фильтрует их с помощью SigLIP для повышения производительности.

Благодаря этим компонентам и агентному рабочему процессу мы теперь можем лучше рассуждать о задачах зрения.
Подход, который мы использовали в VisionAgent, можно рассматривать как синтез программ — тема, обсуждаемая в статье Франсуа Шолле «О мере интеллекта», где интеллектуальная система генерирует «программу», которую можно использовать для решения задачи.

Здесь VisionAgent — это «интеллектуальная система», а программа, которую она генерирует для данной задачи, — «программа навыков». Наши задачи отличаются тем, что они связаны с проблемами со зрением, поэтому не требуют ответа или оценки. Однако можно также представить наши задачи как оценку решения VisionAgent человеком, который может дать ответ VisionAgent, если тот не выполняет задачу должным образом, или оценить её с помощью оценки.
Заключение
В этой статье мы рассказали, как использовать шаблоны визуального проектирования для дальнейшего развития навыков визуального мышления наших агентов. С их помощью можно делать множество интересных вещей, помимо поиска пропавших банок с газировкой, например, отслеживать шар в очереди в бильярде или подсчитывать количество мелких винтов на столе. Вы можете ознакомиться с исходным кодом https://github.com/landing-ai/vision-agent, если хотите поэкспериментировать. Вот ещё несколько примеров того, что может VisionAgent:
Подсказка: Подсчитайте количество пропавших банок из-под газировки и обведите их рамкой.

Подсказка: Посчитайте мелкие винты на изображении.

Источник: landing.ai



























