Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
287 - Telegram Web
Telegram Web
Я одно время лидил команду VirtualSense по размещению рекламных билбордов в видео. Мы заменяли уже имеющихся билборды с подстройкой трехмерного положения и перспективы и размещали борды на ранее пустующих слотах. Поэтому, вспоминая прошлый опыт, сегодня хочу пройтись по 3D Computer Vision алгоритмом, с помощью которых решается такая задача.

Она формулируется, как сопоставление изображения с помощью ключевых точек. Задача сводится к поиску конкретного объекта на одном изображении с помощью другого, эталонного.

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

Также нужно ввести понятие дескрипторов - векторов, которые описывают точку и ее окружение. У разных ключевых точек они должны быть сильно различны, а у одинаковых – максимально схожи.

SIFT
Один из первых и самых известных алгоритмов для нахождения ключевых точек – это SIFT (Scale-Invariant Feature Transform). Его будем использовать, когда не требуется решить что-то сверхсложное и нужно быстро и легко найти ключевые точки.

▶️ Как работает?
Картинка сворачивается с фильтром (обычно гауссианой). Далее берут разность между двумя картинками с разным ядром. Потом на результатах находят экстремумы – области с наибольшей и наименьшей интенсивностью.

Далее, зная размер ключевой точки, мы можем посчитать дескрипторы и поворот точек. Для этого используем Histograms of oriented gradients (HoG). Для этого разбиваем область под ключевой точкой на 16 квадрантов, посчитаем градиенты по картинке, оставим только направления. Для каждого квадранта посчитаем гистограммы направлений, а потом сделаем конкатенацию гистограмм. Для поиска поворота ключевой точки найдём направление с наибольшим значением и будем считать, что это верх ключевой точки.

▶️ Почему SIFT может не справляться?
- Во-первых, сложные задачи, а порой даже довольно простые сцены, часто вызывают у него затруднения – для корректного срабатывания требуется большое пересечение между кадрами.
- Во-вторых, алгоритм не устойчив к изменению угла обзора. Даже если мы просто применим аффинное преобразование к изображению — качество упадёт.
- В-третьих, сложности возникают и с похожими паттернами: на одинаковом паттерне (обои, например) у разных ключевых точек будут одинаковые дескрипторы, из-за чего нормально сопоставить изображения не получится.

Зато SIFT быстрый, его легко запустить, и ему не нужен GPU. Поэтому он используется в качестве бейзлайн решения.
На прошлой неделе удалось посетить парижский офис Google в рамках тренинга DSP DV360.

Поскольку я много работаю на стороне Supply, то было интересно познакомиться с тем, что происходит на той "другой" стороне у рекламодателя.

Сегодня пройдусь кратко по иерархии объектов при настройке кампании в DV360

- Partner. Под партнером чаще подразумевается рекламное агенство, например Publicis или Dentsu, они аггрегируют мелкие и средние марки и предоставляют услуги медиа-байеров, которые откручивают кампании

- Advertiser. Как понятно из названия, рекламодатель (клиент), который хочет закупить кампанию

- Campaign (Media Plan). Здесь сетапим кампанию и верхне-уровнево ее цель. Например выбираем брендинг с таргетами CPM и охвата. Или performance с таргетом CPA, CPC

- Insertion Order (IO). В рамках одной кампании можно создать несколько сущностей IO и задать для каждой таргетинг по умолчанию, частоту показов (frequency capping), гео, budget pacing, brand safety

- Line Item (LI). Это самая маленькая сущность. Здесь мы уже можем взаимодействовать непосредственно с мультипликаторами бидов, форматами в зависимости от площадки, на которую льем (пример форматов на YouTube), назначать креативы, таргетинг etc.

Также нужно иметь в виду, что настройки ниже по иерархии оверрайдят настройки выше. Т.е. если вы указали таргетинг на LI, он будет превалировать над дефолтным таргетингом на IO
Типы контрактов в DV360

Продолжаем тему медиа байинга в DSP Google DV360. Сегодня рассмотрим типы доступных сделок

▶️ Non-Guaranteed

Open Auction
Открытые аукционы или Open Exchange. One-to-Many подход. Инвентарь доступен всем с назначенным reserve price'ом (минимальной ценой ставки или floor). Сделки для самого дешового инветаря, который не удалось продать в Preferred Deals. Здесь ни платформы, ни паблишер особо не запариваются над заполнением (fill rate может значительно проседать до единиц процентов) и оптимизируют только маржу.

Private Auction
Приватная сделка, где инвентарь продается партнерским агенствам (One-to-Few). Далее аналогично: назначаем floor, и поскольку показы non-guaranteed, оптимизируем маржу

Preferred Deals
Уже более эксклюзивная сделка, где агенство закупает инвентарь напрямую (One-to-One). Поскольку бюджеты открутки трафика выше, чем на первых двух типах, то здесь уже значительное внимание уделяется brand-safety, проверку которого можно настроить в самом DV360 или через third-party сервисы, например, DoubleVerify. Трафик продается по фиксированному CPM, что с одной стороны обеспечивает паблишеру стабильную монетизацию, а с другой на фиксированный CPM может не быть спроса. В этом случае траф продается по Private или Open Auction.

▶️ Programmatic Guaranteed
Тип сделок, расчитаный на премиум паблишеров. Трафик продается по принципу Minimum Revenue Guaranteed, т.е. по контракту, заключаемому между агенством и паблишером напрямую раз в квартал на открутку, например 500к показов на кампанию, по фиксированному CPM. Показы предзакупаются в самом начале и далее DSP обязаны любой ценой открутить это фиксированное количество показов. Маржу ставят невысокой, и смотрят в основном на долю заполнения fill rate.
В прошлой статье по задаче сопоставления изображения с помощью ключевых точек мы рассмотрели самый простой алгоритм SIFT. Он доступен из коробки в OpenCV, не требует обученых моделей, и его часто применяют в качестве бейзлайна.

Но поскольку SIFT имеет свои ограничения и корректно срабатывает, только когда имеются большие пересечения между кадрами нам нужен алгоритм, который будет способен обучиться матчить определенные сцены и генерировать дескрипторы под ключевые точки.

SuperPoint
Первым из таких алгоритмов является SuperPoint. Он основан на свёрточной сетке, с двумя выходными головами:

- Одна голова отвечает за классификацию ключевых точек: определяет, является пиксель ключевой точкой или нет.
- Вторая голова генерирует дескрипторы для каждого пикселя. Здесь каждый дескриптор – это вектор размерностью 128.

Для обучения модели используются два основных лосса:
- Кросс-энтропия для классификации ключевых точек.
- Hinge Loss для дескрипторов.

Как обучать SuperPoint?
- Генерируем синтетические данные. Создаём изображения, на которых будет понятно, где нужно разместить ключевые точки. Квадраты, линии, чёрточки, сетки, всё на фоне гауссового шума. Выучиваем сеть на этих данных и называем её MagicPoint.

- Для получения разметки на реальных картинках применяем аффинные преобразования, homography adaptation например, меняем ракурс, масштаб etc. После этого прогоняем через MagicPoint эти картинки, а предсказанные точки объединяем. Таким образом, получаем разметку на предсказание ключевых точек.

- Обучаем сетку. Считаем матрицу M применения homography adaption. Мы можем взять ключевые точки с одной матрицы и спроецировать их на другую.


kp1_projected = cv2.perspectiveTransform(kp1_np.reshape((1, -1, 2)), M)[0, :, :]
dists = cdist(kp1_projected, kp2_np)

M = sample_homography_alb(image)
warped = cv2.warpPerspective(src=image, M=M, dsize=(image.shape[1], image.shape[0]))


Сопоставив дескрипторы между двумя версиями изображения, будем оценивать расстояние между ними: если расстояние маленькое, то это одна и та же точка, и такие дескрипторы и нужно в конечном счёте стянуть. В итоге нейросеть обучается на основе сопоставления расстояний между точками и их дескрипторов, минимизируя ошибку в сопоставлении.
Сегодня у нас инфографика. Памятка для медиа байеров и планнеров. Перед тем как подключать очередную инновационную DSP с таргетингом по ChatGPTи DCO, проверьте базовые вещи

