3,583 papers
arXiv:2610.09313 81 7 окт. 2026 г. FREE

Безопасная нарезка изображений: как заставить VLM увидеть мелкие объекты на больших картинках

КЛЮЧЕВАЯ СУТЬ
Удвоил бюджет пикселей — объект стал виднее всего на 41%. Растёт корень из двух, а не вдвое. Метод безопасной нарезки позволяет находить и пересчитывать мелкие объекты на больших картинках: чертежи, скриншоты, фото полок. Фишка: каждый фрагмент показывай не мельче, чем объект виден на целой картинке, а соседей перекрывай минимум на один объект. Каждый фрагмент получает свой набор визуальных токенов (плиток), и объект виден крупно. В среднем нарезка не вредит, а чаще заметно улучшает результат.
Адаптировать под запрос
⚡

TL;DR

Исследование показывает, как правильно резать большое изображение на фрагменты, чтобы модель с «глазами» (VLM, vision-language model) находила мелкие объекты и не теряла ничего по пути. Правило простое. Каждый фрагмент показывай не мельче, чем объект виден на целой картинке. Соседние фрагменты перекрывай хотя бы на размер одного объекта. Тогда нарезка в среднем не ухудшает результат, а чаще заметно улучшает.

Главная боль: вы отправляете чертёж, скриншот или фото полки целиком, а модель находит то 15 объектов из 23, то 9. Причина в устройстве входа. Модель сжимает картинку до фиксированного бюджета «визуальных токенов» (кусочков-плиток). Объект на большом листе получает меньше одной плитки на сторону и превращается в пятно. Удвоение бюджета почти не спасает, а на самом деле растёт только корень из него. Если запихнуть в один вызов ещё и много объектов сразу, точность падает и от количества. Хуже того, у некоторых моделей «режим высокого разрешения» сработал хуже обычного.

Метод в три хода. Сначала режь картинку на фрагменты с перекрытием. Потом смотри каждый фрагмент отдельным запросом. В конце собери ответы и убери дубли на стыках. «Безопасно» здесь значит: нет фрагмента, который показывает объект мельче, чем целая картинка, и нет объекта, который не лежит целиком хотя бы в одном фрагменте.

🔬

Схема метода

ШАГ 1: Оцени размер объекта (в пикселях) и лимит модели на картинку
ШАГ 2: Выбери размер фрагмента ≈ лимит модели БЕЗ ужатия (чтобы модель не уменьшала его сама)
ШАГ 3: Режь с шагом = размер фрагмента − размер объекта (перекрытие ≥ 1 объект)
ШАГ 4: Каждый фрагмент → отдельный запрос → список объектов с координатами во фрагменте
ШАГ 5: Переведи координаты в общие, убери дубли на стыках → итоговый список

Шаги 1–3 — подготовка (вручную или скриптом). Шаг 4 — отдельные запросы. Шаг 5 — один запрос или таблица.
🚀

Пример применения

Задача: Сметчик строительной компании получил чертёж электрики на этаж ЖК. Лист примерно 11000×7700 пикселей. Нужно пересчитать розетки и выключатели по легенде для сметы в рублях. Если отправить лист целиком, значок становится точкой, и считают модели с ошибкой.

Промпт (на каждый фрагмент; фрагмент вырезан с перекрытием в один значок):

Это фрагмент {N} из {всего} большого чертежа электрики. Фрагмент вырезан из листа без уменьшения масштаба.
Перекрытие с соседними фрагментами — около 60 пикселей.

Эталон символа «двойная розетка» — на приложенной картинке-легенде.

Задача: найди ВСЕ двойные розетки в этом фрагменте.
Для каждой выдай центр символа в пикселях фрагмента (x, y).
Если символ обрезан краем фрагмента — всё равно перечисли его и пометь «на границе».
Ничего не выдумывай: если не уверен — пометь «сомнение».

Формат: таблица | № | x | y | статус (чётко / на границе / сомнение) |
В конце: общее число найденных во фрагменте.

Результат: по каждому фрагменту придёт таблица с координатами и статусами и итоговое число. Фрагментов будет около двух десятков, и в каждом найдётся несколько значков. На последнем шаге вы (или отдельный запрос) переведёте координаты в общие и удалите дубли на стыках: точки ближе размера значка считаются одним объектом. Сумма даст цифру для сметы. Список «на границе» и «сомнение» вы проверите глазами.

🧠

Почему это работает

Слабость: у модели бюджет на изображение: она режет картинку на плитки, и всего их ограниченное число. Большой лист сжимается, и объект получает долю плитки. Удвоение бюджета поднимает «видимость» только на 41%. Кроме того, чем больше содержимого в вызове, тем хуже модель перечисляет всё подряд. Поэтому у большой картинки две проблемы сразу: объекты мелкие и их слишком много за один раз.

Сильная сторона: модель хорошо находит объекты, если они крупные и их мало. Нарезка даёт обе вещи одновременно: масштаб растёт, содержимое на вызов падает. Перекрытие в один объект гарантирует, что ни один объект не окажется разрезанным по границе без «целой» копии где-то ещё.

Рычаги управления: - Размер фрагмента → меньше фрагмент = крупнее объект, но больше вызовов. Максимум — то, что модель не ужимает сама. - Перекрытие → минимум один объект. Меньше — потеряешь объекты на швах. Больше — больше дублей и токенов. - Масштаб относительно целого → не уменьшай. Типичный вред: «приведу объекты к одинаковому размеру в пикселях и порежу». Если объект уже крупный, фрагменты окажутся мельче целого, и результат хуже. - Режим высокого разрешения → не включай по умолчанию. У части моделей он давал катастрофу. Проверь на 2–3 примерах. - Рисование сетки, меток, стрелок поверх → не добавляет информации. Помогает кроп, а не оверлей.

📋

Шаблон промпта

В статье готовых промптов нет. Исследование даёт правило нарезки. Шаблон ниже — обвязка вокруг него для запроса к модели на одном фрагменте.

Это фрагмент {номер} из {всего} изображения «{название_изображения}».
Фрагмент вырезан без уменьшения масштаба. Соседние фрагменты перекрываются на {перекрытие_px} пикселей.

Задача: найди ВСЕ объекты типа «{тип_объекта}» в этом фрагменте.
Как выглядит объект: {описание_или_эталон}.

Для каждого объекта выдай центр (x, y) в пикселях фрагмента.
Если объект обрезан краем — включи его и пометь «на границе».
Если не уверен — пометь «сомнение». Не выдумывай объекты.

Формат: таблица | № | x | y | статус |
В конце одной строкой: «Найдено во фрагменте: {число}».

Что подставлять: - {номер} и {всего} — порядковый номер фрагмента и общее число. - {перекрытие_px} — размер вашего объекта в пикселях (не меньше). - {тип_объекта} и {описание_или_эталон} — что ищем; по возможности приложите картинку-эталон.

Для шага сборки (отдельный запрос):

Вот {всего} таблиц с найденными объектами по фрагментам и смещения каждого фрагмента:
{таблицы_и_смещения}

Переведи координаты в общие (прибавь смещение фрагмента).
Объединяй точки ближе {порог_px} пикселей как один объект.
Выдай итоговую таблицу и общее число. Отдельно перечисли объекты со статусом «сомнение» и «на границе».

🚀 Быстрый старт — вставь в чат:

Вот шаблон безопасной нарезки изображения для поиска мелких объектов. Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля. Напиши также скрипт на Python, который режет картинку с перекрытием
и сохраняет смещения каждого фрагмента.

[вставить шаблон выше]

LLM спросит размер изображения в пикселях, размер искомого объекта и лимит выбранной модели на картинку. Эти три числа нужны, чтобы посчитать размер фрагмента и шаг нарезки по правилу из исследования. Остальное она возьмёт из шаблона.

⚠️

Ограничения

⚠️ Теория держится на двух допущениях: в среднем больше токенов на объект и меньше содержимого в вызове не вредят. Авторы это проверяли, но не везде оно выполняется одинаково.

⚠️ Режим высокого разрешения может навредить: у моделей OpenAI подача большего числа пикселей, чем по умолчанию, в ряде случаев ухудшала результат. Не считай «больше пикселей» автоматически лучше.

⚠️ Перемасштабирование «под размер объекта» вредит: если объекты и так крупные, фрагменты после выравнивания оказываются мельче целого, и качество падает в большинстве проверенных случаев.

⚠️ Нарезка не творит информацию: если на исходной картинке объект не разрешается в пикселях, увеличение не поможет. Это уже предел данных, а не токенов.

⚠️ Дубли и швы: перекрытие создаёт повторные находки. Без шага сборки и проверки итоговое число завысится.

⚠️ Много ручной работы: для листа в 20 фрагментов нужен скрипт (его может написать LLM) или терпение. Расход токенов в разы выше, чем у одного вызова.

⚠️ Область проверки: главное поле эксперимента — чертежи и планы, плюс природные и синтетические картинки. Для скриншотов, фото полок и слайдов вывод логичен, но проверялся меньше.

🔍

Как исследовали

Идея была в том, чтобы вместо очередного «трюка с зумом» описать две величины на входе: сколько плиток приходится на сторону объекта (S) и сколько содержимого модель должна охватить за вызов (L). Любой метод (тайлинг, режим высокого разрешения, зум-агент) просто двигает эти два рычага. Авторы вывели из этого теорию, а потом проверили её примерно в 177 тысячах запросов на 797 изображениях, на 11 моделях из пяти семейств. Данные: новый набор из 40 строительных чертежей, ещё 10 отложенных чертежей, планы FloorPlanCAD, природные изображения и синтетика. Гипотезы они зарегистрировали до запусков.

На контролируемых картинках ни одно из 40 предсказанных соотношений не нарушилось. В проверке постфактум на других данных подтвердилось 61 из 89, а четыре провала пришлись на модели OpenAI, которым давали больше пикселей, чем по умолчанию. Показательный провал: один из режимов высокого разрешения дал F1 0,33 на полных листах против 0,89 при стандартном. Популярный рецепт «масштабируй до фиксированного размера объекта и режь» (с плитками 44 px) снижал recall в 19 из 21 случаев. Правило с перекрытием и без уменьшения масштаба на чертежах ни разу значимо не ухудшало результат и улучшало его до +0,28. На примере листа 11236×7698 пикселей символ получил S=0,40 при целой отправке и S=1,5 при нарезке на 20 фрагментов. Это стоило 49 тысяч токенов против 2,5 тысячи, но позволило надёжно найти все 23 символа. Ещё один результат: с ростом числа блоков в одном вызове F1 первого блока падал на 0,22. Значит, объём содержимого сам по себе портит качество. Для практика отсюда вывод: резать надо не «как придётся», а по правилу, и проверять на паре примеров, не навредил ли масштаб.

💡

Адаптации и экстраполяции

🔧 Техника: убрать сетку и метки с картинки → не терять время

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

Экстраполяция (в статье не проверялась, но совпадает с её логикой про зум-агентов): правило нарезки как инструкция агенту, например в файле инструкций Claude Code.

## Работа с большими изображениями
Если нужно найти или посчитать мелкие объекты на изображении больше {лимит_px}:
1. Не отправляй изображение целиком и не включай режим высокого разрешения без проверки.
2. Нарежь на фрагменты размером не больше {лимит_px} (без ужатия), перекрытие не меньше размера объекта.
3. Не уменьшай масштаб относительно оригинала.
4. По каждому фрагменту составь список с координатами, переведи в общие, убери дубли.
5. Объекты на границе и сомнительные покажи отдельным списком для проверки человеком.
🔗

Ресурсы

  • Работа: Why VLMs Miss Small Objects, and When Zooming In Is Safe.
  • Авторы: Junzhe Shi, Shida Jiang (Systems Engineering, University of California, Berkeley), Yuan Gan (Quotr AI).
  • Код, бенчмарк REDP-X40, инструмент планирования безопасной нарезки и сырые ответы моделей: https://github.com/shijunzhe/vlm-small-objects

📋 Дайджест исследования

Ключевая суть

Удвоил бюджет пикселей — объект стал виднее всего на 41%. Растёт корень из двух, а не вдвое. Метод безопасной нарезки позволяет находить и пересчитывать мелкие объекты на больших картинках: чертежи, скриншоты, фото полок. Фишка: каждый фрагмент показывай не мельче, чем объект виден на целой картинке, а соседей перекрывай минимум на один объект. Каждый фрагмент получает свой набор визуальных токенов (плиток), и объект виден крупно. В среднем нарезка не вредит, а чаще заметно улучшает результат.

Принцип работы

Модель сжимает любую картинку до фиксированного числа плиток. Лист 11000×7700 пикселей ужимается, и значок на нём меньше одной плитки. Для модели это пятно. Отсюда знакомая боль: на одном чертеже она находит 15 объектов из 23, а в другой раз 9. Работа идёт по цепочке: оценить размер объекта → вырезать фрагменты с перекрытием → спросить про каждый отдельно → собрать ответы и убрать дубли на стыках. Правило «безопасности»: нет фрагмента, где объект мельче, чем на целой картинке, и нет объекта, который не лежит целиком хотя бы в одном фрагменте. Представь афишу на другой стороне улицы. Не разглядишь буквы. Подойди и читай по кусочку, но так, чтобы кусочки заходили друг на друга. Иначе слово на стыке потеряется.

Почему работает

У большой картинки две беды сразу: объекты мелкие и их слишком много за один вызов. Чем больше всего в кадре, тем хуже модель перечисляет всё подряд. Нарезка лечит обе беды: масштаб растёт, а объектов на запрос становится меньше. Объекты крупнее и их мало — именно в таком режиме модель находит их лучше всего. Жесть: у моделей OpenAI «режим высокого разрешения» в ряде случаев работал хуже обычного. Больше пикселей не значит лучше. Ещё хуже вредит привычка «приведу объекты к одному размеру и порежу». Если объект и так крупный, фрагменты окажутся мельче целой картинки. Качество в большинстве проверенных случаев падало. Рисование сетки, меток и стрелок поверх картинки ничего не даёт. Помогает именно вырезка, а не оверлей.

Когда применять

Чертежи и планы → пересчёт мелких символов (розетки, выключатели, датчики) для сметы, особенно когда лист огромный, а значок размером с точку. Подходит также для скриншотов, фото полок и слайдов, но там проверяли меньше. Логика та же. НЕ подходит, когда объект не виден в исходных пикселях: увеличение не создаст информацию. Не стоит резать и ради одного крупного объекта. Расход запросов вырастет в разы, а выигрыша не будет.

Мини-рецепт

1. Назови три числа: размер картинки в пикселях, размер объекта в пикселях, лимит выбранной модели на одну картинку.
2. Выбери размер фрагмента: примерно равный лимиту модели, чтобы она не ужимала его сама. Не уменьшай масштаб относительно целой картинки.
3. Режь с шагом: шаг = размер фрагмента минус размер объекта. Перекрытие минимум в один объект. Если лень считать, пусть скрипт на Python напишет сама модель.
4. Гони каждый фрагмент отдельным запросом. Проси центры объектов в координатах фрагмента и статус: <статус>чётко / на границе / сомнение. По возможности приложи картинку-эталон объекта.
5. Сдвинь координаты: прибавь смещение фрагмента, получишь общие координаты.
6. Склей дубли: точки ближе размера объекта считай одним объектом. Это можно сделать запросом или таблицей.
7. Проверь глазами всё со статусами «на границе» и «сомнение». Режим высокого разрешения не включай по умолчанию: сначала сравни на 2–3 примерах.

Примеры

[ПЛОХО] : Посчитай все двойные розетки на этом чертеже (лист 11000×7700 целиком, значки превращаются в точки)
[ХОРОШО] : Это фрагмент 7 из 21 большого чертежа электрики. Фрагмент вырезан без уменьшения масштаба. Перекрытие с соседями около 60 пикселей. Эталон символа «двойная розетка» на приложенной картинке. Найди ВСЕ двойные розетки в этом фрагменте. Для каждой выдай центр (x, y) в пикселях фрагмента. Если символ обрезан краем, перечисли его и пометь «на границе». Не уверен — пометь «сомнение». Ничего не выдумывай. Формат: таблица | № | x | y | статус |. В конце: общее число найденных во фрагменте. Потом отдельный запрос на сборку: Вот 21 таблица и смещения каждого фрагмента. Прибавь смещения, получи общие координаты. Точки ближе 60 пикселей считай одним объектом. Выдай итоговую таблицу и число. Отдельно перечисли объекты со статусами «сомнение» и «на границе».
Источник: Why VLMs Miss Small Objects, and When Zooming In Is Safe
ArXiv ID: 2610.09313 | Сгенерировано: 2026-10-08 05:00

Проблемы LLM

ПроблемаСутьКак обойти
Модель с «глазами» теряет мелкие объекты на большой картинкеОтправляешь чертёж, скриншот или фото полки целиком. Модель делит картинку на ограниченное число плиток (визуальных токенов). Большой лист сжимается, и объект получает меньше одной плитки на сторону. Он становится пятном. Результат нестабильный: то 15 найденных объектов из 23, то 9. Удвоение числа плиток почти не помогает: видимость растёт примерно в 1,4 раза. Это проблема для любых задач на подсчёт и поиск мелкого на крупном изображенииРежь картинку на фрагменты с перекрытием. Смотри каждый отдельным запросом. Подробности в методе ниже
Режим «высокого разрешения» иногда работает хуже обычногоВключаешь подачу большего числа пикселей. Ждёшь улучшения. У части моделей результат падает, иногда сильно. Причину не видно, ответ выглядит нормальноНе включай режим по умолчанию. Проверь на 2–3 примерах с известным ответом. Если не помогло, режь картинку на фрагменты вместо увеличения

Методы

МетодСуть
Безопасная нарезка с перекрытием — мелкие объекты становятся видныЧто делать: 1) Оцени размер объекта в пикселях и лимит модели на картинку. 2) Режь фрагменты размером примерно с этот лимит, без сжатия. 3) Шаг нарезки = размер фрагмента минус размер объекта. Соседние фрагменты перекрываются минимум на один объект. 4) Каждый фрагмент — отдельный запрос. Проси координаты во фрагменте. 5) Переведи координаты в общие: прибавь смещение фрагмента. Слей точки ближе размера объекта. Что писать в запросе: Это фрагмент {N} из {всего}. Вырезан без уменьшения. Перекрытие {px} пикселей. Найди ВСЕ объекты «{тип}». Выдай центр (x, y). Обрезан краем — пометь «на границе». Не уверен — «сомнение». Не выдумывай. Формат ответа: таблица № | x | y | статус. Почему работает: нарезка даёт сразу две вещи. Объект крупнее в кадре, а объектов на вызов меньше. Перекрытие гарантирует, что каждый объект целиком лежит хотя бы в одном фрагменте. Два правила безопасности: фрагмент никогда не мельче, чем объект на целой картинке. И нет объекта, разрезанного на всех фрагментах сразу. Когда да: чертежи, планы, скриншоты, фото полок, слайды, где нужно найти или пересчитать много мелких объектов. Когда нет: объект не виден в исходных пикселях. Нарезка не создаёт информацию. Также нужен шаг слияния, иначе число завысится из-за дублей на стыках. Вызовов будет много, расход токенов вырастет в разы. Скрипт нарезки может написать сама модель

Тезисы

ТезисКомментарий
Чем больше объектов в одном вызове, тем хуже модель их перечисляетМодель хорошо находит объекты, когда они крупные и их мало. Много целей в одном ответе снижают полноту, даже если каждая видна. Это работает независимо от размера картинки. Применяй: дроби большой поиск на несколько запросов с малым числом целей. Проси не «найди всё на листе», а «найди всё в этой части»
Уменьшать фрагмент относительно целой картинки вредноСоблазн: привести все объекты к одному размеру в пикселях и потом резать. Если объект на исходной картинке уже крупный, такие фрагменты окажутся мельче целого. Модель видит объект хуже, чем без нарезки. Применяй: перед нарезкой сравни масштаб. Объект во фрагменте должен быть не мельче, чем на целом изображении. Лучше не менять масштаб вообще
📖 Простыми словами

Why VLMs Miss Small Objects, and When Zooming In Is Safe

arXiv: 2610.09313

Зрительные нейронки (VLM) слепнут на тяжелых картинках не от глупости, а из-за жесткого бюджета токенов. У модели есть фиксированный лимит плиток, на которые она рубит входящий кадр: если залить гигантский чертеж, она сожмет его в невнятную кашу. Мелкий значок превращается в жалкую долю пикселя, а удвоение вычислительного бюджета дает смешные плюс 41% к видимости. Модель просто давится, когда деталей слишком много за раз.

Это как пытаться прочитать карманную Библию с расстояния в десять метров. Формально весь текст перед глазами, но вместо строчек ты видишь только серое мыло. Если поднести линзу не вовремя, ты лишь размажешь край буквы пополам. Мозгу банально не хватает разрешения сетчатки, чтобы отделить одну запятую от другой.

Чтобы модель прозрела, изображение нужно зумить по четким правилам: здесь спасает нарезка с перекрытием. Первое — масштаб фрагмента: кусок картинки не должен делать объект визуально мельче, чем на общем плане, иначе зум превращается в фарс. Второе — нахлест соседних тайлов: границы срезов обязаны наезжать друг на друга минимум на размер одного искомого объекта. Тогда розетку или тумблер гарантированно не распилит пополам на стыке двух кадров.

Испытания гоняли на сложных чертежах размером 11000 на 7700 пикселей, но метод критически важен везде. Спутниковые снимки, поиск брака на печатных платах, медсканы или сканы таблиц с микроскопическим шрифтом — базовый VLM лажает, если пихать в него полотно целиком. Зато правильный срез превращает слепую сетку в дотошного контролера.

Короче: хватит скармливать мультимодалкам огромные простыни в надежде на «магию AI» — это гарантированный слив точности. Режь изображение на части, делай нахлест на ширину объекта, и получишь подсчет без единого пропуска. Кто внедрит эту нарезку — автоматизирует рутину, остальные будут пересчитывать розетки вручную и ныть, почему нейросети такие тупые.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с