На днях вышла новая версия модели для сегментации видео — SAM2, которая не только стала быстрее-выше-сильнее предшественника, но и нацелилась поменять весь процесс разметки видео, как с картинками это проделала первая версия модели.
Оригинальную SAM мы используем для разметки в достаточно промышленных масштабах (в том числе и для видео), и потому пройти мимо препарирования SAM2 было невозможно, но так как модель уже по верхам разобрали в тг-каналах, пейпер хорош, а то, что модель феноменальна — понятно без слов, то я постараюсь поглубже разобрать подготовку датасета/разметку и саму модель именно на сложных примерах с моими комментариями.
![SAM2 вырубает другие модели SAM2 вырубает другие модели](https://habrastorage.org/getpro/habr/upload_files/485/c29/3c2/485c293c20b79b41845035db90bc3c65.gif)
Легкое чтиво и много гифок — самое то для бодрого старта понедельничка!
Подготовка датасета
Модель была обучена на видео-датасете, который на первом шаге разметили при помощи оригинального SAM.
Как в среднем вообще делается разметка сегментации для видео?
Видео раскладывается на самостоятельные кадры, с которыми дальше и работают разметчики. После чего на первом нужном кадре (боксами, полигонами, битовой маской — кисточкой) выделяется некий объект. Затем разметчик переходит к следующему кадру, где вносятся корректировки в выделение объекта.
В реальной жизни разметчик переходит не к физически следующему кадру, а к некоторому +N кадров, так как размечать каждый кадр очень трудоемко и дорого. Кадры, на которых вносились корректировки называются «ключевыми», все кадры между ключевыми — «промежуточными» (для них строится интерполяция между двумя ключевыми, если это требуется).
Вот из нашей платформы визуальный пример на bbox для лучшего понимания: сначала я кликаю на несколько ключевых кадров (там уже выделен бокс), после чего запускаю видео с интерполяцией. Она на трех ключевых кадрах не очень точная, ибо в этом вся суть — смотреть где расчитанный промежуточный кадр расходится с реальностью и корректировать, делая его ключевым.
![Скриншот из нашей платформы elementary Скриншот из нашей платформы elementary](https://habrastorage.org/getpro/habr/upload_files/a60/801/08d/a6080108d797fbd430106df5ab5dafd7.gif)
Авторы модели сделали датасет следующим образом:
Видео собирались краудсорсерами и должны были быть максимально разнообразными: по странам, событиям, объектам и так далее. Средняя длина видео — около 14 секунд. Забавное совпадение со средней длиной видосиков из дочернего инстаграма, к слову.
Разметка собранных видео
После сбора видео приступили к его разметке.
Фаза 1: Разбили видео на кадры, обработали через SAM каждый кадр как картинку, после чего разметчики вносили корректировки там, где это требовалось. Выделяли все, что можно было выделить — и объекты и важные составные части их. В этой фазе собрали 16K масок для 1.4K видео.
![Пример автоматических масок от SAM на примере моей фото где-то на улицах Буэнос-Айреса Пример автоматических масок от SAM на примере моей фото где-то на улицах Буэнос-Айреса](https://habrastorage.org/getpro/habr/upload_files/6dc/308/078/6dc308078b55962084c3b37f0d96719b.png)
Фаза 2: На следующем этапе эта разметка использовалась для создания промежуточной модели («SAM2 Masks», S2M) для предсказаний новой разметки. Оригинальный SAM использовался только для первого кадра, после чего на все остальные кадры маску предсказывала S2M, снова вносились корректировки, пока маска не становилась идеальной. В этой фазе модель S2M итеративно переобучали два раза и суммарно собрали 63.5K новых масок.
Фаза 3: В фазе три в разметке использовалась уже полноценная модель SAM 2 с блоком памяти, и разметчики уже просто докликивали все нужные маски. Модель тут интеративно переобучали 5 раз и попутно собрали 197K новых масок.
Валидация: на каждом шаге отдельной группой разметчиков производилась валидация. Сначала они проверяли корректность выделения самих масок. Затем непосредственно сам трекинг, то есть насколько хорошо маска выделена на длине всего видео. Все, что было выделено некачественно — переразмечалось, все что было сильно неоднозначно — выкидывалось.
Как итог подход был следующим: собираем сначала немного масок долго и вручную, все валидируем, учим на них легкую модель и с ее помощью собираем еще больше, валидируем, после чего попутно улучшаем модель и собираем еще и еще больше.
В итоге снизили время разметки с 37 секунд до 4.5, замеряли следующим образом: взяли разметку из фазы 3 и фазы 1 и посчитали затраченное время при высоком IoU самих масок (>0.75).
Это не новый подход, когда в процессе делается промежуточная модель, помогающая улучшить саму себя через ускорение собственной разметки, но в реальной жизни такое применяется не очень часто, увы.
Браво, молодцы.
И давайте уже смотреть, как это работает в жизни.
Тест-драйв модели и трекинга SAM2
Простые примеры — работают настолько хорошо, что с ними даже скучно. Даже оригинальный SAM очень хорош (я писал про это статью и рассказывал про наш практический опыт на ODS в VK), SAM2 получился реально быстрее и лучше. По факту у модели начинаются проблемы лишь там, где начинается либо глубокая специфика, либо в тех ситуациях, где мнения людей на тему «что считать объектом» сами по себе сильно расходятся.
Но в данной версии больше всего нас интересует трекинг. Спойлер: он очень хорош.
Изначально я хотел набрать самых сложных примеров из самых разных сфер, которые раскрывали бы работу трекера как со сложными объектами, так и сложными условиями вокруг.
Где-то в середине набора такого списка я нашел имбу среди примеров: это миксфайт.
Смотрите: объекты двигаются очень быстро, могут делать это нестандартно, могут очень резко видоизменяться (вот у нас две стоящих вертикальные фигурки, а вот они уже горизонтальные и одна перекрыта другой), да и у разных объектов часто случается сложный IoU ツ.
Детализированный трекинг, вывозящий все вызовы и тяготы миксфайта, впринципе, уже не требует примеров из попроще.
Поэтому я решил детально разобрать один пример и просто привести несколько совсем других, чтобы убедиться, что оно работает во всех доменах. В качестве эталона я взял самый быстрый нокаут в истории единоборств — потому в нем есть все, да и это просто красиво.
Итак.
![](https://habrastorage.org/getpro/habr/upload_files/322/dd8/3fe/322dd83fe29d4c148b8fd795ebe44a92.gif)
Напомню, что это было сделано в два клика (два — потому что первый клик выделял бойца почему-то без головы). Феноменально!
Для понимания в каких состояних пребывал объект за 7 секунд его трекинга.
![Разные состояния объекта трекинга Разные состояния объекта трекинга](https://habrastorage.org/getpro/habr/upload_files/fd8/712/160/fd8712160293702d1a3545c430505e64.png)
Для трекера из двух кликов тут очень хорошо вообще все. Но так как задача была докопаться до вообще чего угодно, то здесь (и у модели в целом) при пересечении двух объектов не всегда правильно определяется отношение одного к другому.
Два соседних кадра, на втором колено окончательно слилось с головой (хотя я не уверен, что в тот момент они и правда не были единым целым).
![Раскрадровка слипания объектов Раскрадровка слипания объектов](https://habrastorage.org/getpro/habr/upload_files/101/b71/508/101b715081bd717e0ad25f0467989fbe.jpg)
Данный пример экстремальный (сильно), но такая проблема действительно есть и она сама по себе сложная.
Еще один пример слипания при наступлении ноги на ногу.
![Наступание ноги на ногу привело к слипанию объектов Наступание ноги на ногу привело к слипанию объектов](https://habrastorage.org/getpro/habr/upload_files/48f/8e4/5a6/48f8e45a694d1e9e987729bf48a05da4.jpg)
Действительно ли это проблемы? Конечно же нет, результат хорош и сам по себе, а если учесть что это было всего лишь в два клике — он чертовски хорош.
Может быть, попробуем трекать составную часть объекта? На этом же примере я решил выделить шорты — и они тоже сработали хорошо.
![](https://habrastorage.org/getpro/habr/upload_files/a9e/f14/50b/a9ef1450bc06f07f89bb9ef7707a72ac.gif)
Сработало даже слишком хорошо, ибо перчатки были тоже красного цвета, но модель задетектив шорты благополучно обнаружила и отработала их перекрытие рукой.
![](https://habrastorage.org/getpro/habr/upload_files/fb9/687/f21/fb9687f21d62503fdc10e837f21738c2.png)
Это феноменально!
Примеры из других доменов
На гифке шуточный «тест на японскность»: человек должен пролезть в специальное отверстие внутри опоры храма. Входная точка: единственный клик на торчащих руках, после чего трекинг благополучно расширяет объект по мере его появления в кадре. Есть пара кадров, где уже можно было бы выделить голову, но это легко исправляется добавлением ключевого кадра с выделением ее.
10/10!
![](https://habrastorage.org/getpro/habr/upload_files/434/757/987/4347579870e54a3e3440c4cf5a69c840.gif)
Африка сломала SAM2. Я выбрал очень сложный объект — дорогу, причем без разделительных полос. И хотя ключевых кадров было достаточно, в какой-то момент трекинг стал терять ее на видео.
![](https://habrastorage.org/getpro/habr/upload_files/bed/1eb/16d/bed1eb16dd523917f14eedc88a102105.gif)
Пример скорее тоже экстремальный, так как чаще выделяют объекты, нежели объемную сложнейшую геометрию в кадре не при статической съемке.
![](https://habrastorage.org/getpro/habr/upload_files/f99/9af/85f/f999af85f77e027112cf766ca0c15a90.gif)
Добиться корректной работы так и не удалось, даже добавляя ключевые кадры много раз в следующих кадрах и выделяя на них дорогу.
Но вот основа линии электропередач (выделена оранжевым) отлично трекается на протяжении всего видео всего на трех ключевых кадрах на всей длине.
Едем дальше.
Мне хотелось понять как сработает трекинг на еде, которую покрывают густым соусом. Но все сработало так хорошо сразу, что даже как-то обидно.
![](https://habrastorage.org/getpro/habr/upload_files/157/474/e0f/157474e0f97f4a8f7200cc2190f8ddff.gif)
История с тем, что трекинг потерял африканскую дорогу натолкнула меня на идею попробовать найти артефакты в блоке памяти (memory bank), и я нашел его на другом африканском видео (уже не моем), но проверяя другую штуку.
Мне было интересно проверить как модель отрабатывает «облет» объекта с дрона, когда сильно меняется угол сьемки и сам объект.
Сам облет протрекан на ура, а вот артефакт — в конце.
![Зебры в Уганде Зебры в Уганде](https://habrastorage.org/getpro/habr/upload_files/3ac/0b2/31f/3ac0b231f856b3ede01648b5ffd21a69.gif)
Здесь есть проблема. Мы трекаем двух зебр и с ними все очень хорошо. Но затем кадр меняется и там бегут уже 5 зебр, причем две из них продолжают быть выделенными, хотя очевидно, что произошла смена сцены.
Похожи новые зебры на старых? Да. Но мы трекаем конкретные объекты, и здесь феноменальная способность модели к обобщению и запоминанию, которая так хорошо детектит перекрытие объекта или его уход из кадра, не заметила смену сцены и выделила там объекты не совсем корректно.
Как, кстати, вообще выделаются объекты на видео? Очень легко, ведь мы работаем со статическим кадром, а там под капотом SAM на максималках, и все вот реально в несколько кликов.
![](https://habrastorage.org/getpro/habr/upload_files/d7c/6f2/c5c/d7c6f2c5ce20b086e4f026608e6ed500.gif)
Так как первый SAM не очень эффективно себя показал на частях лица на фото в не самом хорошем качестве, было очень интересно как покажет себя SAM2.
Давайте попробуем затрекать объекты «волосы», «рот» и «глаз».
![](https://habrastorage.org/getpro/habr/upload_files/426/0ed/fa5/4260edfa5aef6689f6bac0f3cac640d7.gif)
Сложнейшая шевелюра босса SAM2 — супер в порядке! Рот — с косячками, глаза — что-то не то.
Похоже, у него либо встроенная защита от AI, либо слухи про него не слухи вовсе!
![Усы Цукерберга Усы Цукерберга](https://habrastorage.org/getpro/habr/upload_files/288/5e2/0a3/2885e20a3964f4f3cadf5b5d3bab1257.png)
![Странный трекинг глаза Странный трекинг глаза](https://habrastorage.org/getpro/habr/upload_files/ea5/53b/336/ea553b336a71beaba3f84504ab726d15.gif)
Подведение итогов и выводы
SAM2 безумно хорош и все примеры, где он работает не очень хорошо — скорее специфика или просто сложные случаи, которые неправильно ожидать от модели, закрывающей процентов 70% случаев zero-shot.
Так для чего SAM2 безумно хорош?
Во-первых, «segment» в названии модели не просто так. Как по мне, одно из самых прямых назначений этой модели — это значительное ускорение именно разметки. С SAM2 можно насегментировать чего угодно, после чего построить конкретную технологию под свои нужды. Сферы применений здесь — вообще все, где требуется сегментация видео.
SAM2 однозначно поменяет подход к разметке видео, потому что, если честно, после допилки напильничком под себя не совсем понятно зачем делать разметку по другому. Пока это гипотеза, но мы однозначно будем это тестировать, потому что модель чудо как хороша.
Во-вторых, трекинг у модели великолепный, но он требует немного ресурсов и немного времени. Модель очень хорошо умеет отделять самые сложные объекты от фона. В реалтайм с принятием каких-то решений, наверное, модель затаскивать смысла нет , но вот все связанное с толерантным отношением к задержкам в обработке (легкими в несколько секунд или вообще отложенными) — скорее всего зайдет на ура даже в чистом виде.
Примерный пласт таких задач — постобработка видео для развлекательных целей (наложение клевых эффектов на интересный повтор в спорте, например), бьютификация видосиков для соцсетей и немного genAi.
Штука крутая.
Спасибо!
Если вам понравилась статья, то н̶а̶к̶и̶д̶а̶й̶т̶е̶ ̶п̶л̶ю̶с̶и̶к̶о̶в̶ ̶я̶ ̶с̶т̶а̶р̶а̶л̶с̶я̶ предлагаю прочитать мои предыдущие:
Приключение SAM в Японии или как компьютерное зрение видит гейшу
AI-тренер, нейровоспитатель, ассесор, крауд и разметчик — кто все эти люди и в чем разница?
Офис Apple в Москве: как я с нуля стал экспертом и попал на приватную вечеринку для разработчиков