- антифрод
- качество инвентаря
- brand safety
- сегменты пользователей
- возможность идентификации пользователей без 3rd party cookies
Как поймать прод, если он падает?

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

Сегодня разберем, что делать, когда инцидент уже просходит, и, например,
- у сервиса отпал регион
- трафик на платформу клиент перестал фильтроваться
- произошел резкий скачек QPS входных запросов, ваш кластер машин не вывозит
- latency резко увеличился и не хочет уменьшаться etc.

1️⃣ Для начала, сразу после того, как вам пришло уведомление, или вас пинганул менеджер, оцените ущерб (или по-модному blast radius). Для таких целей у вас должен быть доступ в аналитическую БД, куда аггрегируются ивенты (по аукционам, пользователям, минутам, регионам), и где вы можете, написав SQL запрос, оценить, на каком регионе, клиентской DSP, сегменте пользователей имеет место инцидент. А еще лучше для таких целей иметь уже готовый дашборд с основными аггрегатами и группами.

2️⃣ После того, как оценили ущерб, определяем состояние сервиса:
- operational: работает, возможно с небольшой долей ошибок
- degraded performance: значительная доля ошибок, ухудшен пользовательский опыт, ухудшено качество ML моделей, но основные сценарии работают или резервные (fallback) модели подхватили трафик
- partial outage: часть функционала отпала, отпал регион, полностью не отправляются запросы на конкретные DSP
- major outage: все полегло

После того, как оценили состояние, эскалируем инцидент своему менеджеру и команде инфры

3️⃣ Локализуйте проблему. Постарайтесь определить, из какого сервиса происходит причина инцидента. Если причина на сервисе, куда вы ранее не контрибьютили, пингуйте соответствующие команды, чтобы они подключились и проверили свои зоны ответственности.

4⃣️️️️️️ Пока ищется причина инцидента сфокусируйтесь на том, чтобы оживить прод (по-модному stop bleeding) - проверьте, какие были крайние коммиты, связанные с ошибками, и откатите их.

Если проблема в новых артефактах, которые кеширует сервис, то зачистите кеш (если у вас есть доступ) и перезалейте рабочие или fallback артефакты.

Если проблема в повышенном использованием CPU/ RAM от выброса трафика, upscal'ите машины на кластере

Детально исследовать, что именно привело к инциденту можно уже после - когда проблема решена.

5️⃣ Если все разрешилось - продолжайте мониторить и составьте postmortem. В нем укажите
- Оцененный ущерб
- Проанализируйте причину, почему так произошло
- Укажите ваши действия, и в какие сроки вы их предприняли

Что делают в это время менеджеры и аналитики?
- помогают связаться со стейкхолдерами (чтобы те были в курсе происходящего и могли со своей стороны что-то сделать - например, включить fallback) или нужными командами разработки
- смотрят на метрики и помогают оценить ущерб и в целом состояние приложения
- помогают эскалировать в нужную команду

Также рекомендую хорошую статью, как поднимают упавший прод на Ozon'е
Хочу рассказать про курсы по Введению в MLOps и Advanced MLOps, которые мы сделали совместно с miracl6. Цель этих программ - дать базу того, как строить пайплайны, выкатывать ML сервисы и мониторить их.

▶️ Что здесь есть?
- Как должен выглядеть продовый ML проект
- Как делать воспроизводимые эксперименты
- Как написать REST сервис + знакомство с Docker
- Планировщик задач Airflow
- Мониторинг
- Kubernetes
- Как поднимать инфраструктуру
- Как обрабатывать потоки данных

▶️ Каждое занятие разбито на две части
- теория: я в основном поясняю о том, как делают в индустрии, и какие инструменты есть на рынке
- практика: на протяжении всего курса пишем сервис по предсказанию кликов в программатик рекламе и на каждом занятии добавляем новый функционал

▶️ Какие требования?
- Для первого курса достаточно знать базу по Python и командную строку Linux
- Для второго курса желательно также понимать, как работает Git и REST сервисы

Для затравки есть бесплатный вебинар, который я ранее записывал

Если думаете в сторону разработки, не уходя далеко от машинного обучения, то MLOps станет хорошим фундаментом.
2025/05/30 03:09:45
Back to Top
HTML Embed Code: