Как стать автором
Обновить

Комментарии 5

Спасибо, что рассмотрели и сравнили разные CV методы нахождения объектов на изображении.
Но не лучше ли цепляться к поиску текста на изображении, а не маске/шаблону кнопки? Текст ведь не всегда на кнопке присутствует, да и каждый раз оригинал кнопки у вас должен быть для ваших методов.
Если честно похоже на забивание гвоздей микроскопом. Неужели вы в реальности на практике это применяете? Ведь:
1. Должно быть реально много однотипных баннеров, чтобы было целесообразно их так обрабатывать. Это тысячи штук крео, ради пары десятков, как мне кажется, нецелесообразно.
2. У вас должны быть оригиналы изображений кнопок, для поиска и отрисовки нового текста. В моей практике обычно все креативы очень разные и используется много разных подходов, графических элементов и т.п.
3. Работает только с кнопками или похожими объектами.
4. Возможны проблемы с графикой, полупрозрачность например или блюр. В таком случае элемент так просто не заменить.

Отсюда вопрос, почему не смотрите в сторону генерации креативов из исходников (со слоями), а не переделывание уже готовых изображений? Это же реально удобней и эффективней.
Например, те же actions/droplets в photoshop для чего-то примитивного. Или смотреть уже в сторону скриптов ps или скетча, в ps есть поддержка js. Да и в smartly.io и roihunter.com есть графические редакторы для генерации креативов из фида, да там, к сожалению, только для FB. Для чего-то более универсального подойдет creativemachine.co как вариант, но он пока сырой. Да или хоть тот же python + PIL.
rampeer, почему же не генерация сразу?
Хорошее замечание! Альтернативные решения за пределами «написать своё» в статье не рассмотрены — вместо этого сделан фокус на обзор методов Computer Vision, а баннеры — лишь повод. Поэтому расскажу про актуальность проблемы тут.

Да, мы не первые в мире люди, которые столкнулись с такой задачи. Существует множество сторонних решений, начиная с плагинов Фотошопа, и заканчивая отдельными тулами постобработки svg-шек, которые позволяют локализовать креативы. К сожалению, в этих инструментах предполагается, что они будут использоваться дизайнерами, работающем в конкретной программе, или в конкретном формате файла. В наших условиях тяжело навязать дизайнеру какой-то дополнительный функционал ввиду разнообразия используемых программ, того, что они фрилансеры, и из-за их общей загруженности (они — боттлнек производства баннеров). Для этого был неприхотливый инструмент, который умеет работать с разными форматами изображений, не использует какие-то предположения о том, где они были сделаны, и умеет решать наши проблемы по локализации без создания дополнительной рутины. Такого инструмента мы не нашли.

Поэтому между «заставить всех дизайнеров пересесть на единый конкретный пайплайн и набор инструментов» и «сделать свою тулу для менеджера кампаний Adwords» было выбрано второе. К слову — массовое создание и управление кампаниями в Adwords у нас тоже автоматизировано, что сыграло роль в решении (по сути, произошла автоматизация ещё одного кусочка жизненного цикла кампании).

Ради «пары десятков» баннеров это было бы и вправду нецелесообразно. Но у нас одна «болванка» превращается в несколько десятков баннеров (под разные языки, регионы и валюты), и количество производимых картинок измеряется сотнями в неделю.

* К слову, насчёт баннерогенерации — у Criteo есть интересная технология, в которой они собирают баннеры «налету» под пользователя из заготовленных кусков, и оптимизируют при этом CTR. Это занятная концепция, которая кроме локализации ещё решит ряд других наших проблем, типа оптимизации и увеличения количества создаваемых баннеров. Но риски, и потребовало бы перепостроения всего пайплайна вокруг одного конкретного продукта Criteo.

Кнопки и вправду бывают разных форм и цветов, и количество разных графических решений высоко. Но в подавляющем большинстве случаев мы ищем объект конкретных размеров и конкретной формы. У нас нет задачи замены каких-то других элементов (нарисованных товаров, например). Мы просто рисуем на готовом изображении текст для разных локалей.
Ваши кнопки имеют такое свойство: пиксели в горизонтальном направлении не меняются (тот-же цвет). И таких горизонтальных полос в кнопке много. Разницу в цветах (градиент) между полосами (по вертикали) игнорируем и ищем полосы одного цвета по горизонтали с минимальной шириной 100 px.

Потом фильтруем кандидатов и оставляем все полосы которые расположены рядом (и имеют приблизительно одинаковую длину). Получаем набор прямоугольников. Среди них нужно найти те которые не касаются краёв картинки (части фона). Можно дополнительно проверить что за краем прямоугольника есть контрастные пиксели (рамка кнопки).

Ограничение: градиент на кнопках должен быть строго вертикальным.
Сработал бы этот способ?
В третьем баннере (последняя картинка) кнопка имеет небольшой горизонтальный градиент. Поэтому давайте мерять сделаем какой-то порог по горизонтальному градиенту. Мы получили тут какой-то Edge Detector, который детектит только вертикальные границы.

Отвечая на ваш вопрос — да, конкретно для кнопок он скорее всего будет работать. Описанный вами алгоритм идейно очень похоже на вариацию на тему Contour detection — а именно и он показал себя лучше всего.

>Можно дополнительно проверить что за краем прямоугольника есть контрастные пиксели (рамка кнопки).
Эту проверку можно совместить с предыдущим этапом: проверять не только горизонтальную компоненту градиента, а весь градиент. Оно будет работать потому что вертикальная компонента внутри кнопок тоже достаточно мала. В таком случае процедуру «склейки» полосок в прямоугольник можно свести к нахождению связанных компонент пикселей, отмеченных как «равнины» (градиент меньше порога), окруженных «стенами» (градиент выше порога). А затем полученные «равнины» пофильтровать по критериям. В такой вариации сходство с описанным в статье подходом ещё более явно.
Хотел предложить дизайнерам ставить точку (точки) в альфа канале в углу (углах) кнопки что-бы обозначать место для привязки текста. Отличие между alpha 255 и alpha 254 на глаз совершенно незаметно. Альфа канал можно будет вырезать после наложения текста.

Но после прочтения комментария выше — идея попросить дизайнера о чём то кажется уже не такой хорошей :-)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий